高级IO:
五种典型IO:
阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接
IO多路转接模型:select/poll/epoll
五种典型IO
阻塞IO
IO操作的流程:等待IO操作条件具备,然后进行数据拷贝
为了完成IO操作发起调用,若当前不具备IO操作条件,则等待,直到条件具备,完成IO操作后调用返回
钓鱼的时候,手里一直握着鱼竿,等待?上钩。
非阻塞IO
为了完成IO操作发起调用,若当前不具备IO操作条件,则立即报错返回;可以干点其他的事情,循环过来进行判断
把鱼竿放下去,去做其他事情,隔一段时间过来看一次,缺点:回来时?跑了。所以出现信号驱动IO
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一 般只有特定场景下才使用.
信号驱动IO
提前对IO信号自定义处理方式,当IO条件具备时,操作系统通过信号通知进程,这时候IO条件已经具备,直接发起调用进行数据拷贝
钓鱼的时候,抛出鱼竿,在鱼竿上绑上一个铃铛,如果?咬钩了,就能及时知道了
异步IO
IO操作条件的等待与数据拷贝都由操作系统来进行等待与操作,等到IO操作完成后,通过信号通知进程,进程直接对数据进行操作
钓鱼的时候,抛出鱼竿,找个人帮你钓鱼,调到?了,叫一下你
总结
IO几种操作中,IO操作效率越来越高,但是流程控制越来越复杂
高级IO重要概念
阻塞与非阻塞
- 阻塞:当前不具备操作条件时,调用挂起等待,直到条件具备,完成操作后调用返回
- 非阻塞:当前不具备操作条件,调用直接报错返回
- 阻塞与非阻塞:关注的并不是操作是否完成,而是调用是否立即返回
同步通信 vs 异步通信
同步:当前不具备操作条件时,调用挂起等待,直到条件具备,完成操作后调用返回
异步:发起操作的调用,这个操作并不由自己完成,由别人完成
同步与异步:关注的是操作是否由自己完成
同步通常是阻塞的;但是异步有阻塞也有非阻塞
-
异步阻塞:发起调用完成功能,功能由操作系统完成,但是进程自身一直等待操作系统完成完成,完成之后返回
-
异步非阻塞:发起调用完成功能,功能由操作系统完成,进程自身立即返回
-
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得 到返回值了; 换句话说,就是由调用者主动等待这个调用的结果;
-
异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果; 换句话说,当一个异步 过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用 者,或通过回调函数处理这个调用.
同步和异步关注的是消息通信机制.
了解Linux下的AIO—异步IO
https://blog.csdn.net/brucexu1978/article/details/7085924
IO多路转接/IO多路复用
对大量描述符进行事件监控(可读事件/可写事件/异常事件)监控
作用
- 前边基本的tcp服务器只能与一个客户端通信一次
- 因为服务器端不知道新的客户端连接请求以及客户端数据什么时候到来,因此程序流程只能写死,导致程序会卡死在accept/recv这里
- 假设服务端若是知道什么时候新的客户端连接起来,这时候再调用accept;程序流程就不会卡再accept这里,假若服务端知道什么时候客户端的数据到来,然后再进行recv,程序流程就不会卡在recv这里
- 这时候服务端就可以实现并发操作,谁有数据到来就操作谁,否则不进行操作
IO多路转接
替进程监控大量描述符什么时候有什么事件,进而进程可以针对发生了相应事件的描述符进行相应操作;
IO多路转接模型
- select
- poll
- epoll