IO模型
区分
一个输入操作通常包括两个阶段:
等待数据准备好
从
内核向进程复制数据
对于一个套接字上的输入操作,第一步通常涉及等待网络数据从网络到达。当所等待数据到达后,它被复制到内核中的某个缓冲区。第二部就是把数据从内核缓冲区复制到应用进程缓冲区。
同步IO和
异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求过程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
阻塞IO和非阻塞IO的区别在第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
阻塞式IO
应用进程被阻塞,知道数据复制到应用进程缓冲区才返回。在阻塞过程中,其他程序还可以执行,因此阻塞并不意味着整个操作系统被阻塞。因为其他程序还可以运行,因此不消耗CPU时间,这种模型的CPU利用率会比较高。
非阻塞IO
应用程序执行系统调用之后,内核返回一个
错误码。应用程序还可以继续运行,但是需要不断的执行系统调用来获知IO是否完成,这种方式成为轮询。
由于CPU要处理更多的系统调用,因此这种模型的CPU利用率比较低。
IO复用
使用select或者poll等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后使用recvfrom把数据从内核复制到进程中。
它可以让但个进程具有处理多个I/O事件的能力,又被称为Event Driven IO,即事件驱动IO。
信号驱动IO
应用进程使用sigaction系统调用,内核立即被返回,应用进程可以继续执行,也就是说等待数据阶段应用程序时非阻塞的。内核在数据到达时向应用进程发送SIGIO信号,应用进程收到之后在信号处理程序中调用recvfrom将数据从内核中复制到应用进程。
相比于非阻塞IO的轮询方式,信号驱动I/O的CPU利用率更高。
异步IO
应用进程执行aio_read系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。
异步IO与信号驱动IO的区别在于,异步IO的信号是通知应用进程IO完成,而驱动IO的信号是通知应用程序可以开始IO。
以上就是常见的五种IO模型介绍,需要图解或详细教学的可以私信或评论联系我。