论坛首页 Java企业应用论坛

同步/异步及阻塞/非阻塞

浏览 12783 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-08-08  
神之小丑 写道
http://www.ibm.com/developerworks/cn/linux/l-async/

LZ 可以看下这个文章,里面有下面几张图,我觉得挺形象的,

还有unix网络编程里 也有说同步和阻塞模型


好文章,正在看,谢谢!
0 请登录后投票
   发表时间: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可以是同步/异步的;


谁能说说阻塞/非阻塞的内部真正的实现机制呢?
我觉得是回调实现的(任务完成回调另一个任务通知),也可能是状态通知(轮询状态)。


0 请登录后投票
   发表时间:2013-08-08   最后修改:2013-08-08
读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了   ,理解这个问题,确实需要建立在对OS底层机制的了解上。
0 请登录后投票
   发表时间:2013-08-08  
个人认为。同步/异步。阻塞/非阻塞 不是一回事,修饰的对象不同。

阻塞/非阻塞,修饰的是进程/线程的等待方式,指当前进程/线程访问数据,如果还未就绪时,该进程/线程是否需要等待。比较微观,例如进程CPU操作。

同步/异步是指程序访问的机制,。比较宏观。
同步一般是指主动请求并等待操作完毕。这一操作里面,可以包含阻塞式访问和非阻塞式进程/线程访问数据。只是这一批阻塞/非阻塞完成任务的进程/线程,必须同时完成。

异步一般是指主动请求后,不等待操作完毕,可以做其他任务,至于异步执行的任务的目标进程/线程,可以采取阻塞或者非阻塞方式完成它的任务。
0 请登录后投票
   发表时间:2013-08-08  
stamen 写道
读了http://www.ibm.com/developerworks/cn/linux/l-async/ 豁然开朗了   ,理解这个问题,确实需要建立在对OS底层机制的了解上。



所以现在的 java nio  应该还是异步阻塞的I/O ,是底层用 I/O复用select模式做的吧,好像说 JDK7 里 有aio的实现,但是还没试验过。。。
0 请登录后投票
   发表时间: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不错的教程,感兴趣的可以下载看。
0 请登录后投票
   发表时间: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

0 请登录后投票
   发表时间:2013-08-09   最后修改:2013-08-09
重复,删除
0 请登录后投票
   发表时间: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本身还是非阻塞
0 请登录后投票
   发表时间: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的实现策略是不是只有“回调”呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics