五种IO模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五种IO模型相关的知识,希望对你有一定的参考价值。
1. 阻塞I/O
2. 非阻塞I/O
3. 多路I/O复用
4. 信号驱动I/O
5. 异步I/O
前四种都是同步,只有最后一个是异步I/O
阻塞I/O模型
进程会一直阻塞(不再占有CPU),直到数据拷贝完成。应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。
非阻塞I/O模型
非阻塞IO进程反复调用I/O函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的。
当所请求的I/O操作无法完成时,不将进程睡眠,而是返回一个错误。这样让I/O操作函数不断地测试数据是否已经准备好,如果没有准备好就继续测试。直到数据准备好位置,会一直占用CPU;
多路I/O复用
select、poll和epoll三个函数,关键是能实现同时对多个I/O端口进行监听。这几个函数也可以使进程阻塞,但是和阻塞I/O的区别是,他可以同时阻塞多个I/O操作,并且同时对多个读、写操作进行检测,知道有数据可读或可写时,才真正调用I/O操作函数。
信号驱动I/O
安装一个信号处理函数用来接收信号,进程继续运行并且不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据
异步I/O模型
数据拷贝的时候进程无需阻塞。linux中并没有真正意义上的异步I/O。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后(内核),通过状态、通知和回调来通知调用者的输入输出操作。
同步、异步区别
- 同步/异步:
- 同步,就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。
- 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。内核在处理完事件之后,会主动将结果写到缓冲区中,然后用某种方法(信号等)通知线程来,然后线程来到缓冲区取数据。得到结果之前,该调用不会阻塞当前线程。以轮询的形式进行访问。
阻塞、非阻塞区别
阻塞/非阻塞:
阻塞/非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
- 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
- 非阻塞调用指在不能立刻 同步/异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 。
以上是关于五种IO模型的主要内容,如果未能解决你的问题,请参考以下文章