iocp 取消已投递的io_细说IO复用

1534e43cdfd4b65d873992ade723b063.png

I/O动作如何执行

首先明确一点, 进程无法直接操作I/O设备,其必须通过系统调用请求内核来协助完成I/O操作。内核会为每个I/O设备维护一个buffer

0d3e7f56f9126d353effe21075038837.png
I/O执行流程

对于输入而言,等待数据输入至buffer是需要时间的,而从buffer复制数据到进程也是需要时间的,根据等待的模式不同,I/O动作可分为5中模式。

(1)blocking I/O 阻塞IO

(2)nonblocking I/O 非阻塞IO

(3)I/O multiplexing (select and poll)

IO复用,为什么要IO复用?

如果一个进程处理两个IO的时候,就必须要复用,不然无法正常完成此类处理。一个进程处理多个请求时,处理多个文件描述符,一个进程处理多个连接时都要复用。即使是一个进程相应一个请求也得复用,允许用户交互式输入数据,(交互式IO),还要处理网络连接(网络IO)。

(4)signal driven I/O (SIGIO) 信号驱动的IO

(5)asynchronous I/O(AIO) 异步IO

同步IO和异步IO

2e559a4f48b36c288e83890fc0e11372.png

同步IO:引起请求进程阻塞,知道I/O完成

异步IO:不导致请求进程阻塞

ac9314473c12793ff36aca0692a202bb.png

在数据准备阶段和数据复制阶段,进程一直是等待的,这种模式成为同步阻塞IO。

不能响应其他请求,两段时间都需要等待。

c6be7e7f57ed084972985f33d65ea5cd.png

等待数据准备的过程中,进程一直向内核询问,数据是否准备完毕,知道内核准备好数据,这端时间内,进程是非阻塞的,也就是忙等。但是等待数据复制的过程是阻塞的。这种模型就是异步阻塞IO。

可以接其他请求。说明:一个进程发起系统调用,这个过程是非阻塞的,进程可以做别的事,但是还有检查,所以可以接受请求,新的请求也要发起系统调用,也要检查,所以进程会非常繁忙。性能非常差。(几乎没人用)

0a420ed76e091143ef6dcf80fb7e9870.png

等待数据和数据复制的两段过程中,进程是一直阻塞的,但是这两段阻塞之间是异步的。当内核通知进程数据已准备完毕之后,进程必须再次发起系统调用,内核才会完成数据的从内核缓冲区到进程缓冲区的复制,内核不会主动复制。那么进程得知数据准备完毕之后,并不需要立即发起系统调用,进程可以继续处理其他的工作,等需要处理本次请求时再来发起系统调用完成数据的复制工作。也是异步阻塞IO。

两段阻塞之间太短,能接受其他请求。中间的空闲时间进程可以自行决定,但是时间也是很短的。但是性能很差。可以实现多个进程相应多个请求。主进程监听套接字端口, 接受请求,接受请求之后分配给子进程来处理请求。apache在IO复用的模型下是怎么工作的?他是一个主进程n个子进程,使用多个子进程来想用多个请求。IO复用模型下,完成IO复用的函数select()机制,子进程在等待数据准备完成这段时间中,会打开一个文件,打开一个文件描述符,看看有没有准备好数据,最多接受1024个文件打开,所以最多接受1024个并发连接。poll没有限制,剩下的跟select()差不多,所以性能依然查。

65b3ad3b481066ed19791d70b6805c20.png

信号驱动IO与IO复用不同的地方是第一段不用阻塞了,内核准备好数据之后会通知进程。通知几次呢,每隔一段时间通知一次称为水平触发。只通知一次称为边缘触发(性能好)。那么和IO复用相比,信号驱动机制好在哪里?IO复用机制简单但是两段阻塞期间不能做其他的事,而信号驱动IO在没收到通知前可以去做别的事,发起系统调用后使用了一个回调机制。内核通过这个回调机制进行通知。也是异步阻塞IO。也叫事件驱动IO(event_driven)。

可以相应多个请求,且不涉及到进程的切换。要记住是这种模型是进程中一个线程在响应多个请求,维持多个连接。使用epoll模型。内存映射[mmap],数据从磁盘到内存是要复制的,内存映射是不需要复制,而是将磁盘的数据映射到内存中,这样会更快。

f9afd4068db783b005c6162b117ec21b.png

就是当数据完全准备完毕之后通知给进程一个信号,称为AIO,即异步非阻塞IO。

可以响应多个请求。(最快的,两段都不需要阻塞,但是异步是最复杂的机制实现比较困难)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值