java经常使用的IO模型

IO模型网络

区分
一个输入操做一般包括两个阶段:
等待数据准备好
从内核向进程复制数据
对于一个套接字上的输入操做,第一步一般涉及等待网络数据从网络到达。当所等待数据到达后,它被复制到内核中的某个缓冲区。第二部就是把数据从内核缓冲区复制到应用进程缓冲区。
同步IO和异步IO的区别就在于第二个步骤是否阻塞,若是实际的IO读写阻塞请求过程,那么就是同步IO,所以阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,若是不阻塞,而是操做系统帮你作完IO操做再将结果返回给你,那么就是异步IO。
阻塞IO和非阻塞IO的区别在第一步,发起IO请求是否会被阻塞,若是阻塞直到完成那么就是传统的阻塞IO,若是不阻塞,那么就是非阻塞IO。异步

阻塞式IO
应用进程被阻塞,知道数据复制到应用进程缓冲区才返回。在阻塞过程当中,其余程序还能够执行,所以阻塞并不意味着整个操做系统被阻塞。由于其余程序还能够运行,所以不消耗CPU时间,这种模型的CPU利用率会比较高。ide

非阻塞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模型介绍,须要图解或详细教学的能够私信或评论联系我。it

相关文章
相关标签/搜索