锁定老帖子 主题:同步/异步及阻塞/非阻塞
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-08-08
神之小丑 写道 http://www.ibm.com/developerworks/cn/linux/l-async/
LZ 可以看下这个文章,里面有下面几张图,我觉得挺形象的, 还有unix网络编程里 也有说同步和阻塞模型 好文章,正在看,谢谢! |
|
返回顶楼 | |
发表时间:2013-08-08
最后修改:2013-08-09
我之前好像也有误解,非阻塞是通过异步实现的(这个好上想想真不是);我的认识:
work 工作者 task 任务 resource 资源,即输入输出; 同步(大家在一个线程里) worker调用task时,必须等待task完成才能调用下一个; 此时是同步的;但task可以以阻塞/非阻塞的方式运行; 异步 worker调用task时,无需等待task完成才能调用下一个;(这个如果使用多线程的话,启动一个线程) 此时是异步的;但task可以以阻塞/非阻塞的方式运行; 阻塞(跟) worker调用task时,task需要资源;但此时资源没有就绪,必须等待; 此时是阻塞的;但task可以是同步/异步的; 非阻塞: worker调用task时,task需要资源但此时资源可能没有就绪,或task运行的较慢;注册个回调,当好了的时候通知我;或者通过状态通知; 此时是非阻塞的;但task可以是同步/异步的; 谁能说说阻塞/非阻塞的内部真正的实现机制呢? 我觉得是回调实现的(任务完成回调另一个任务通知),也可能是状态通知(轮询状态)。 |
|
返回顶楼 | |
发表时间:2013-08-08
最后修改:2013-08-08
读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
|
|
返回顶楼 | |
发表时间:2013-08-08
个人认为。同步/异步。阻塞/非阻塞 不是一回事,修饰的对象不同。
阻塞/非阻塞,修饰的是进程/线程的等待方式,指当前进程/线程访问数据,如果还未就绪时,该进程/线程是否需要等待。比较微观,例如进程CPU操作。 同步/异步是指程序访问的机制,。比较宏观。 同步一般是指主动请求并等待操作完毕。这一操作里面,可以包含阻塞式访问和非阻塞式进程/线程访问数据。只是这一批阻塞/非阻塞完成任务的进程/线程,必须同时完成。 异步一般是指主动请求后,不等待操作完毕,可以做其他任务,至于异步执行的任务的目标进程/线程,可以采取阻塞或者非阻塞方式完成它的任务。 |
|
返回顶楼 | |
发表时间:2013-08-08
stamen 写道 读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
所以现在的 java nio 应该还是异步阻塞的I/O ,是底层用 I/O复用select模式做的吧,好像说 JDK7 里 有aio的实现,但是还没试验过。。。 |
|
返回顶楼 | |
发表时间:2013-08-08
神之小丑 写道 stamen 写道 读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
所以现在的 java nio 应该还是异步阻塞的I/O ,是底层用 I/O复用select模式做的吧,好像说 JDK7 里 有aio的实现,但是还没试验过。。。 在NIO之前,你只能用阻塞的IO,而NIO冲破了这个限制,可以使用非阻塞的IO,所以你刚好说反了。呵呵。 附件是java.nio不错的教程,感兴趣的可以下载看。 |
|
返回顶楼 | |
发表时间:2013-08-09
最后修改:2013-08-09
stamen 写道 读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
仔细看了下 http://www.ibm.com/developerworks/cn/linux/l-async/ 异步阻塞 I/O 按照《UNIX网络编程——I/O复用:select和poll函数》的说法select/poll都是阻塞用户进程;应该是同步的非阻塞IO吧? http://tech.ddvip.com/2013-07/1374770280199663.html |
|
返回顶楼 | |
发表时间:2013-08-09
最后修改:2013-08-09
重复,删除
|
|
返回顶楼 | |
发表时间:2013-08-09
最后修改:2013-08-09
、
stamen 写道 神之小丑 写道 stamen 写道 读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
所以现在的 java nio 应该还是异步阻塞的I/O ,是底层用 I/O复用select模式做的吧,好像说 JDK7 里 有aio的实现,但是还没试验过。。。 在NIO之前,你只能用阻塞的IO,而NIO冲破了这个限制,可以使用非阻塞的IO,所以你刚好说反了。呵呵。 附件是java.nio不错的教程,感兴趣的可以下载看。 nio实现了非阻塞的IO,实际的编程又分为异步阻塞的和同步非阻塞两种。这两种所说的阻塞根本是不是同一个东西。 后者所说的非阻塞,是指非阻塞的IO;而前者的异步阻塞,却是指阻塞的select,其io本身还是非阻塞 |
|
返回顶楼 | |
发表时间:2013-08-10
最后修改:2013-08-10
hardPass 写道 、
stamen 写道 神之小丑 写道 stamen 写道 读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了 ,理解这个问题,确实需要建立在对OS底层机制的了解上。
所以现在的 java nio 应该还是异步阻塞的I/O ,是底层用 I/O复用select模式做的吧,好像说 JDK7 里 有aio的实现,但是还没试验过。。。 在NIO之前,你只能用阻塞的IO,而NIO冲破了这个限制,可以使用非阻塞的IO,所以你刚好说反了。呵呵。 附件是java.nio不错的教程,感兴趣的可以下载看。 nio实现了非阻塞的IO,实际的编程又分为异步阻塞的和同步非阻塞两种。这两种所说的阻塞根本是不是同一个东西。 后者所说的非阻塞,是指非阻塞的IO;而前者的异步阻塞,却是指阻塞的select,其io本身还是非阻塞 我参考下这两文章 http://xmuzyq.iteye.com/blog/783218 和 http://tech.ddvip.com/2013-07/1374770280199663.html 狂放不羁 引用 什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知
狂放不羁 引用 而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
同步/异步都是针对应用程序和内核的交互而言的, 按照如上说法,select/poll,是同步,但IO是非阻塞的。 按照定义的话应该还是同步非阻塞IO; hardPass 引用 而前者的异步阻塞,却是指阻塞的select
不过意思是明白,根据同步和异步是针对应用程序和内核的交互而言的,这个说法是不是有点相悖呢? 而且 http://www.artima.com/articles/io_design_patterns.html 也提到了 引用 System I/O can be blocking, or non-blocking synchronous, or non-blocking asynchronous
阻塞型、非阻塞同步、或非阻塞异步。 还有个疑问:异步IO的实现策略是不是只有“回调”呢? |
|
返回顶楼 | |