当前位置: 首页 > article >正文

操作系统缓冲区管理(单缓冲,双缓冲,循环缓冲,缓冲池)

目录

  • 1.什么是缓冲区
    • 1.有什么作用
  • 2.单缓冲
    • 1.常考题型:计算每处理一块数据平均需要多久
      • 1.假设输入时间T大于处理时间C
      • 2.假设输入时间T小于处理时间C
    • 2.单缓冲通信
  • 3.双缓冲
    • 1.计算数据处理的时间
      • 1. 假设T>C+M
      • 2.假设T<C+M
    • 2.双缓冲通信
  • 4.循环缓冲
  • 5.缓冲池
    • 1.共用缓冲区
    • 2.工作缓冲区
    • 3.数据输入输出操作

1.什么是缓冲区

缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理
好这些缓冲区。

1.有什么作用

①缓和CPU与I/O设备之间速度不匹配的矛盾
②减少对CPU的中断频率,放宽对CPU中断相应时间的限制
③解决数据粒度不匹配的问题
如:输出进程每次可以生成一块数据,但I/O设备每次只能输出一个字符
④提高CPU与I/O设备之间的并行性

2.单缓冲

假设某用户进程请求某种块设备读入若干块的数据。
若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;
缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。

1.常考题型:计算每处理一块数据平均需要多久

技巧:假定一个初始状态,分析下次到达相同状态需要多少时间,这就是处理一块数据平均所需时间。
在“单缓冲”题型中,可以假设初始状态为工作区满,缓冲区空

1.假设输入时间T大于处理时间C

处理一块数据的平均用时=T+M。(M为传送时间)
在这里插入图片描述

2.假设输入时间T小于处理时间C

处理一块数据的平均用时=C+M。
在这里插入图片描述

结论:
采用单缓冲策略,处理一块数据平均耗时Max(C,T)+M

2.单缓冲通信

两台机器之间通信时,可以配置缓冲区用于数据的发送和接受。
在这里插入图片描述
显然,若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输

3.双缓冲

假设某用户进程请求某种块设备读入若干块的数据。
若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)
双缓冲题目中,假设初始状态为:工作区空,其中一个缓冲区满,另一个缓冲区空

1.计算数据处理的时间

1. 假设T>C+M

处理一块数据的平均用时=T.
在这里插入图片描述

2.假设T<C+M

在这里插入图片描述
总之,T<C+M意味着设备输入数据块的速度要比处理机处理数据块的速度更快。
每处理一个数据块平均耗时C+M

结论::采用双缓冲策略,处理一个数据块的平均耗时为Max (T, C+M)

2.双缓冲通信

在这里插入图片描述
若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输

4.循环缓冲

将多个大小相等的缓冲区链接成一个循环队列
注:以下图示中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区。

在这里插入图片描述

5.缓冲池

1.共用缓冲区

缓冲池由系统中共用的缓冲区组成。
这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。
在这里插入图片描述

2.工作缓冲区

另外,根据一个缓冲区在实际运算中扮演的功能不同,
又设置了四种工作缓冲区:用于收容输入数据的工作缓冲区(hin)、用于提取输入数据的工作缓冲区(sin)、用于收容输出数据的工作缓冲区(hout)、用于提取输出数据的工作缓冲区(sout)

在这里插入图片描述

3.数据输入输出操作

①输入进程请求输入数据
从空缓冲队列中取出一块作为收容输入数据的工作缓冲区(hin)。
冲满数据后将缓冲区挂到输入队列队尾。
②计算进程想要取得一块输入数据
从输入队列中取得一块冲满输入数据的缓冲区作为“提取输入数据的工作缓冲区(sin)”。
缓冲区读空后挂到空缓冲区队列。
③计算进程想要将准备好的数据冲入缓冲区
从空缓冲队列中取出一块作为“收容输出数据的工作缓冲区(hout) ”。数据冲满后将缓冲区挂到输出队列队尾。
④输出进程请求输出数据
从输出队列中取得一块冲满输出数据的缓冲区作为“提取输出数据的工作缓冲区(sout) ”。
缓冲区读空后挂到空缓冲区队列。


http://www.kler.cn/a/106701.html

相关文章:

  • linux病毒编写+vim shell编程
  • 学习日记_20241115_聚类方法(层次聚类)
  • 【Linux】Linux 权限的理解
  • 接口文档的定义
  • react-rnd的使用(react使用拖拽,缩放组件)
  • 群控系统服务端开发模式-应用开发-前端登录接口开发
  • SpringMVC(四)域对象共享数据
  • Django 全局配置 settings 详解
  • 730. 机器人跳跃问题--二分
  • 【报错】java.sql.SQLException: Invalid utf8mb3 character string: ‘ACED00‘
  • Fourier分析导论——第1章——Fourier分析的起源(E.M. Stein R. Shakarchi)
  • vue 使用openlayers导出渲染的地图
  • 在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式
  • 工业4.0的安全挑战与解决方案
  • IDEA配置HTML和Thymeleaf热部署开发
  • yo!这里是进程间通信
  • Redis 的优势
  • mysql冷拷贝大表
  • (PyTorch)PyTorch中的常见运算(*、@、Mul、Matmul)
  • 如何使用SHC对Shell脚本进行封装和源码隐藏
  • 【C语言】memmove()函数(拷贝重叠内存块函数详解)
  • 基于ARM+FPGA+AD的多通道精密数据采集仪方案
  • 装饰者模式
  • R语言生物群落(生态)数据统计分析与绘图实践技术应用
  • 数组的最长递减子序列
  • Project Costs