五种IO模型
2021-11-18 17:44:44 138 举报
AI智能生成
五种IO模型包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO和异步IO。阻塞IO是最常用的一种IO模型,它会让线程等待数据的到来;非阻塞IO则是让线程不断轮询数据是否到达;多路复用IO可以让单个线程处理多个连接;信号驱动IO则是当有数据到达时才会通知线程;异步IO则是通过回调函数的方式通知线程数据已经准备好。这五种IO模型各有优缺点,可以根据具体场景选择合适的模型来提高程序的性能。
作者其他创作
大纲/内容
基本概念
同步/异步
同步和异步的概念描述的是用户线程与内核的交互方式
同步
用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行
异步
用户线程发起IO请求 后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数
用户空间/内核空间
现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
针对linux操作系统而言:
将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间;
将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
针对linux操作系统而言:
将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间;
将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
进程切换
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
进程切换流程
- 保存处理机上下文,包括程序计数器和其他寄存器。
- 更新PCB信息。
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
- 选择另一个进程执行,并更新其PCB。
- 更新内存管理的数据结构。
- 恢复处理机上下文。
缓存IO
缓存 IO 又被称作标准 IO,大多数文件系统的默认 IO 操作都是缓存 IO。
在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,也就是说,
数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,也就是说,
数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
缺点
数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。
CPU与外设之间的数据传输方式
(CPU是通过系统总线与其他部件连接并进行数据传输。)
(CPU是通过系统总线与其他部件连接并进行数据传输。)
CPU控制数据传输
程序传输方式
(指直接在程序控制下进行数据的输入/输出操作)
(指直接在程序控制下进行数据的输入/输出操作)
无条件传送方式
微机系统中的一些简单的外设,如开关、继电器、数码管、发光二极管等,在它们工作时,可以认为输入设备已随时准备好向CPU提供数据,而输出设备也随时准备好接收CPU送来的数据,这样,在CPU需要同外设交换信息时,就能够用IN或OUT指令直接对这些外设进行输入/输出操作。由于在这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称之为无条件传送方式
有条件(查询)传送方式
指在执行输入指令(IN)或输出指令(OUT)前,要先查询相应设备的状态,当输入设备处于准备好状态、输出设备处于空闲状态时,CPU才执行输入/输出指令与外设交换信息。为此,接口电路中既要有数据端口,还要有状态端口。
中断器传输方式
当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,CPU再继续执行被暂停的程序。
DMA管理
DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。
这样数据的传送速度就取决于存储器和外设的工作速度。
这样数据的传送速度就取决于存储器和外设的工作速度。
系统总线是由CPU管理的,在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态(高阻状态),而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。因此DMA控制器必须有以下功能:
1、能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2、当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3、能对存储器寻址及能修改地址指针,实现对内存的读写;
4、能决定本次DMA传送的字节数,判断DMA传送是否借宿。
5、发出DMA结束信号,使CPU恢复正常工作状态。
1、能向CPU发出系统保持(HOLD)信号,提出总线接管请求;
2、当CPU发出允许接管信号后,负责对总线的控制,进入DMA方式;
3、能对存储器寻址及能修改地址指针,实现对内存的读写;
4、能决定本次DMA传送的字节数,判断DMA传送是否借宿。
5、发出DMA结束信号,使CPU恢复正常工作状态。
阻塞/非阻塞
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式
阻塞
指IO操作要彻底完成之后才返回用户空间
非阻塞
IO操作被调用之后立即返回给用户空间状态值,无需等待彻底完成
参考资料
五种IO模型
IO模型参考
同步阻塞IO
用户线程调用内核IO操作,需要等IO彻底完成后才返回到用户空间,因此是阻塞IO
优点
能够及时返回数据,无延迟;
对内核开发者来说这是省事了;
对内核开发者来说这是省事了;
缺点
对用户来说处于等待就要付出性能的代价了;
同步非阻塞IO
IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,因此是非阻塞的。
非阻塞IO中需要用户线程在每个IO通路上,各自不断轮询IO状态,来判断是否有可处理的数据
优点
能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。
缺点
任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
同步IO多路复用
在非阻塞IO的基础上把一个连接的可读可写事件剥离出来,使用单独的线程来对其进行管理。多个IO通路,都复用这个管理器来管理socket状态
多路复用在内核中提供了select,poll,epoll三种方式
select
只能处理有限(不同系统参数:1024/2048)个socket
select监控socket时不能准确告诉用户是哪个socket有可用数据,需要轮询判断
select监控socket时不能准确告诉用户是哪个socket有可用数据,需要轮询判断
poll
与select没区别
采用链表实现,取消了文件个数的限制
采用链表实现,取消了文件个数的限制
epoll(I/O事件通知器)
epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了
fd 上的事件发生时,与它对应的回调函数就会被调用把fd 加入链表,其他处于“空闲的”状态的则不会被加入
epoll从上面链表中获取有事件发生的fd
epoll从上面链表中获取有事件发生的fd
没有最大连接限制
可以直接告诉用户程序哪一个,哪个连接有数据了
信号驱动
异步非阻塞IO(AIO)
在数据准备阶段,CPU与外设并行工作
这是等待数据阶段,CPU还可以继续执行其他任务的根本原因
0 条评论
下一页