您的位置:首页 > 理论基础 > 计算机网络

五种I/O模型

2016-07-27 12:07 274 查看
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)

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  I-O 网络编程