高级IO模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guorong520/article/details/80701842

一、网络IO

1.高级IO背景
对于网络IO,IO效率提升是至关重要的,一个数据在网络中的传输,其传输时间主要由网络中的延迟所决定,具有不确定性(什么时候来),所以接收IO应用程序必须经过高效的等,及时的搬迁数据来提高传输速度。众所周知,数据的搬迁取决于网卡、硬盘、内存的速度,但是经过多年的发展,它们的发展已经遇到了瓶颈,所以为了再次提升IO效率,就需要将应用程序等待的时间降低,如何高效的等,就变成了我们的重要的议题。

2.系统是如何知道有数据需要接收呢?
轮询方式:系统每隔一定的时间间隔就去检查一次物理设备,若设备有数据到达,就调用读取数据的程序。Linux中通过定时器实现,但是有一个明显的缺点:不管设备是否有数据,系统总是要固定的消耗CPU资源去查看设备,并且可能对一些紧急数据处理予以延迟。资源利用率太差。

中断方式:利用硬件体系结构的中断机制实现设备和系统的应答对话,即当物理设备需要CPU处理数据时,就向CPU发送一个终端信号,系统则在收到信号后调用相应的中断服务程序响应对设备中断的处理。因此,基本在所有的网络设备驱动程序中都是用中断方式的。

二、五种IO模型

1.阻塞IO
在内核将数据准备好之前,系统调用会一直等待。所有的套接字都是默认为阻塞方式,它是最常见的IO模型。

2.非阻塞IO
如果内核没有将数据准备好,系统调用会直接返回,并且返回EWOULDBLOCK错误码。这种方式需要程序员反复尝试读写文件描述符(轮询),但这对CPU的浪费是较大的。

3.信号驱动IO
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。

4.IO多路转接
同时等待多个文件描述符的就绪状态。

5.异步IO
由内核进行数据的拷贝,拷贝完成后通知应用程序。

三、同步通信与异步通信

同步通信
调用者主动等待这个调用的结果。
异步通信
调用发出后,被调用者通过状态或通知来通知调用者,或者通过回调函数处理这个调用。

需要注意的是,这与线程间中同步与互斥是两个不同的概念。

四、阻塞与非阻塞

阻塞
线程会被挂起,调用线程如果接收到了结果才会返回。
非阻塞
就算没有立刻得到结果,调用也不会阻塞当前线程。

猜你喜欢

转载自blog.csdn.net/guorong520/article/details/80701842
今日推荐