
操作系统:缓冲技术的相关介绍
发布日期:2021-05-08 03:04:40
浏览次数:11
分类:精选文章
本文共 1638 字,大约阅读时间需要 5 分钟。
一、操作系统中引入缓冲的主要原因
在操作系统中引入缓冲的主要原因有以下几点:
缓和CPU与I/O设备间速度不匹配的矛盾
当今的计算机系统中,CPU的工作速度远高于I/O设备的处理速度。例如,内存访问速度通常远高于磁盘读写速度。这种速度差异可能导致CPU处于等待状态,无法充分利用 CPU 资源。缓冲技术通过在CPU和I/O设备之间插入缓冲区,缓解了这种速度不匹配的问题,提高了系统的整体效率。减少对CPU的中断频率,放宽对中断响应时间的限制
I/O设备的操作通常会通过中断机制通知CPU数据的到达情况。频繁的中断会打断CPU的工作,增加系统的响应时间。缓冲技术可以减少中断频率,因为缓冲区可以暂存数据,避免CPU每次操作都需要立即响应I/O设备的中断请求。这种方式既能减少中断的负担,又能保证数据的及时处理。提高CPU和I/O设备的并行性
通过引入缓冲区,可以让CPU在处理I/O设备的数据时,暂时不依赖于设备的响应。这样,CPU可以继续执行其他任务,同时等待I/O设备完成数据传输。这种并行处理的方式显著提升了系统的吞吐量和效率。二、缓冲的类型
缓冲技术可以从多个角度进行分类:
按照缓冲区存在的位置分类
- 软件缓冲区:存在于内存中,用于临时存储数据。
- 硬件缓冲区:存在于专用硬件中,常用于高性能I/O设备。
按照缓冲区的个数以及缓冲区的组织形式分类
- 固定大小缓冲区:缓冲区的大小固定,不支持动态扩展。
- 动态缓冲区:缓冲区的大小可以根据需求进行调整。
- 环形缓冲区:数据存储在环形结构中,首尾相连,循环利用。
- 双端队列(deque)缓冲区:数据可以从两端同时进行读写操作。
三、缓冲池的组成及操作
缓冲池是操作系统中常用的缓冲管理机制,其主要组成包括以下几个部分:
缓冲池中的三类缓冲区队列
- 空缓冲队列(empty queue,emq):用于存储尚未被使用的缓冲区。
- 输入队列(input queue,inq):存储已从I/O设备读取的数据,等待处理。
- 输出队列(output queue,outq):存储需要写入I/O设备的数据。
缓冲池中的工作缓冲区
- 收容输入缓冲区(hin):用于暂存从I/O设备读取的输入数据。
- 提取输入缓冲区(sin):用于从输入缓冲区中提取数据进行处理。
- 收容输出缓冲区(hout):用于暂存计算结果需要输出的数据。
- 提取输出缓冲区(sout):用于将数据从输出缓冲区中提取并发送到I/O设备。
缓冲池的操作过程
- 取出缓冲区(Take_buf):从指定队列中取出一个缓冲区。
- 插入缓冲区(Add_buf):将缓冲区插入到指定队列中。
- 申请缓冲区(Get_buf):进程申请指定类型的缓冲区。
- 将工作缓冲区插入队列(Put_buf):将工作缓冲区插入相应的队列中。
Get_buf和Put_buf的实现原理
为了保证多个进程对缓冲池队列的互斥访问,Get_buf和Put_buf过程需要通过信号量机制来控制。为此,为每个队列设置一个互斥信号量MS(type),初始值为1,确保只有一进程可以同时访问该队列。同时,为每个队列设置一个资源信号量RS(type),初始值为n(n为队列长度),用于保证各进程的同步使用。缓冲池的工作流程
- 收容输入:进程调用Get_buf(emq)取出空缓冲区,作为收容输入工作缓冲区hin,装入数据后调用Put_buf(inq, hin)将缓冲区挂入输入队列。
- 提取输入:计算进程调用Get_buf(inq)取出输入缓冲区sin,提取数据后调用Put_buf(emq, sin)将缓冲区挂回空缓冲队列。
- 收容输出:计算进程调用Get_buf(emq)取出空缓冲区,作为收容输出工作缓冲区hout,装入数据后调用Put_buf(outq, hout)将缓冲区挂入输出队列。
- 提取输出:输出进程调用Get_buf(outq)取出输出缓冲区sout,提取数据后调用Put_buf(emq, sout)将缓冲区挂回空缓冲队列。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月11日 09时00分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【普及模拟】交换
2019-03-04
4*4矩阵键盘的FPGA驱动
2019-03-04
椭圆曲线密码系统——椭圆曲线
2019-03-04
Vue实现选项卡功能
2019-03-04
数据结构——链表
2019-03-04
[编程题]Course List for Student (25)
2019-03-04
【Python】面向对象,封装
2019-03-04
接口又是个啥?
2019-03-04
5.11 TEST1
2019-03-04
uni-app请求头中携带token
2019-03-04
常用的 Git 命令和小技巧(1)
2019-03-04
vue中接收后台的图片验证码并显示
2019-03-04
springboot入门(1)---整合MyBatis
2019-03-04
Vue入门学习笔记(1)
2019-03-04
ECharts——双向柱状图
2019-03-04
Vue——引进bootstrap
2019-03-04
Vue——引进ivew
2019-03-04
趣谈win10常用快捷键
2019-03-04
数学建模(NO.18灰色预测)
2019-03-04