Linux I/O models:修订间差异
imported>Soleverlee 以“* blocking IO * nonblocking IO * IO multiplexing * signal driven IO * asynchronous IO Category:Linux/Unix”为内容创建页面 |
|||
(未显示2个用户的12个中间版本) | |||
第1行: | 第1行: | ||
* blocking IO | *阻塞I/O(blocking I/O) | ||
*非阻塞I/O (nonblocking I/O) | |||
*I/O复用(select 和poll) (I/O multiplexing) | |||
*信号驱动I/O (signal driven I/O (SIGIO)) | |||
*异步I/O (asynchronous I/O (the POSIX aio_functions)) | |||
前四种都是同步,只有最后一种才是异步IO。 | |||
=blocking IO= | |||
阻塞IO模型是最常见的IO模型了,对于所有的“慢速设备”(socket、pipe、fifo、terminal)的IO默认的方式都是阻塞的方式。阻塞就是进程放弃cpu,让给其他进程使用cpu。进程阻塞最显著的表现就是“进程睡眠了”。阻塞的时间通常取决于“数据”是否到来。 | |||
[[Image:Blocking_IO.jpg|600px]] | |||
=nonblocking IO= | |||
一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。第四次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。 | |||
[[Image:Noneblocking_IO.jpg|600px]] | |||
=IO multiplexing= | |||
I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。 | |||
[[Image:IO_Multiplexing.png|600px]] | |||
=signal driven IO= | |||
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。 | |||
[[Image:Signal_Driven_IO.jpg|600px]] | |||
=asynchronous IO= | |||
数据拷贝的时候进程无需阻塞。 | |||
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作 | |||
[[Image:Asynchronous_IO.jpg|600px]] | |||
=总结= | |||
[[Image:5_IO_Models.jpg|600px]] | |||
*http://www.linuxidc.com/Linux/2015-07/120337.htm | |||
*http://blog.csdn.net/lovingprince/article/details/6426009 | |||
*http://blog.csdn.net/jay900323/article/details/18141217 | |||
[[Category:Linux/Unix]] | [[Category:Linux/Unix]] | ||
[[Category:Computer Basics]] |
2023年12月26日 (二) 02:51的最新版本
- 阻塞I/O(blocking I/O)
- 非阻塞I/O (nonblocking I/O)
- I/O复用(select 和poll) (I/O multiplexing)
- 信号驱动I/O (signal driven I/O (SIGIO))
- 异步I/O (asynchronous I/O (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。
blocking IO
阻塞IO模型是最常见的IO模型了,对于所有的“慢速设备”(socket、pipe、fifo、terminal)的IO默认的方式都是阻塞的方式。阻塞就是进程放弃cpu,让给其他进程使用cpu。进程阻塞最显著的表现就是“进程睡眠了”。阻塞的时间通常取决于“数据”是否到来。
nonblocking IO
一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。第四次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。
IO multiplexing
I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
signal driven IO
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
asynchronous IO
数据拷贝的时候进程无需阻塞。
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作