一、前言
嘿嘿下面会涉及到一点点汇编的知识。
在没有缓冲区的这个概念之前,我们讲CPU和I/O设备的传送方式之一,中断访问方式时 ,CPU把给I/O的命令或者数据用OUT命令放在端口里,I/O去取;反过来,I/O给CPU的数据、状态信息也存储在端口里,CPU用IN命令去取。
IN AL,21H;表示从21H端口读取一字节数据到AL
OUT 21H,AL;将AL的值写入21H端口
从上面的汇编命令格式可以直观的看出,实质上是寄存器AL和21H端口之间在传送数据。
从下面的图中,可以得知,通用寄存器AL是CPU的一部分,所以实际上是CPU和I/O在直接通信。
而这样传送的效率是非常低的。 缓冲区的作用这不就来了嘛。
二、缓冲区的作用
作用就是不让CPU和I/O直接交互,好处一是CPU把数据放入缓冲区就可以去做自己的事情了,好处二是字符型设备把数据一个一个放入缓冲区而不去打扰CPU,减少了CPU被中断的次数。
这里可以类比cache来记忆。
为了缓解CPU和内存的速度差异,引入了cache。
为了缓解CPU和I/O的速度差异,引入了缓冲区。
注意:当缓冲区为空时,可以往缓冲区冲入数据,但是必须充满以后才能传出;当缓冲区数据非空时,不能往缓冲区冲入数据, 只能从缓冲区把数据传出;
三、单缓冲 与 双缓冲
PS: 为进程分配的缓冲区不属于进程所在的内存(堆区、栈区、静态存储区、代码区),而是独立存在于整个内存中的。或者你可以这样记忆,既然有缓冲池这个概念,我们知道池化技术是就是跟“共享单车”一样谁都可以用的,所以缓冲区应该独立于内存中,不属于任何一个进程
3.1 单缓冲
直接讲时间计算的题。
时间T:从外设到缓冲区的用时
时间M:从缓冲区到进程工作区的时间
时间C:CPU处理数据的时间
问你处理一块数据总共用时多久,方法就是画图去看从“工作区满,缓冲区空”到下一次“工作区满,缓冲区空”用时多久。
首先要判断T和C哪个大(题目中会告诉你T和M的具体值)。
(1)当T>C时
从“工作区满,缓冲区空”到下一次“工作区满,缓冲区空”处理一块数据用时T+M
(2)当T<C时
用时C+M
背过总结:就是T和C哪个大,就用哪个加上M
3.2 双缓冲
(1)当T>C+M时,每处理一块数据耗时T
(2)T<C+M时,用时M+C
背过结论:max{T,M+C}
一个关于单缓冲和双缓冲的题:一块数据,从硬盘读到缓冲区要100ns,从缓冲区读到进程工作区要50ns,在工作区里进行处理要50ns。问现在有10块数据,进行双缓冲,从开始到处理完一共要多少时间?
(10÷2)*100+10*50+10*50 = 500 + 500 + 500 = 1500
四、缓冲池
剩下的部分,比如缓冲池,还是看视频这种动态的讲解更好理解