一、缓冲的引入
1.缓和CPU与I/O设备间速度不匹配的矛盾
2.减少对CPU的中断频率,放宽对CPU中断响应时间的限制
3.解决数据粒度不匹配的问题
4.提高CPU和I/O设备之间的并行性
二、缓冲区的组织形式 (单缓冲,双缓冲,循环缓冲属于专用缓冲)
1.单缓冲
- 每当用户进程发出一I/O请求时,OS便在主存中为之分配一缓冲区,CPU和外设轮流使用,一方处理完之后接着等待对方处理 。
- 块设备输入时,C和T可并行,M和C或M和T不能并行,因此处理一块数据时间:Max(C,T)+M ?
- 字符设备输入时,缓冲区用于暂存用户输入的一行数据,在输入期间,用户进程被阻塞以等待数据输入完毕;在输出时,用户进程将一行数据输入到缓冲区后,继续执行处理。当用户进程已有第二行数据输出时,如果第一行数据尚未被提取完毕,则此时用户进程应阻塞。
2.双缓冲
- 在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时OS可以从第一缓冲区中移出数据,并送入用户进程。接着由CPU对数据进行计算。
- CPU和外设都可以连续处理而无需等待对方。要求CPU和外设的速度相近。
- 收发可双向同时传送。
- 双机通信时缓冲区的设置 :若仅配置单缓冲,在任意时刻只能实现单方面的数据传输;设置两个缓冲区,即可实现双向数据传输。
3.循环缓冲
- 考虑增加缓冲区的数量以改善系统性能,这就是多缓冲区方式
- 双缓冲可以看作是循环缓冲的一个特例
- 循环缓冲的组成:
R:空缓冲; G:满缓冲; C:当前缓冲;Nexti:输入进程下一个可用空缓冲区R;Nextg:计算进程下一个可用满缓冲区G
- Getbuf过程 :当计算进程要使用缓冲区中的数据时或是输入进程要往缓冲区中输送数据时
- Releasebuf过程 :当计算进程把C缓冲区中的数据提取完毕时,便调用该过程将缓冲区G释放。当输入进程把缓冲区装满时,也调用该进程将缓冲区释放
- 进程同步:
Nexti追赶上Nextg:输入速度大于计算速度,缓冲区满,输入进程阻塞,此情况称为系统受计算限制
Nextg追赶上Nexti:输入速度低于计算速度,缓冲区空,计算进程阻塞,此情况称为系统受I/O限制
4.缓冲池(包含了管理的数据结构和管理机制,用于管理多个缓冲区)
- 分类:
用于块型设备的缓冲池:缓冲区较大,其长度通常与外部设备物理块的长度相同;
用于字符型设备的缓冲池:缓冲区较小,其长度通常为8个字节、16个字节等。
- 公用缓冲池的组成
- Getbuf过程和Putbuf过程
①两个过程:Getbuf(type);Putbuf(type,number)
②设置两个信号量:
MS(互斥信号量),每个队列一个MS(type),互斥访问缓冲池队列;
RS(资源信号量),每个队列一个RS(type),同步使用缓冲区。
- 缓冲区的工作方式
①收容输入hin:输入进程需要输入时,在空白缓冲队列取得空缓冲区,装满后放入输入队列。hin=getbuf(emq);putbuf(inq,hin)
②提取输入sin:计算进程需要输入时,在输入队列取缓冲区,提取数据后挂在空缓冲区队列上。 sin=getbuf(inq); putbuf(emq,sin)
③收容输出hout:计算进程需要输出时,在空白缓冲队列取空缓冲区,装满数据后挂在输出缓冲队列上。 hout=getbuf(emq) putbuf(outq, hout)
④提取输出sout:输出进程需要输出时,在输出队列取缓冲区,提取完数据后挂在空缓冲区上。 sout=getbuf(outq);putbuf(emq,sout)
标签:5.7,队列,缓冲,输入输出,进程,缓冲区,数据,输入 From: https://www.cnblogs.com/05-ReFrain-19/p/17378458.html