阻塞I/O模型和非阻塞I/O模型
每个连接都存在这样的readbuffer和writebuffer。
阻塞I/O模型
read的时候看readbuffer里面是否有数据,有数据说明已经准备好了,数据准备阶段就绪。如果readbuffer中没有数据,则说明数据没有准备好,需要阻塞等待。准备结束后进入数据拷贝阶段,将数据从内核空间拷贝到用户空间,完成数据拷贝阶段。
write的时候看writebuffer中的数据是否已满,数据满的时候说明数据还没准备好,需要阻塞等待writebuffer中有可写的空间,此时数据准备阶段完成。将数据从用户空间拷贝到内核空间完成数据拷贝阶段。
非阻塞I/O模型
非阻塞I/O模型在数据准备阶段是非阻塞的,如果数据没有准备好,则直接返回。
数据未准备就绪阶段,返回-1并且返回错误号EAGAIN EWOULDBLOCK
数据拷贝阶段,返回读到的数据大小
总结:
两种模型在数据拷贝阶段都是相同的都需要阻塞等待数据拷贝的完成;但是非阻塞I/O模型在数据准备阶段会立刻返回,而阻塞模型若数据没准备好,则会一直阻塞等待。