DJ5-7 缓冲区管理

news2024/11/26 18:37:25

目录

5.7.1  缓冲的引入

5.7.2  单缓冲和双缓冲

1、单缓冲(Single Buffer)

2、双缓冲(Double Buffer)

3、双机通信时缓冲区的设置

5.7.3  循环缓冲

1、循环缓冲的组成

2、循环缓冲区的使用

3、进程同步

5.7.4  缓冲池

1、缓冲池的组成

2、缓冲区队列

3、Getbuf 过程和 Putbuf 过程

4、缓冲区的工作方式


5.7.1  缓冲的引入

  1. 缓和 CPU 与 I/O 设备间速度不匹配的矛盾
  2. 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制
  3. 解决数据粒度不匹配的问题
  4. 提高 CPU 和 I/O 设备之间的并行性

如下图所示,我们可以看出缓冲带来的好处,以及如何利用缓冲寄存器实现缓冲:


硬件缓冲和软件缓冲

(1) 硬件缓冲区:配置在设备中,具有专门的用途。

  • 对处理机透明,不需要处理机的直接管理,不会影响系统性能。

(2) 软件缓冲区:是内存空间的一部分。

  • 其目的是为了弥补硬件缓冲区的不足。
  • 因为并非所有外设都拥有足够的硬件缓冲区。
  • 操作系统中介绍的缓冲区都是指软件缓冲区。

5.7.2  单缓冲和双缓冲

1、单缓冲(Single Buffer)

单缓冲:一个缓冲区将被 CPU 和外设轮流使用,一方处理完毕后接着等待另一方处理。

𝑪和𝑻可并行,𝑴和𝑪、𝑴和𝑻不能并行,因此处理一块数据时间:𝒎𝒂𝒙(𝑪,𝑻)+𝑴

由于只有一个缓冲区,因此 CPU 和外设在处理时都是独占缓冲区,故输入(T)和传送(M)不能同时进行。

2、双缓冲(Double Buffer)

双缓冲:设置两个缓冲区,CPU 和外设都可以连续处理而无需等待对方。

  • 要求 CPU 和外设的速度相近。
  • 效率有所提高,且进一步平滑了传输峰值。
  • 系统处理一块数据的时间约为:𝒎𝒂𝒙(𝑪,𝑻)
  • 收发可双向同时传送,𝑴和𝑻可并行。

3、双机通信时缓冲区的设置

5.7.3  循环缓冲

当用户进程处理数据的速度较快、外部设备处理数据的速度较慢,或者用户进程阵发性输入/输出的数据较多时,必须考虑增加缓冲区的数量以改善系统性能,这就是多缓冲区方式。

循环缓冲:多个 I/O 缓冲区常常被组织成一个环形队列。

实质上,双缓冲可以看作是循环缓冲的一个特例。

1、循环缓冲的组成

(1) 多个缓冲区。

(2) 多个指针。

可为缓冲区设置三个指针:

  • 指示计算进程下一个可用缓冲区 G 的指针 Nextg
  • 指示输入进程下一个可用空缓冲区 R 的指针 Nexti
  • 指示计算进程正在使用的缓冲区 C 的指针 Current

2、循环缓冲区的使用

计算进程和输入进程可利用下述两个过程来使用循环缓冲区。

(1) Getbuf 过程

① 当输入进程向空缓冲区写入数据时,由该过程将指针 Nexti 所指示的缓冲区提供给输入进程使用,同时将 Nexti 指针移向下一个 R 缓冲区。

② 当计算进程从满缓冲区读出数据时,由该过程将指针 Nextg 所指示的缓冲区提供给计算进程使用,把它改为现行工作缓冲区,并令 Current 指针指向该缓冲区的第一个单元,同时将 Nextg 指针移向下一个 G 缓冲区。

(2) Releasebuf 过程

① 当输入进程把缓冲区写满时,调用 Releasebuf 过程,将该缓冲区释放并改为 G 缓冲区。

② 当计算进程把缓冲区读完时,调用 Releasebuf 过程,将该缓冲区释放并改为 R 缓冲区。此外,还要把该缓冲区由 C 缓冲区改为 R 缓冲区。

3、进程同步

(1) Nexti 追赶上 Nextg

输入速度大于计算速度,缓冲区满,输入进程阻塞,此情况称为系统受计算限制。

(2) Nextg 追赶上 Nexti

输入速度低于计算速度,缓冲区空,计算进程阻塞,此情况称为系统受 I/O 限制。

5.7.4  缓冲池

上述三种缓冲区的组织形式仅适用于某种特定的 I/O 进程和计算进程,属于专用缓冲。当系统中的设备很多时,将会有许多这样的循环缓冲区,消耗大量的内存空间,而且其利用率也不高。为了提高缓冲区的利用率,可以采用公共缓冲池技术,其中的缓冲区可为多个设备和进程服务。

两种缓冲池:

  • 用于块型设备的缓冲池:缓冲区较大,其长度通常与外部设备物理块的长度相同;
  • 用于字符型设备的缓冲池:缓冲区较小,其长度通常为 8 个字节、16 个字节等。

若单个缓冲区的容量太大会造成资源浪费,而太小的缓冲区则会增加系统管理开销。


1、缓冲池的组成

公用缓冲池,含有以下三种类型的缓冲区:

  • 空闲缓冲区:输入数据和输出数据都能装
  • 装满输入数据的缓冲区
  • 装满输出数据的缓冲区

2、缓冲区队列

为了管理上的方便,可将相同类型的缓冲区链成一个队列,于是可形成以下三个队列:

  • 空缓冲队列 emq:这是由空缓冲区所链成的队列。
  • 输入队列 inq:这是由装满输入数据的缓冲区所链成的队列。
  • 输出队列 outq:这是由装满输出数据的缓冲区所链成的队列。

3、Getbuf 过程和 Putbuf 过程

对缓冲区进行操作的两个过程:

Getbuf(type)          //type指队列类型
Putbuf(type, number)  //number指缓冲区的编号

信号量设置:

  • MS:互斥信号量,每个队列一个 MS (type)
  • RS:资源信号量,每个队列一个 RS (type)

队列操作过程:

Takebuf(type)         //取type类型队列的首缓冲区
Addbuf(type, number)  //将number所指的缓冲区加到队列的队尾

Getbuf 过程和 Putbuf 过程:

Procedure Getbuf(type)
begin
    Wait(RS(type));  //资源信号量
    Wait(MS(type));  //互斥信号量
    B(number) := Takebuf(type);  //从队首摘下一个缓冲区
    Signal(MS(type));
end

Procedure Putbuf(type, number)
begin
    Wait(MS(type));
    Addbuf(type, number);  //将指定缓冲区挂在队列的队尾
    Signal(MS(type));
    Signal(RS(type));
end 

4、缓冲区的工作方式

(1) 收容输入 hin

输入进程可调用 Getbuf(emp) 过程,从空缓冲区队列 emp 的队首摘下一空缓冲区,把它作为收容输入工作缓冲区 hin 。然后,把数据输入其中,装满后再调用 Putbuf(inq, hin) 过程,将它挂在输入队列 inq 上。

(2) 提取输入 sin

计算进程可调用 Getbuf(inq) 过程,从输入队列 inq 的队首摘下一满缓冲区,作为提取输入工作缓冲区 sin 。计算进程从中提取完数据后,再调用 Putbuf(emq, sin) 过程,将它挂到空缓冲队列 emq 上。

(3) 收容输出 hout

计算进程可调用 Getbuf(emq) 过程,从空缓冲队列 emq 的队首摘下一空缓冲,作为收容输出工作缓冲区 hout 。当其中装满输出数据后,又调用 Putbuf(outq, hout) 过程,将它挂在 outq 末尾。

(4) 提取输出 sout

输出进程可调用 Getbuf(outq) 过程,从输出队列的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区 sout 。在数据提取完后,再调用 Putbuf(emq, sout) 过程,将它挂在空缓冲队列末尾。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security源码剖析从入门到精通.跟学尚硅谷

1.1 概要 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”…

Mediapipe人体识别库

一、简介 官网:MediaPipe | Google for Developershttps://developers.google.cn/mediapipe Mediapipe 是2012年起开始公司内部使用,2019年google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning)方案。Mediapipe…

python-sqlite3使用指南

python下sqlite3使用指南 文章目录 python下sqlite3使用指南开发环境sqlite3常用APICRUD实例参考 开发环境 vscode ​ 开发语言: python vscode SQLite插件使用方法: 之后在这里就可以发现可视化数据: sqlite3常用API Python 2.5.x 以上…

信息安全实践1.3(HTTPS)

前言 做这个实验对Tomcat的版本有要求,最好是使用Tomcat8。因为我之前使用Tomcat10,然后一直做不出来。 要求 部署Web服务器端HTTPS功能,通过网络嗅探分析HTTPS通过SSL实施安全保护的效果 关键步骤 首先要给tomcat配置https,也…

设计模式之美-实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

领域驱动设计(Domain Driven Design,简称DDD)盛行之后,这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的DDD开发模式越来越被人提倡。所以,我打算用两节课的时间,结合一个虚拟钱包系统的…

超低功耗三通道低频无线唤醒ASK接收 125k soc芯片UM2082F08

UM2082F08 是基于单周期 8051 内核的超低功耗 8 位、、具有三通道低频无线唤醒 ASK 接收功能的 SOC 芯片。芯片可检测 30KHz~300KHz 范围的 LF(低频)载波频率数据并触发唤醒信号,同时可以调节接收灵敏度,确保在各种应用环境下实现…

代码随想录算法训练营15期 Day 6 | 242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和

由于昨天是周日,周日是休息日,所以就是什么也没有写啦。今天是day06天,继续加油。 哈希表理论基础 建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,…

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式?答案是**是**

Toolkit.getDefaultToolkit()获得的java.awt.Toolkit是不是同一个? 是否为单例设计模式? 答案是是 反复调用Toolkit.getDefaultToolkit()获得的 java.awt.Toolkit 是同一个 import java.awt.Toolkit;public class GetDefaultToolkit是不是获得单例Toolkit {static public …

【P43】JMeter 吞吐量控制器(Throughput Controller)

文章目录 一、吞吐量控制器(Throughput Controller)参数说明二、测试计划设计2.1、Total Executions2.2、Percent Executions2.3、Per User 一、吞吐量控制器(Throughput Controller)参数说明 允许用户控制后代元素的执行的次数。…

中级软件设计师考试总结

目录 前言考前学习宏观什么是软考涉及的知识范围软考整体导图总结 微观我的分享——希尔排序学习过程结构化做题 考试阶段确定不确定 考后总结 前言 作为一名中级软件设计师,考试是衡量自己技能和水平的一项重要指标。在备考和考试过程中,我通过总结经验…

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑(官方手册有误)

【TI毫米波雷达笔记】IWR6843AOPEVM-G的DCA1000EVM模式配置及避坑(官方手册有误) IWR6843AOPEVM-G版本可以直接与DCA1000EVM连接 进行数据获取 不需要连接MMWAVEICBOOST版 直接使用 DCA1000mmWave Studio 软件进行数据采集 在官方手册中 User’s Guide…

linux环境下安装gitlab

前几天跟朋友聊天时说到gitlab版本控制。其实,之前也对它只是知道有这个东西,也会用。只是对于它的安装和配置,那我还是没整过。这两天,我找了一下网上的资料,还是写下吧。 一安装: 按网上所说,…

2023年上半年信息系统项目管理师下午真题及答案解析

试题一(25分) 为实现空气质量的精细化治理,某市规划了智慧环保项目。该项目涉及网格化监测、应急管理、执法系统等多个子系统。作为总集成商,A公司非常重视,委派李经理任项目经理,对公司内研发部门与项目相关的各产品线研发人员及…

带你开发一个远程控制项目---->STM32+标准库+阿里云平台+传感器模块+远程显示-------之 阿里云平台项目建造。

第一篇章: (13条消息) 带你开发一个远程控制项目---->STM32标准库阿里云平台传感器模块远程显示。_海口飞鹏岛科技有限公司的博客-CSDN博客 本次文章是指引开发者进行开发阿里云平台建造设备项目,可观看UP主教程,完成如下&#x…

今天面了一个9个月测试经验的人,开口就跟我要18K,我都愣住了....

2月初我入职了深圳某家创业公司,刚入职还是很兴奋的,到公司一看我傻了,公司除了我一个测试,公司的开发人员就只有3个前端2个后端还有2个UI,在粗略了解公司的业务后才发现是一个从零开始的项目,目前啥都没有…

测试之路,你知道这些变化吗?突破后助你走得更远...

前言 Python自动化测试:7天练完这60个实战项目,年薪过35w。 目前的面试求职市场上,测试领域有哪些变化? 以这两年软件测试发展经历来看,现在的求职市场,已经不仅仅只考察个人的项目经验和技术能力了&#…

十五、多线程(上)

文章目录 一、线程(一)什么是线程(二)Linux下的多线程(三)总结(四)线程优点(五)线程缺点(六)线程异常(七)线程…

字节跳动测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在,招聘黄金时间已经过了,在网上看了很多大佬的面经,也加了很多交流群,受到了很多朋友的提点,今天终于轮到我来分享面经啦,之前面试了几家公司,最后在八月初拿到了字节跳动测试岗的 offer&…

数据结构 -- AVL树

1、定义 平衡搜索二叉树,相对于搜索二叉树而言,AVL树又多了一个性质:左右子树的高度差不大于1. 2、平衡因子,balance factor,以下简称bf,是左子树高度减去右子树的高度 bf > 1,左边子树高bf …

Java最新版发送阿里短信教程

一、概述: 为什么现在的企业越来越多使用阿里云短信服务,究其原因是阿里云短信服务是一种可靠、高效、安全的短信发送服务,它具有以下优点: 高可靠性:阿里云短信服务采用全球领先的短信网关进行短信发送,确…