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

img

一个IO包括两个阶段:

用户等待数据阶段

这个时候

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

用户读数据阶段

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

又到了下定义的时间

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

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