I/O模型详解

一、前置知识:

为了确保操作系统的安全稳定运行,操作系统启动后,将会开启保护模式:将内存分为内核空间和用户空间,进行内存隔离。

应用进程运行在用户空间;内核进程运行在内核空间。

用户空间无法直接操作内核空间,只能通过操作系统向外提供的API,发起系统调用。

所以应用进程并不能像操作系统内核一样直接进行I/O操作,而是通过向内核发起系统调用完成对I/O的间接访问,一次IO操作实际包含两个阶段:

  1. IO调用阶段:应用程序进程向内核发起系统调用
  2. IO执行阶段:内核执行IO操作并返回
    2.1. 准备数据阶段:内核等待I/O设备准备好数据
    2.2. 拷贝数据阶段:将数据从内核缓冲区拷贝到用户空间缓冲区

I/O模型详解

二、IO模型

 BIO

应用程序中进程在发起IO调用后至内核执行IO操作返回结果之前,若发起系统调用的线程一直处于等待状态,则此次IO操作为阻塞IO。

I/O模型详解

NIO

用户进程在发起系统调用时指定为非阻塞,内核接收到请求后,就会立即返回,然后用户进程通过轮询的方式来拉取处理结果。

I/O模型详解

IO多路复用 

1、select/poll

Select是内核提供的系统调用,它支持一次查询多个系统调用的可用状态,当任意一个结果状态可用时就会返回,用户进程再发起一次系统调用进行数据读取。

I/O模型详解

select有一个限制,就是存在连接数限制,针对于此,又提出了poll。其与select相比,主要是解决了连接限制

fd集合拷贝到内核空间,内核循环遍历IO状态。

2、epoll

epoll是为了减少内核重复无效的循环遍历,基于事件驱动来实现。

epoll相较于select/poll,多了两次系统调用,其中epoll_create建立与内核的连接,epoll_ctl注册事件,epoll_wait阻塞用户进程,等待IO事件。

I/O模型详解

信号驱动IO

当用户进程需要等待数据的时候,会向内核发送一个信号,告诉内核我要什么数据,然后用户进程就继续做别的事情去了,而当内核中的数据准备好之后,内核立马发给用户进程一个信号,说”数据准备好了,快来查收“,用户进程收到信号之后,立马调用recvfrom,去查收数据。

信号驱动IO与BIO和NIO最大的区别就在于,在IO执行的数据准备阶段,不会阻塞用户进程。

I/O模型详解

AIO

用户进程发出系统调用后立即返回,内核等待数据准备完成,然后将数据拷贝到用户进程缓冲区,最后发送信号告诉用户进程IO操作执行完毕(与SIGIO相比,一个是发送信号告诉用户进程数据准备完毕,一个是IO执行完毕)

I/O模型详解

三、Java中的BIO 、NIO和AIO

参考:https://www.cnblogs.com/sheng-jie/p/how-much-you-know-about-io-models.html

上一篇:FtpCopy数据定时自动备份软件(FTP定时备份)


下一篇:红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)丨epoll丨c/c++linux服务器开发丨linux后台开发