I/O模型

I/O模型

标签(空格分隔): 计算机网络


1. 五大I/O模型

一个套接字输入操作包含两个阶段:

  • 等待数据准备好(从网络中到达TCP缓存)
  • 将数据从内容复制到用户进程(从接收的内核数据复制到进程缓冲区中)

1.1 同步阻塞I/O

revfrom调用,进程阻塞,等待数据准备好为阻塞,将数据复制到进程为阻塞,直到结束才返回。
第一阶段阻塞,第二阶段同步。
IOModle-1.png-28kB

1.2 同步非阻塞I/O

revfrom调用,内核返回一个错误码表示数据还未准备好,过段时间再调用直到数据准备就绪,将数据从内核复制到进程为阻塞,结束时返回。
第一阶段非阻塞,第二阶段同步。

IOModle-2.png-47kB

1.3 I/O复用

用select、poll、epoll等待数据准备就绪,在数据准备就绪时进行recvfrom系统调用,将数据从内核复制到进程为阻塞,结束时返回。
后面详细讲。
IOModle-3.png-43kB

1.4 信号驱动模型

sigaction系统调用,内核立即返回,进程可以继续执行,直到数据准备就绪时给进程一个信号,进程便进行revfrom系统调用,将数据从内核复制到进程为阻塞,结束时返回。
第一阶段非阻塞,第二阶段同步。

IOModle-4.png-41kB

1.5 异步I/O

aio_read调用内核会立即返回,进程继续执行,不会被阻塞,而当数据准备好并也已经复制完毕时会向进程发送信号,整个过程非阻塞,异步。
第一阶段非阻塞,第二阶段异步。

IOModle-5.png-33kB

1.6 总结

IOModle-6.png-46kB


2. I/O复用模型

2.1 select、poll

2.1.1 select执行过程

select方法会阻塞进程,并将其注册的全部描述符从进程拷贝到内核中去,在注册的描述符中如果有事件触发则返回,返回中没有声明哪些描述符准备好了,返回值大于1时进程将轮询这些描述符找出I/O事件触发的描述符并对其进行处理。

2.1.2 poll执行过程

和select完全一致

2.1.3 select和poll的区别

  • select的描述符是用数组实现的,大小默认为1024,即能监听1024个描述符,如果要监听更多的话就需要修改数组大小并重新编译;epoll用链表实现,大小没有限制。

  • select的阻塞超时是ns单位,支持实时;poll则是ms

  • select支持的事件类型没有poll多,poll对描述符的重复利用比select高

  • select、poll本身是阻塞的,但是其注册描述符(套接字)不是阻塞的,如果阻塞则违背初衷,所以整个过程,还是阻塞的,只不过阻塞的对象不一样,第一阶段是select,第二阶段是recvfrom

2.2 epoll

2.2.1 执行过程

epoll_ctl()用于向内核注册新的描述符或者是改变某个文件描述符的状态,已注册的描述符在内核中会被维护在一棵红黑树上,通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理,进程调用epoll_wait()便可以得到事件完成的描述符。

2.2.2工作模式

LT 模式

当 epoll_wait() 检测到描述符事件到达时,将此事件通知进程,进程可以不立即处理该事件,下次调用 epoll_wait() 会再次通知进程。是默认的一种模式,并且同时支持 Blocking 和 No-Blocking。

ET 模式

和 LT 模式不同的是,通知之后进程必须立即处理事件,下次再调用 epoll_wait() 时不会再得到事件到达的通知。很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。只支持 No-Blocking,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

2.2.3 select、poll和epoll的区别

从执行过程的描述可以看出,epoll 只需要将描述符从进程缓冲区向内核缓冲区拷贝一次;并且进程不需要通过轮询来获得事件完成的描述符。

2.3 应用场景

2.3.1 select 应用场景

select 的 timeout 参数精度为 1ns,而 poll 和 epoll 为 1ms,因此 select 更加适用于实时性要求比较高的场景,比如核反应堆的控制。

2.3.2 poll 应用场景

poll 没有最大描述符数量的限制,如果平台支持并且对实时性要求不高,应该使用 poll 而不是 select。

2.3.3 epoll 应用场景

需要监控的描述符状态变化多,而且都是非常短暂的,也没有必要使用 epoll。因为 epoll 中的所有描述符都存储在内核中,造成每次需要对描述符的状态改变都需要通过 epoll_ctl() 进行系统调用,频繁系统调用降低效率。并且 epoll 的描述符存储在内核,不容易调试。

需要同时监控小于 1000 个描述符,就没有必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势。

3. 参考资料:

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务