I/O模型
对于一次输入操作,它会经历两个阶段:
等待数据准备好。(等待数据从网络中到达,然后数据被复制到内核的缓冲区中)
将数据从内核拷贝到进程中。(把数据从内核缓冲区复制到进程缓冲区中)
Unix下可用的5中I/O模型:
阻塞 I/O(blocking IO)
非阻塞 I/O(nonblocking IO)
I/O 多路复用( IO multiplexing)
信号驱动 I/O( signal driven IO)
异步 I/O(asynchronous IO)
前4个模型都属于同步I/O
详解:https://zhuanlan.zhihu.com/p/27382996
阻塞 I/O模型:
默认情况下所有的套接字都是阻塞的。
进程调用了recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。
进程从开始调用recvfrom到它返回的整段时间是阻塞的。
非阻塞 I/O模型:
当用户进程发出read操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个错误。
应用进程持续轮询内核,以查看某个操作是否就绪。
I/O多路复用模型:
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。
异步I/O模型:
告知内核启动某个操作,并让内核在整个操作完成后通知我们。
用户进程发起read操作之后,立刻就可以开始去做其它的事。
阻塞式I/O和非阻塞式I/O的区别:
阻塞式I/O:两个阶段的操作都会阻塞。
非阻塞式I/O:数据还在准备的时候,会立即返回,复制数据的时候才阻塞。