五种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。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后(内核),通过状态、通知和回调来通知调用者的输入输出操作。
文件系统的简单操作
df -h /etc
标签:异步,调用,函数,模型,阻塞,IO,进程 From: https://blog.51cto.com/u_15958702/7588621