一、I/O操作为什么分两个阶段:
在这里以I/O输出为例进行说明:
- 等待数据准备好;
- 将数据从内核空间复制到应用进程缓冲区。
首先我们要对经典的4G虚拟地址空间有一定的了解——3G用户,1G内核。困惑我比较长的时间的就是1G内核空间到底是某个进程所独有的还是所有进程共有的?今天灵感突现,举一个非常恰如其分的例子——公共物品。公共物品人人可用,但是没有任何个人对其拥有所有权。可以理解为1G的内核空间是某进程独占的,也可以理解为所有进程共享的。
引出4G虚拟地址空间有什么用意呢?内核负责接收数据,存放在内核缓冲区中,然后数据从内核流向应用进程。这种处理流程使人倍感亲切,把事务处理分的清汤绿水的:内核光负责接收数据,应用进程光负责处理数据,各司其职高效工作。
二、同步和异步到底区别在哪
- 如果在ta时刻,I/O事件发生,称之为同步。应用进程感知后,需要耽误一些时间等待数据从内核流向应用进程,而这一过程是阻塞的。
- 如果再tb时刻,I/O事件发生,称之为异步。应用进程感知后,无需等待可以直接对采集到的数据进行处理。
一言以蔽之:I/O操作总是在事件发生之后才发生称为同步;I/O操作在事件发生之前发生,称为异步。
三、不能将五种I/O模型割裂开来,应用中可能会同时使用两个或多个
例如,非阻塞I/O的系统调用立即返回,如果光采用这一种的话,我们就需要采用轮询的方式。如果和信号驱动I/O结合起来,会达到一个更好的效果。