Linux中的IO简述
IO主要分为以下的三种:
通常我们所说的IO是后两者,Linux中无法直接操作IO设备,必须通过系统调用请求kernal来协助完成IO的动作,内存会为每一个IO设备维护一个缓冲区。
IO操作会涉及两个对象:
- 调用这个IO的进程(或线程);
- 系统内核的kernal
五种模型介绍
1、阻塞IO
最简单的一种IO模型,简单理解就是死等,即进程或线程一直等待某个条件,不满足就会一直等待。
当用户程序执行 read ,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read 才会返回。
注意,阻塞等待的是「内核数据准备好」和「数据从内核态拷贝到用户态」这两个过程。过程如下图:
2、非阻塞IO
应用进程与内核交互,不断轮询,不停地去问内核数据是否准备好:
- 如果没有准备好,返回error,应用进程得到error后,过一段时间再发送请求,在两次请求时间内,进程可以先做其他事情。
- 如果准备好了,将数据拷贝到用户空间
3、IO多路复用
IO多路复用实际上就是用select , poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。
4、信号驱动型IO模型
进程预先向预先注册一个信号处理函数,当内核数据准备好之后发送一个信号给进程。
5、异步IO模型
用户进程发起read操作,告诉内核当整个操作完成时、如何通知我们、立刻就可以开始去做其它的事,内核收到read操作之后会立刻返回、所以不会对用户进程产生任何阻塞、然后、内核会等待数据准备完成、然后将数据拷贝到用户内存、当这一切都完成之后、内核会给用户进程发送一个信号、告诉它read操作完成了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)