Linux I/O: 一次IO就是将数据从硬盘中加载到内存中。
Linux下的五中IO模型:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型、异步IO模型:
- 阻塞型IO:即进程或线程一直等待某个条件,不满足则一直等待。缺点:线程阻塞,浪费CPU资源
- 非阻塞型IO:应用进程与内核交互,线程不会一直等待,而是通过轮训的方式(应用进程通过recvfrom 调用不停的去和内核交互)查看数据有没有准备好。在两次发送请求的时间段,进程可以先做别的事情。
- 信号驱动IO:应用进程预先向内核注册一个信号处理函数,然后用户进程返回,并不阻塞,当内核数据准备就绪时会发送一个信号给进程,用户进程便在信号处理函数中开始把数据拷贝到用户空间中。
- IO复用模型:将多个进程I/0注册到同一管道上,这里管道会统一和内核交互。当管道中的某一个请求需要好的数据准备好之后,进程再把对应的数据拷贝到用户空间中。I/O多路转接是多了一个Select函数,多个进程的IO可以注册到同一个Select中,用户调用该Select。Select会监听所有注册好的I/O,如果所有被监听的I/O需要的数据都没有准备好,Select调用进程会阻塞。当任意一个I/O所需要的数据准备好之后,Select调用就会返回,然后进程再通过recvfrom来进行数据拷贝。但实际上,它并未向内核注册信号处理函数,所以它并不是非阻塞的。
- 异步I/O模型:应用进程把I/O请求传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次I/O已经完成。用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核进程当整个操作完成时,如何通知进程,然后就立刻去做其他事儿了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成。
说明:图片参考网络
参考:
- 聊聊Linux 五种IO模型:https://www.jianshu.com/p/486b0965c296
- 简书详解:https://www.jianshu.com/p/dfd940e7fca2
- 同步、异步、阻塞和非阻塞:https://www.jianshu.com/p/aed6067eeac9