Linux Network Notes
I/O模型⌗
阻塞I/O Blocking I/O
非阻塞I/O Nonblocking I/O
Linux 下,我们可以通过 fcntl
系统调用来设置 O_NONBLOCK
标志位,从而把 socket 设置成 Non-blocking。
当用户进程发出 read 操作时,如果 kernel 中的数据还没有准备好,那么它并不会 block 用户进程,而是立刻返回一个 EAGAIN error。从用户进程角度讲 ,它发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个 error 时,它就知道数据还没有准备好,于是它可以再次发送 read 操作。一旦 kernel 中的数据准备好了,并且又再次收到了用户进程的 system call,那么它马上就将数据拷贝到了用户内存,然后返回。
所以,Non-blocking I/O 的特点是用户进程需要不断的主动询问 kernel 数据好了没有
I/O多路复用 I/O multiplexing⌗
I/O多路复用就是 select/poll/epoll 等多路选择器:支持单一线程同时监听多个文件描述符,阻塞等待,并在其中某个文件描述符文可读写时收到通知。
本质上复用的是线程,让一个thread of control能够处理多个连接(I/O事件)
信号驱动I/O Signal drivern I/O⌗
异步I/O Asynchronous I/O⌗
Read other posts