Linux中五种常见的I/O模型
一般来说,程序进行输入操作有两步:等、搬迁 。在Linux下,共有五种I/O模型,下面就逐一介绍:
1>.阻塞I/O(使用比较广)
应用程序调用一个I/O函数,如果数据木有准备好,就会导致应用程序阻塞,直到数据准备好了,从内核拷贝到用户空间(进程的缓存),I/O函数返回成功。
如一个进程调用recvform,然后系统调用并不返回直到有数据包到达本地系统,然后完成数据拷贝。
http://www.myhack58.com/Article/UploadPic/2016-6/2016615191635818.png
2>.非阻塞I/O(极浪费CPU资源,不常使用)
我们把一个套接口设置为非阻塞,就是告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。通过I/O操作函数不断地测试数据是否准备好,如果木有准备好,继续测试(轮询),直到数据准备好,从内核拷贝到用户空间,I/O函数返回成功。
http://www.myhack58.com/Article/UploadPic/2016-6/2016615191635310.png
3>.I/O复用(实用的服务器程序)
使用select、poll、epoll l函数,也会使进程阻塞,但是和阻塞I/O不同的是,这些函数可以同时阻塞多个I/O操作,并且可以同时对多个读、写操作的I/O操作函数进行检测,直到有数据可读、可写时,才真正调用I/O操作函数,从内核拷贝到用户空间,I/O函数返回成功。
http://www.myhack58.com/Article/UploadPic/2016-6/2016615191635300.png
4>.信号驱动I/O(SIGIO)
我们允许套接口进行信号驱动I/O,并注册一个信号处理函数,进程继续运行不阻塞,当数据准备好时,进程会受到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
http://www.myhack58.com/Article/UploadPic/2016-6/2016615191635723.png
5>.异步I/O
让内核拷贝完成之后通知我们。
http://www.myhack58.com/Article/UploadPic/2016-6/2016615191635507.png
页:
[1]