Linux下的五种I/O模型

来源:互联网 发布:怎么加盟淘宝外卖 编辑:程序博客网 时间:2024/06/03 04:51

I/O(input/output),即输入/输出端口。每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。

网络中的I/O需要经过两步完成:1)等待数据就绪 2)数据搬迁(把数据从内核区拷贝到用户区)

--------------------------------------------------------------------------------------------------------------

Linux下共有五种I/O模型。

阻塞I/O,非阻塞I/O,I/O复用,信号驱动I/O,异步I/O

1)阻塞I/O:应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。

2)非阻塞IO模型 :我们把一个套接字接口设置为非阻塞就是告诉内核,当所请求的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,只是等待方式不同。
同步与异步的区别:
同步:发起进程的和等待结果是同一个调用者,调用者发起之后不会立即返回,一直在等结果。
异步:用者调用这个功能就返回了,该功能有结果后通知调用者,即回调通知。
阻塞和非阻塞的区别:

阻塞:就是调用一个功能,没有接收完数据或者没有得到结果之前,调用者死等结果。
非阻塞:调用者用轮询的方式等待结果。



0 0
原创粉丝点击