Linux_I/O模型
I/O模型(I/O Models) 阻塞式I/O(blocking I/O) 非阻塞式I/O(nonblocking I/O) I/O多路复用(I/O multiplexing) 信号驱动I/O(signal driven I/O) 异步I/O(asynchronous I/O) 对于一个network I/O涉及两个系统对象,一个是调用I/O的进程(process),另一个是系统内核(kernel)。 下面用read操作来当做例子,当一个read操作发生时涉及的两个步骤: 等待内核将数据准备好 内核将准备好的数据拷贝到进程,也就是从kernel space拷贝到user space 对于一个socket的read操作,第一步通常是等待网络数据。当包到达时,会先拷贝到内核的内存中。然后第二步,把数据从内核的缓冲区拷贝到应用程序的缓冲区。 阻塞式I/O(blocking I/O) 姜太公钓鱼,愿者上钩。鱼竿丢下去,就等到鱼上来,啥事不干,啥事也干不了。 当应用程序调用recvfrom这个system call,kernel只有等到准备好数据,把数据拷贝到应用程序的缓冲区,才会返回。应用程序在调用recvfrom后,如果kernel没有准备好数据,会被“睡觉”。进程一直阻塞着,在呼叫recvfrom这个system call之后,直到kernel返回数据,或者错误。 blocking