IO ( input & output )过程:
2.1等待IO就绪---》指的是想要获取的资源已经准备好了,可以进行操作.
读: recv/recvfrom --》想要获取的数据已经准备好了
写:想要写入数据的空间已经准备好了,可以写入数据了send/sendto
2.2拷贝数据到缓冲区当中
阻塞IO
1.资源不可用情况下,IO请求一直被阻塞,直到资源可用
2.
3.阻塞IO的特点
3.1阻塞IO的方式,等待的时长取决于内核;
3.2在等待的过程当中执行流是被挂起的,对CPU的利用率是很低的
3.3在IO就绪到拷贝之间,实时性比较高;
3.4代码编写的流程比较简单
非阻塞IO
1.资源不可用的时候,IO请求不会被阻塞,而是直接返回,返回当前资源不可用;
如果返回资源不可用,也就是意味着IO请求并没有被真正完成
2.在非阻塞的情况下,需要判断返回值,来判断I0请求是否被真正完成,需要搭配循环一直判断,直到IO请求完成
3.
4.特点:
4.1非阻塞IO对CPU的利用率比阻塞IO高
4.2代码复杂,流程控制复杂
4.3循环调用,直到IO请求完成
4.4 IO准备就绪,到拷贝数据之间不够实时
信号驱动IO
1.自定义一个IO信号的处理函数,处理当中发起IO调用;
程序收到IO信号--》内核调用IO信号的自定义处理函数--》也就是意味着在自定义处理函数当中发起了IO调用
2.
3.特点:
3.1 IO准备就绪,到拷贝数据之间实时性加强了
3.2代码更加复杂,流程控制更加难
3.3不需要重复发起IO调用,但是需要在代码当中增加自定义信号的逻辑了
异步IO
1.原理
1.1自定义信号的处理函数--》作用是通知数据拷贝完成的
1.2发起一一个异步调用,并且异步调用直接返回
1.3对于异步调用返回之后,执行流可以执行用户代码,由操作系统内核帮助我们等待IO就绪和拷贝数
1.4当拷贝数据都完成了,内核通过信号来通知调用者
2.
3.1.异步IO模型当中,数据拷贝过程也被内核完成了
3.2.自定义信号处理函数,导致代码复杂,流程复杂
3.3.同阻塞IO,实时性没有收到多大的影响
总结
阻塞和非阻塞:
只需要判断,资源不可用的时候,发起IO调用,当前IO调用是否返回
IO调用返回:则认为是非阻塞
IO调用没有返回:则认为是阻塞
同步和异步:
区别于线程当中学习过的同步和互斥当中的同步,这里的同步指的是,让多个执行流合理的访问临界资源同步和异步IO当中的 同步,是指:数据拷贝过程是否由程序员完成
是程序员完成:则为同步
是内核完成:则为异步
只需要判断,是否由调用者去等待调用结果
如果是:则是同步
如果不是:则是异步
5.多路转接IO
下篇博客总结