Skip to content

async_block

Xiaolin Zhang edited this page Nov 2, 2019 · 1 revision

阻塞和非阻塞, 异步和同步IO, IO复用

img

一个IO包括两个阶段:

  • 等待网络数据到达网卡并读取到内核缓冲区,数据准备好。
  • 从内核缓冲区复制数据到进程空间。

用户等待数据阶段

这个时候

  • 阻塞IO是操作发现缓冲区没有数据, 那就一直挂着等待有数据再返回用户态进程说可读/写了

  • 非阻塞IO是指操作系统发现缓存区没有数据, 那就立刻返回. 等用户下一次过来问有没有数据准备好了

  • 然后就发明了IO多路复用 一次可以委托操作系统监听多个fd`这样用户API一次就能知道多个链接的状态. 既可以是阻塞的也可以是非阻塞的

  • 信号通知更高级, 启用socket信号驱动之后, 注册一个用户态的处理函数, 如果socket状态改变了, 内核直接调用处理函数. 之前三种模式的检查不需要了. 这种模式既不阻塞还是异步的

上面这几种只是在等待数据的时候刷花样. 最终拿数据recvfrom还是阻塞的, 因为要操作系统把一定有的数据从内核拷贝到用户态

用户读数据阶段

读数据这个操作, 只有异步IO这个模型做到了非阻塞(通过异步的方式), 有数据直接拷贝到内核空间.

又到了下定义的时间

****阻塞**这个词是与系统调用 System Call 紧紧联系在一起的, 因为要让一个进程进入 等待(waiting) 的状态, 要么是它主动调用 wait() 或 sleep() 等挂起自己的操作, 另一种就是它调用 System Call, 而 System Call 因为涉及到了 I/O 操作, 不能立即完成, 于是内核就会先将该进程置为等待状态, 调度其他进程的运行, 等到 它所请求的 I/O 操作完成了以后, 再将其状态更改回 ready 。

异步与同步的区别就是主动与被动的区别.

Clone this wiki locally