目录
一、对IO的理解:等+拷贝
等
拷贝
二、五种IO模型(解释其概念)
1.阻塞IO
2.非阻塞IO
3.信号驱动IO
4.IO多路复用
5.异步IO
IO速度比较
三、一个故事让你了解五种IO模型
四、同步VS异步 阻塞VS非阻塞
同步VS异步
阻塞VS非阻塞
一、对IO的理解:等+拷贝
等
- 等待外设就绪:在进行I/O操作时,由于外设(如硬盘、网络设备等)的速度通常远低于CPU的速度,因此CPU在执行I/O指令后往往需要等待外设完成操作。这种等待是I/O操作中的一个基本且常见的特性。
- 在现代操作系统中,为了提高CPU的利用率,通常会使用中断(Interrupt)和DMA(直接内存访问)等技术来管理I/O操作,使得CPU在等待I/O操作完成期间可以执行其他任务。但是,从应用程序的角度来看,I/O操作仍然是一个“等待”的过程。(备注:中断是一种硬件或软件生成的信号,用于中断正在执行的程序,将控制权转移到处理中断的程序上,DMA是一种机制,允许输入/输出设备直接访问系统内存,而无需通过处理器的干预)
拷贝
拷贝数据:在I/O操作中,数据通常需要在不同的存储介质或内存区域之间移动。这种移动过程本质上就是数据的拷贝。
二、五种IO模型(解释其概念)
1.阻塞IO
在内核将数据准备好之前,系统调用将会一直等待,所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。
2.非阻塞IO
也称为非阻塞轮询式IO,如果内核未将数据准备好,系统调用不会等待阻塞,会直接返回,且返回的是EWOULDBLOCK错误码。注意:使用非阻塞IO,一般要进行轮询操作,即反复的进行IO操作(如读写文件等操作,看看文件描述符是否已经就绪)直到操作完成,这对CPU是一个很大的消耗,一般只有特定的场景才使用。
3.信号驱动IO
内核将数据准备好之后,发送SIGIO信号通知应用程序进行IO操作。允许应用程序在等待IO操作完成时执行其他任务。
4.IO多路复用
同时监视多个IO操作的技术,它可以提高程序的效率,能够同时等待多个文件描述符的就绪状态.,最常见的IO多路复用机制是
select
、poll
和epoll
(主要在Linux上),这些机制允许单个线程或进程监视多个文件描述符,以查看是否有IO操作准备就绪。一旦有IO操作就绪,程序就可以执行相应的读写操作,而不会阻塞整个程序。
5.异步IO
异步IO是最高效的IO模型之一。在异步IO模型中,应用程序发起一个IO操作,并立即返回继续执行后续操作,而不会阻塞当前线程。当IO操作完成时,内核会通知应用程序,通常是通过回调函数或事件。这样,应用程序可以在不牺牲性能的情况下,同时处理多个IO操作。
IO速度比较
从速度角度来看,异步IO > IO多路复用 > 信号驱动IO > 非阻塞IO > 阻塞IO。然而,这种比较并不是绝对的,因为实际速度还受到多种因素的影响,如操作系统的支持、硬件性能、IO操作的类型(如磁盘IO、网络IO)以及应用程序的具体实现等。因此,在选择IO模型时,需要根据实际应用场景和需求进行综合考虑。
三、一个故事让你了解五种IO模型
在一条河边有五个人在钓鱼:
人分别为:张三(代表阻塞IO),李四(代表非阻塞IO),王五(代表信号驱动IO),赵六(代表IO多路复用),田七(代表异步IO)
河:操作系统,鱼竿:文件描述符,鱼漂:就绪条件,人:进程/线程
(阻塞IO)张三钓鱼:
张三是一个热爱钓鱼享受钓鱼的人,他钓鱼会一丝不苟的盯着鱼漂,只要鱼漂一下沉他立马把鱼掉上来,在这区间他不会做其他与钓鱼无关的事。
(非阻塞IO)李四钓鱼:
李四钓鱼没有张三那么真正,他就是享受这一个过程的,他一会玩玩手机,一会看看鱼漂看看有没有鱼上钩,一会和旁边的钓友聊聊天,一旦鱼上钩,鱼漂一沉,鱼竿一动,他就把鱼钓上来。
(信号驱动IO)王五钓鱼:
王五虽然喜欢钓鱼,但他比较懒,他既不想眼睛盯着鱼竿,也不想手里拿着鱼竿,于是他在鱼竿上挂了一个铃铛,一但鱼上钩时鱼漂下沉,鱼竿摇动,铃铛就会响,他就把鱼钓上来,在这区间王五可以干任何事,刷抖音,看看书,只有铃铛响,他能听到把鱼钓上来就行。
(IO多路复用)赵六钓鱼:
赵六非常喜欢钓鱼,而且他非常有钱,别人钓鱼带一套装备(鱼竿,鱼漂等工具),一次只能钓到一条鱼,他嫌弃这样钓鱼慢,于是他带了100套装备,把100个鱼竿架好,然后他就在这100个鱼竿面前来回走动,一旦鱼漂下沉,鱼竿晃动,他到这个鱼竿面前把鱼钓上来。
(异步IO)田七钓鱼:
田七是一个钓鱼爱好者同时也是一个公司老板,他很忙,但他又想钓鱼,于是他钓鱼就放挂好鱼漂,架好鱼竿,他就开车回公司忙去了,让司机帮他钓,调到鱼了就打电话通知他,他忙完了就开车来接他和鱼。
四、同步VS异步 阻塞VS非阻塞
同步VS异步
- 同步:发出一个调用时,没有得到调用结果是,该调用不会返回,直到得到调用有结果时才会返回。即:调用者会主动的等待调用结果。
- 异步:发出一个调用时,该调用直接返回,没有返回结果,调用者不会主动等待调用结果,被调用者会通过状态、通知来通知调用者,或通过回调函数处理这个调用。
阻塞VS非阻塞
- 阻塞调用是指调用结果返回之前,当前线程会被挂起. 调用线程只有在得到结果之后才会返回.
- 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程