text 同步,异步,阻塞,非阻塞

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text 同步,异步,阻塞,非阻塞相关的知识,希望对你有一定的参考价值。

(同步)阻塞IO

![阻塞IO](http://image.congyh.com/18-8-6/65996859.jpg)

(同步)非阻塞IO

![非阻塞IO](http://image.congyh.com/18-8-6/59236298.jpg)

(同步)阻塞IO之 IO多路复用

![IO多路复用](http://image.congyh.com/18-8-6/86059294.jpg)

异步IO

![异步IO](http://image.congyh.com/18-8-6/73959393.jpg)
在讨论同步异步的时候, 要区分是讨论编程模式还是IO操作. 也就是需要考虑是在哪个层面上的同步异步.
 
在IO操作中, 分为同步IO和异步IO两种.
 
- 同步IO是通过CPU进行IO操作, 会消耗CPU(注意: 并不是说同步IO是CPU密集型任务, 因为IO分为两个阶段, 等待就绪和操作阶段, 等待就绪阶段通常是很耗时的)
- 异步IO是通过外围设备支持的直接读写, 本身不消耗CPU, 依赖中断等方式来通知CPU读写完成.
==========
从广义编程上而言,  同步异步指的是:
 
- 同步: 通常指串行编程(同步IO基本上和串行编程相似), 线程同步就是多个线程需要有一个全局一致的点.
- 异步:
  - 回调(异步IO实际上类似就是回调)
  - 事件监听
  - 发布/订阅 等
参考链接: http://blog.51cto.com/yaocoder/1308899

I/O操作有两阶段:
- 等待就绪阶段(不消耗CPU)
- 操作阶段(同步IO消耗CPU, 异步IO不消耗)
阻塞非阻塞指的是等待就绪阶段是否可以立即返回.
- 阻塞IO: 指定了要读取多少字节, 必须阻塞到有这些字节了才能一次性返回
- 非阻塞IO: 不指定要读取多少字节, 在调用的时候有多少字节返回多少, 靠后期进行组装.
对于阻塞IO(BIO)而言, 由于socket.accept(), socket.read(), socket.write()等主要函数是阻塞的. 所以在处理I/O任务的时候, 线程始终无法被释放, 所以是一种每线程每连接的模型.
 
在现代网络编程中, 通常搭配事件轮询使用, 使用一个线程通过while True去不断遍历fd_set, 找到就绪的IO事件. 然后进行读写. 实际上是一个单线程事件驱动模型, 将BIO的每线程阻塞变为了单线程阻塞. 减少了需要的线程数量.(实际上是改变了阻塞的点而已)
 
========
综上, IO主要分为三种方式:
 
- 同步阻塞
- 同步非阻塞(通常使用IO多路复用的方式, 也就是select, epoll这样的系统调用, 实际上是改变了阻塞的点而已)
- 异步非阻塞

以上是关于text 同步,异步,阻塞,非阻塞的主要内容,如果未能解决你的问题,请参考以下文章

同步阻塞同步非阻塞异步阻塞异步非阻塞--简明介绍

并行,并发,串行,同步,异步,阻塞,非阻塞,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

同步异步、阻塞非阻塞、Netty

同步/异步和阻塞/非阻塞

同步异步阻塞和非阻塞

正确理解同步/异步和阻塞/非阻塞的区别: