【网络编程】五种I/O模型

Unix下共有五种I/O模型 
(1)阻塞I/O 
(2)非阻塞I/O 
(3)多路复用I/O(select和poll) 
(4)信号驱动I/O(SIGIO) 
(5)异步I/O

1、阻塞I/O模型 
应用程序调用IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,则程序则阻塞等待。若果数据准备好了,从内核空间拷贝到用户空间。 
这里写图片描述

2、非阻塞I/O模型 
我们把一个套接字设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样I/O操作函数将不断的测试数据是否准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断的测试中,会大量的占用CPU的时间。 
这里写图片描述 
3、多路复用I/O 
I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。 
这里写图片描述 
4、信号驱动I/O模型 
首先我们允许套接字接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。 
这里写图片描述 
5、异步I/O模型 
调用aio_read函数,告诉内核描述字,缓冲区指针,缓冲区大小,文件偏移以及通知方式,然后立即返回。当内核将数据拷贝到缓冲区后,再通知应用程序。 
这里写图片描述 
几种I/O模型的比较 
前四个模型都是同步I/O模型,最后一个是异步I/O。五种I/O模型读取数据都分两个阶段完成。 
这里写图片描述 
前四种模型的第一个阶段基本相同,第二个阶段基本系统,都是将数据从内核中拷贝到调用者的缓冲区。而异步I/O的两个阶段都不同于前四个模型。 
网络编程的四种调用方式 
阻塞与非阻塞 
(1)、阻塞 
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 
阻塞: 如果条件未就绪,’你’必须死等它就绪;进程睡眠(睡眠的缺点就是会让出CPU控制权) 
有的人会将阻塞和同步调用弄混,实际上二者是不同的。对于同步调用而说,很多时候线程是激活的,只是从逻辑上当前函数没有返回而已。 
(2)、非阻塞 
非阻塞和阻塞的概念相对应,指在不能立刻 得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 
非阻塞:如果条件未就绪,’你’可以转身作别的事情;进程可以作任何想做的事情,不过通常是低效的轮询。(轮询的特点是CPU寄存器一直被当前进程使用。轮询不是一种好的方式,可以使用wait/notify机制)

同步于异步 
(1)、同步 
进程同步就是指在发出一个函数调用时,在没有得到结果之前,该调用就不返回。 
(2)、异步 
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 
同步是阻塞模式,异步是非阻塞模式。

容易混淆的知识点 
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

猜你喜欢

转载自blog.csdn.net/bible_reader/article/details/80515526