Linux的5种IO模型

本文深入解析Linux下的五种IO模型:阻塞IO、非阻塞IO、信号驱动IO、多路复用IO和异步IO。通过生动的例子,如洗衣服比喻,帮助读者理解各种IO模型的工作流程及优缺点。

Linux5种IO模型

在讲解具体的IO模型之前,需要知道Linux的IO大致过程分为两步:第一步,程序发送IO请求,等待数据准备阶段;第二步,数据准备完成开始IO传输有内核空间到应用进程空间。

阻塞IO:

阻塞IO即一般的IO过程。IO线程发送recvfrom指令到Linux内核,内核开始准备数据,这一段时间线程阻塞,等到数据准备完成,开始IO传输然后将数据返回给应用,这一段时间IO线程都是阻塞的。
比较通俗的例子:你去洗衣服,把衣服放进洗衣机,然后站在旁边等洗衣机洗好,然后拿起衣服晾到阳台。你在这个过程中没干别的事,就在旁边等着然后自己把衣服晾了。

非阻塞IO

非阻塞IO具体过程相比阻塞IO,在数据准备阶段非阻塞,具体IO的过程是:IO线程发送recvfrom指令到Linux内核,内核收到指令后快速返回,并开始准备数据,线程定时问询内核数据是否准备完成,如果数据没有完成, 则返回,直到数据准备完成, 这一阶段是非阻塞的。当数据准备完成,开始IO传输然后拷贝到应用内存,可这一阶段仍然是阻塞的。
这一过程好比:你把衣服放进洗衣机,然后去客厅打游戏,然后定时回来看一下衣服洗完没,如果没有洗完,就回去继续打游戏,如果已经洗完,那么把衣服拿到阳台晾起来。

信号驱动IO

信号驱动IO相对非阻塞IO,其在数据准备完成时,通过系统的SIGIO信号机制,通知应用程序,数据准备完成,应用程序收到信号后,让IO线程完成数据传输由内核空间到应用缓存空间过程。信号驱动IO模型在IO第一阶段是非阻塞的,在第二阶段仍然是阻塞的
这一过程可以理解为:你把衣服放进洗衣机后,跑去客厅打游戏了,然后听到洗衣机洗完后播放的音乐,这个时候你才去把衣服拿到阳台上去晾起来。

实际开发中,很少用到信号驱动IO模型,主要原因是对于流式套接字来说,很多情况可以导致SIGIO产生,而应用无法区分具体是什么情况导致的SIGIO信号。例如:完成连接请求,收到断连请求,断连完成,套接字收到数据,套接字发出数据都会发出SIGIO信号到应用

多路复用IO

多路复用IO在实际开发中应用最为广泛,Netty框架也是基于IO模型多路复用IO实现,具体多路复用IO可以分为以下几种:

  • select:
    基于系统select指令,具体过程是:Linux系统监听IO的fd(linux系统的IO表现为一个文件,fd指FileDescription文件描述符),具体包括writefds,readfds,exceptfds。应用程序发送select指令到内核,这一阶段会阻塞,直到由fd为可读,可写或异常或超时就会返回,select正常返回后,将进程io的fd拷贝到内核中,内核遍历整个fdset,找到进程已经就绪io的fds,然后进行对应的IO操作
    这一过程主要有三个缺点:
    1.需要将进程的fd拷贝到内核中
    2.需要遍历整个fdset
    3.单个进程存在最大fd数量限制(可以通过设置linux参数解决)
  • poll:
    整个过程跟select基本一致,但是不存在单个进程的最大fd数量限制,主要原理时用链表存储,fd没有限制,且相比select,poll对文件描述符的处理,不会像select的每次返回,都会清空rd_set,再加入fd,poll利用结构体poll_fd的events域和revents域在响应时被设置的状态来判定响应的fd。
    poll模型也同样存在用户态到内核态的fd拷贝以及遍历问题
  • epoll:
    epoll模型基于事件驱动,在调用epoll_create()时,会创建一颗存储fd的B+树,通过epoll_ctl()新增删除修改节点,并绑定回调函数,通过epoll_wait()回调后,开始做相应IO操作。
异步IO

也就是AIO,异步IO类似于,用户进程发送指令到内核,内核自己完成数据准备阶段和数据传输阶段,用户进程不用做操作,数据最后发送到用户进程空间。
Netty取消支持AIO,主要原因是:实际使用过程中,其性能并不比多路复用的epoll高多少,而且新增不必要的线程模型。也就是性价比不高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值