UNIX五种IO模型理解

以下以读数据为例,写数据同理。

读数据的两个阶段

读数据有两个阶段:

①内核中有数据可读;(下文称为第一阶段)

②数据从内核缓冲区拷贝到用户缓冲区。(下文称为第二阶段)

五种IO模型

UNP中提到的五种IO模型:读数据以recvfrom为例。

①阻塞式IO模型:

      fd设置为阻塞,调用recvfrom函数时,recvfrom函数会一直阻塞,直到第二阶段达成才会返回;

②非阻塞式IO模型:

      fd设置为非阻塞,调用recvfrom函数时,recvfrom函数不会阻塞立刻返回,如果此时第一阶段未达成,那么就会返回错误(如EAGAIN、EWOULDBLOCK);如果第一阶段达成(即内核中有数据可读),那么就会阻塞,直到第二阶段完成再返回

③IO复用模型:

      不会阻塞在recvfrom这样的函数上,而是阻塞在select/poll/epoll这样的函数上,直到监听的描述符集中有描述符达成第一阶段,select/poll/epoll才会返回,此时的返回只是说明有描述符达到第一阶段了,此时还需要再调用recvfrom这样的函数去完成第二阶段,在第二阶段完成过程中,线程是阻塞的。

       与阻塞式IO模型相比,IO复用模型需要多调用一个select/poll/epoll函数,但是能同时监听多个文件描述符,而阻塞式IO模型则不能;

④信号驱动式IO模型:

       注册一个信号处理函数,当监听的文件描述符达成第一阶段时,内核就会传递SIGIO信号来触发信号处理函数,此时需要在信号处理函数中调用recvfrom这样的函数来完成第二阶段,同样,执行第二阶段的过程也是阻塞的;

⑤异步IO模型:

       需要指明用户缓冲区和sigevent结构体等信息,当监听的文件描述符第一阶段和第二阶段都达成时,内核会传递sigevent所指定的信号来通知你,上述的两个阶段都已经完成了。

       与信号驱动式IO模型相比,异步IO模型被通知的时候,两个阶段都已经完成了,而信号驱动式IO模型则是第一个阶段达成时通知,真正的IO操作recvfrom还需要另行调用。

同步IO与异步IO

       将读数据分成两个阶段,有助于区分同步IO和异步IO的区别。

       上述5种IO模型,前面4种都属于同步IO,只有第5种属于异步IO。

       同步IO与异步IO的区别,在于是否需要阻塞去执行第二阶段。如上面所述,前面4种IO模型,都需要另行调用recvfrom函数来完成第二阶段,把数据从内核缓冲区拷贝到用户缓冲区,调用线程在调用recvfrom函数时也会阻塞,等待第二阶段达成。而第5种异步IO模型,无需另行调用来完成第二阶段,当被通知时,第二阶段已经由内核完成了。同步IO还是需要当前线程去完成第二阶段,而异步IO则不用。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值