Linux 5种IO模型

1.BIO:(同步阻塞IO)

IO的本质是socket的读取,数据先拷贝到内核的缓冲区中,然后拷贝到应用程序的地址空间(进程)

(1)过程

 当用户进程进行系统调用时,内核就开始了I/O的第一个阶段,
 准备数据到缓冲区中,当数据都准备完成后,
 则将数据从内核缓冲区中拷贝到用户进程的内存中,
 这时用户进程才解除block的状态重新运行。

(2)特点:

BIO在这两个阶段都被 block了

 能够及时返回数据,性能下降

2.NIO:(同步非阻塞IO)

(1)过程

 用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,
 但是在第一个阶段中,用户进程需要盲等,不停的去轮询内核,看数据是否准备好了

(2)特点

NIO是在I/O执行的第二个阶段(数据复制)被block了
而第一个阶段并未阻塞(数据准备)。

 拷贝数据的整个过程,进程仍然是阻塞的
 需要不断询问数据是否准备好了
 能够在等待任务完成的过程中处理其他事件
 由于需要轮询,所以延迟会增加

3.多路复用IO

(1)过程

    在I/O复用模型中,由于同步非阻塞方式需要不断主动轮询,
    轮询占据了很大一部分过程,轮询会消耗大量的CPU时间,
    而 “后台” 可能有多个任务在同时进行,

    如果循环查询多个任务的完成状态,只要有任何一个任务完成,就去处理它。
    轮询不是进程的用户态。这时 “IO 多路复用”就出现了。
    即UNIX/Linux 的 select、poll、epoll,

    IO多路复用是阻塞在select,epoll这样的系统调用之上,
    而没有阻塞在真正的I/O系统调用如recvfrom之上。

    从整个IO过程来看,他们都是顺序执行的,因此可以归为同步模型(synchronous)。
    都是进程主动等待且向内核检查状态

多路复用I/O执行的两个阶段用户进程都是阻塞的,但是两个阶段是独立的

(2)特点

    select/poll调用后会阻塞进程,但可以同时阻塞多个IO事件操作(文件描述符),
    有数据可读或可写(就绪事件),就通知用户进程。

    select 需要每次注册事件(无差别轮询),而epoll不需要每次注册事件(没有轮询),poll和select相似,但没有最大连接数限制

    IO多路复用阻塞在select/epoll的系统调用之上的,
    而真正的IO系统调用如recvfrom是非阻塞的

4.信号驱动IO

(1)过程

   只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。
   该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。
   该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,
   二为边缘触发,即只通知一次。

信号驱动I/O执行的第一阶段不阻塞,而第二阶段是阻塞的。

5.AIO:(异步IO)

(1)过程

      在该模型中,当用户进程发起系统调用后,立刻就可以开始去做其它的事情,
      然后直到I/O执行的两个阶段都完成之后,内核会给用户进程发送通知,
      告诉用户进程操作已经完成了。

两个阶段都不会阻塞
(2)特点

      读写操作由内核完成,完成后内核将数据放到指定的缓冲区,通知应用程序来取

6.总结

      阻塞IO和非阻塞IO的区别:数据准备的过程中,进程是否阻塞。

      同步IO和异步IO的区别:数据拷贝的过程中,进程是否阻塞。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值