你知道都有哪些I/O模型吗?

系列文章

创作不易,如果对您有帮助,麻烦辛苦下小手点个关注,有任何问题都可以私信交流哈。
祝您虎年虎虎生威。

Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作被调用内核提供的系统命令,返回一个file descriptor(fd ,文件描述符)。

对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)

UNIX提供了5种I/O模型,分别如下:

阻塞I/O模型

最常见的I/O模型就是阻塞I/O迷行,缺省情形下, 所有的文件操作都是阻塞的,以套接字接口为例来讲解此模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型
在这里插入图片描述

非阻塞I/O模型

recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,返回后用户线程获得足够的CPU时间继续做其他的事情,第一阶段用户进程不是阻塞的,需要不断的主动询问kernal数据好了没有;第二个阶段总是阻塞的。

在这里插入图片描述

I/O复用模型

Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以帮我们侦测多个fd是否处于就绪状态。
select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。Linux还提供了一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高,当有fd就绪时,就立即回调函数rollback。
在这里插入图片描述



select/poll | epoll对比的缺点:

  • 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;epoll通过内核和用户空间共享同一块内存来避免fd集合的拷贝
  • 每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大;epoll通过“活跃”socket回调来解决遍历所有socket fd问题
  • 支持一个进程打开的fd太少了,由FD_SETSIZE设置,默认值是1024;epoll没有这个限制,它所支持的fd上限是操作系统的最大文件句柄数,这个数字远大于1024

信号驱动I/O模型

首先开启套接字信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞的)。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据。
在这里插入图片描述

异步I/O

告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型**与信号驱动模型的主要区别是:**信号驱动I/O由内核通知我们何时开业开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时完成。
在这里插入图片描述


大家好,我是壹氿,感谢各位小伙伴点赞、收藏和评论,文章持续更新,我们下期再见!
也可以加我的个人VX交流沟通:lhj502819,一起努力冲击大厂,另外有很多学习以及面试的材料提供给大家。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹氿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值