io是相对于操作系统内存或缓存来说的,当用户所需要操作的数据在内存/缓存中不存在时,需要从其他地方获取数据,比如数据库,文件和网络请求等等,这就发生了数据输入,就是i,o是相反的情况,称这个过程为io
用户空间从内核空间获取数据的过程分为两个阶段
数据准备阶段和数据拷贝阶段
数据准备阶段是数据获取阶段,用户空间对于这个过程无能为力
数据拷贝阶段是从缓冲区拷贝到用户空间(用户空间的概念可以理解为应用程序运行的空间,比如php运行超内存限制的这个运行内存),这个过程的获取时间用户空间可以参与,比如是自己在这干等着内核返回(阻塞),还是我不停的主动询问是否(非阻塞),
是用户空间通知我准备就绪我再来拿数据(io多路复用),还是内核空间准备好数据自己返回给我(异步io)
1,阻塞io模型(同步,用户空间只请求一次)
用户空间什么也不干,一直等着内核空间返回数据
2,非阻塞io模型(同步,用户空间可能要多次请求)
用户空间轮训询问内核空间数据是否准备好
3,io多路复用模型 (同步,用户空间请求两次)
多路表示多个io,可以理解成多个socket,复用表示一个进程或线程;一个进程或一个现成可以处理多个请求,处理过程是select对多个socket进行监听,数据准备就绪就返回所有准备就绪的socket,然后通知用户进程去取数据,可以看到这里是用户进程主动取数据,这个进程/线程其实是一直被select阻塞的,但这多个socket中的每个socket是异步的的,因为是内核空间返回所有可读的socket。
4,异步io模型(只请求一次,主动回调数据结果)
用户空间只是请求数据,然后内核空间准备好数据后自动返回数据,如果用循环处理多个请求就和io多路复用很相似,但不相同,io多路复用是告诉用户空间该socket已就绪,本身并不返回数据,还需要用户进程自己去获取数据,但异步io是内核空间自己返回了数据
5,信号模型
信号是操作系统本身的一个机制,操作系统有很多的信号,信号可以跟进程id绑定,发生了信号事件,就该进程有相应的操作,进程id可以用户自定义方法绑定,所以发生了信号时间,可以触发用户自定义方法执行
另外,io多路复用加上线程/进程池就叫reactor模型
网友评论