IO:
Input, output 输入输出操作
内核空间存放的是内核代码和数据。【操作系统和驱动程序】
而进程的用户空间存放的是用户代码和数据【应用程序】
内核空间和用户空间都 是虚拟空间。分为两级保护机制,内核空间为0级(最高),用户空间为3级
对于一个输入操作来说,进程IO系统调用后,内核会先看缓冲区有没有相应的缓存数据、没有的话从设备中读取。因为设备IO一般速度慢,需要等待,内核缓冲区有数据则直接复制到进程空间
内存IO
网络IO
磁盘IO
IO过程
等待,数据传输,处理
(1)阻塞型IO
当我们要写作业时,发现没有笔,让同桌去买笔,就一直等什么也不做,笔来了才能开始写作业
单机版: scanf cin 等待输入,然后输出
网络版:在内核将数据准备好之前,系统调用会一直等待所有的套接字。 也就是持续等待需要的资源,直到资源到达后进行处理
(2)非阻塞型IO
当我们要写作业时,发现没有笔,让同桌去买笔。他买的时间长,在等笔的这会,出去踢个球,打会游戏,隔一段固定时间看看笔有没有来,来了的话放下手头工作去写作业。
频繁轮询,查看是否有输入,没有的话,做其他的事,有输入的话再输出
每次客户询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮询。轮询非常消耗CPU
(3)信号驱动型IO
当我们写作业的时候,又发现没有笔,让同桌去买。这是一个非常好的同桌,他买完笔回来,会给你打个电话,告诉你笔买回来了,你此时放下手头工作,去写作业
先建立信号和处理程序,当收到信号,立刻处理程序
应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据报。
(4)IO多路复用(select,poll,epoll)
当我们写作业的时候,发现没有笔。此时因为自己腰缠万贯,所以让十几个人同时去买笔,怕其中有人慢,耽误自己写作业,谁回来早用谁的笔写作业
同时监控多个通道
(5)异步IO
当我们写作业时,发现没有笔。叫个人在这等笔来,我们去做其他事情,当笔来的时候,他打电话通知