常见的五种IO模型

常见的五种IO模型

一个通俗的例子

  1. 阻塞IO:你想喝水,用水壶自己烧水,需要自己盯着;烧开了需要自己倒在杯子里
  2. 非阻塞IO:你想喝水,用水壶自己烧水,烧上之后就去忙别的事情了,然后等2分钟回来看看有没有烧开;烧开了需要自己倒在杯子里
  3. IO多路复用:你想喝水,你找了一个专门烧水的人给你烧水,他会给很多人烧水。你说我想烧水,他就给你烧上,你就可以去忙别的事情了;烧开了他就会打电话通知你,但是还需要自己倒在杯子里
  4. 信号驱动IO:你想喝水,你去了烧水房,全自动的,烧水房的通知灯和你家的门铃是相同的。水开了,你家门铃就会响,但是有时候你家来客人时门铃也会响。但仍然需要自己倒在杯子里
  5. 异步IO:和IO多路复用类似,区别于最后水烧开了,异步IO会帮你把水倒在杯子里,你就可以直接喝了

内核态与用户态

由于操作系统中分为内核态和用户态,内核态指操作系统内核,用户态指用户自己编写的程序。操作系统会分出不同的内存区域给内核和用户程序使用,两者之间井水不犯河水,互不干扰。

当用户程序需要进行磁盘IO或者网络请求时,需要经过内核发起调用(这是因为用户程序没有权限直接操作硬件的,在系统启动的时候,硬件驱动程序会注册到操作系统内核中,只有内核有权限直接调用)。如此,需要IO得数据会先从用户态进入到内核态,再从内核态到硬件,中间会进行两次复制,在用户态中的数据是由用户进程操作的,内核态中的数据是由内核进程进行操作的,这又会涉及到进程间的切换,当切换到内核态之后,用户进程会等待内核进程帮它取到数据。

因此读取数据时,用户进程分为两个阶段,第一个阶段是等待数据准备好,第二个阶段是数据拷贝。

image-20250223204131195

下面所讲的五种IO都是对这两个阶段的描述。

五大IO模型

同步阻塞IO

阻塞IO指两个阶段都需要等待;

第一个阶段:用户进程等待数据从硬件读取到内核态

第二个阶段:用户进程等待数据从内核态拷贝到用户态

优点:实现简单

缺点:每个连接都需要一个线程,浪费资源,不适合高并发

image-20250223204148381

同步非阻塞IO

非阻塞指用户进程在第一阶段轮询recvfrom调用查询是否数据准备好了。第二个阶段与阻塞IO一样,等待数据从内核态拷贝到用户态。

优点:线程不会长时间阻塞,可以在数据未就绪时执行其他任务

缺点:频繁的上下文切换,效率较低,不适合高并发

image-20250223204213452

IO多路复用

在阻塞IO和非阻塞IO中,如果调用recvfrom时,如果没有数据,阻塞IO使CPU阻塞,非阻塞IO是CPU轮询空转。这两种模式在单线程的模式下,只能按顺序一个一个的处理IO,效率很低。

IO多路复用使用一个专门的线程监听数据是否就绪,这个专门的线程监听多个socket,哪个socket的数据准备好了之后再由应用程序调用recvfrom将数据从内核态拷贝到用户态。用于专门监听内核数据是否就绪的实现就是NIO中的select。

在linux中一切皆文件,一个IO本质就是一个socket,每个socket都与FD关联;IO多路复用就是使用FD来解决问题的。IO多路复用有三种实现,分别是select、poll、epoll。

优点:大大减少了上下文的切换,能够处理大量的并发连接,效率较高

缺点:依赖系统内核的支持,不同的多路复用实现(select、poll、epool)有各自的局限

image-20250223204238915

信号驱动IO

在IO多路复用中,专门监听socket是否就绪的是需要有一个线程去轮询的。在信号驱动IO中不需要有一个专门的线程去轮询socket的状态,当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。此时从内核态拷贝到用户态仍。

优点:理论上可以避免轮询

缺点:对于TCP协议,同一个信号可能对应多种事件,难以精确区分。因此使用的比较少。

image-20250223214704526

异步IO

用户进程调用aio_read后会直接返回,此时用户进程就可以去做别的事情了。等socket的数据就绪之后,内核把数据复制到用户态之后再通知用户进程进行数据处理,整个过程中,用户线程没有任何阻塞。

优点:真正的非阻塞

缺点:编程模型复杂。错误处理和状态处理较难。Linux下支持不完善。Windows实现了真正的AIO

image-20250223215211027

总结

image-20250223204501227

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇