-
Notifications
You must be signed in to change notification settings - Fork 0
async_block
Xiaolin Zhang edited this page Nov 2, 2019
·
1 revision
一个IO包括两个阶段:
- 等待网络数据到达网卡并读取到内核缓冲区,数据准备好。
- 从内核缓冲区复制数据到进程空间。
这个时候
-
阻塞IO是操作发现缓冲区没有数据, 那就一直挂着等待有数据再返回用户态进程说可读/写了
-
非阻塞IO是指操作系统发现缓存区没有数据, 那就立刻返回. 等用户下一次过来问有没有数据准备好了
-
然后就发明了IO多路复用
一次可以委托操作系统监听多个
fd`这样用户API一次就能知道多个链接的状态. 既可以是阻塞的也可以是非阻塞的 -
信号通知更高级, 启用
socket
信号驱动之后, 注册一个用户态的处理函数, 如果socket状态改变了, 内核直接调用处理函数. 之前三种模式的检查不需要了. 这种模式既不阻塞还是异步的
上面这几种只是在等待数据的时候刷花样. 最终拿数据recvfrom
还是阻塞的, 因为要操作系统把一定有的数据从内核拷贝到用户态
读数据这个操作, 只有异步IO这个模型做到了非阻塞(通过异步的方式), 有数据直接拷贝到内核空间.
****阻塞**这个词是与系统调用 System Call 紧紧联系在一起的, 因为要让一个进程进入 等待(waiting) 的状态, 要么是它主动调用 wait() 或 sleep() 等挂起自己的操作, 另一种就是它调用 System Call, 而 System Call 因为涉及到了 I/O 操作, 不能立即完成, 于是内核就会先将该进程置为等待状态, 调度其他进程的运行, 等到 它所请求的 I/O 操作完成了以后, 再将其状态更改回 ready 。
异步与同步的区别就是主动与被动的区别.