操作系统14:缓冲区和磁盘调度算法

news2024/10/7 12:18:23

目录

1、缓冲区管理

(1)单缓冲区和双缓冲区

1.1 - 单缓冲区

1.2 - 双缓冲区

(2)环形缓冲区/多缓冲区

(3)缓冲池(Buffer Pool)

3.1 - 缓冲池的组成

3.2 - 缓冲池的工作方式

2、磁盘存储器的性能和调度

(1)磁盘的数据组织和格式

(2)磁盘格式化和磁盘分区

(3)磁盘调度算法

3.1 - 先来先服务(FCFS)

3.2 - 最短寻道时间优先(SSTF)

3.3 - 磁盘扫描(SCAN)算法

3.4 - 循环扫描(C-SCAN)算法

3.5 - NStep-SCAN 调度算法

3.6 - F-SCAN 调度算法


1、缓冲区管理

        缓冲区是一个存储区域,它可以由专门的硬件寄存器组成,也可以由内存组成。

        由寄存器组成的缓冲区较小,成本较高,一般仅用在对速度要求非常高的场合,如存储器管理中所用的联想存储器,设备控制器中用的数据缓冲区等。更多情况下,都是使用内存作为缓冲区。

(1)单缓冲区和双缓冲区

        如果在生产者与消费者之间未设置任何缓冲,生产者与消费者之间在时间上会相互限制。例如,生产者已经完成了数据的生产,但消费者尚未准备好接收,生产者无法把所生产的数据交付给消费者,此时生产者必须暂停等待,直到消费者就绪。如果在生产者与消费者之间设置了一个缓冲区,则生产者无需等待消费者就绪,便可把数据输出到缓冲区//例如消息队列

1.1 - 单缓冲区

        当用户进程发出 I/O请求时,操作系统便在主存中为之分配一个缓冲区。

        由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。如果消费者尚未取走缓冲区中的数据,即使生产者又生产出新的数据,也无法将它送入缓冲区,生产者等待。

1.2 - 双缓冲区

        为了加快输入和输出速度,提高设备利用率,又引入了双缓冲区机制,也称为缓冲对换(Buffer Swapping)。在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。//表面上看,无非就是多了一份缓冲区容量

        双缓冲区在两台机器之间的通信应用

        如果两台机器之间的通信仅使用单缓冲区,那么它们之间在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从 A 传送到 B 或者从 B 传送到 A,而绝不允许双方同时向对方发送数据。//半双工通信

        为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区。

(2)环形缓冲区/多缓冲区

        环形缓冲区由多个缓冲区的组成,其每个缓冲区的大小相同。其中的缓冲区可分为三种类型:空缓冲区 R已装满数据的缓冲区 G 以及正在使用的缓冲区 C,如下图所示。//多缓冲区

        因此,环形缓冲区也包含多个指针。如,用于指示下一个有数据的缓冲区 G 的指针 Nextg,指示下次可用的空缓冲区 R 的指针 Nexti,以及用于指示正在使用的缓冲区 C 的指针 Current。

// 对空间的循环使用,比如循环队列等

(3)缓冲池(Buffer Pool)

        当系统较大时,会有许多的循环缓冲区,这不仅要消耗大量的内存空间,而且其利用率不高。为了提高缓冲区的利用率,可以使用既可用于输入又可用于输出的公用缓冲池,在池中设置了多个可供进程共享的缓冲区//统一管理缓冲区

        缓冲池与缓冲区的区别在于:缓冲区仅仅是一组内存块的链表,而缓冲池则是包含了一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区。//好比管程的思想,统一管理一组信号量

3.1 - 缓冲池的组成

        缓冲池管理着多个缓冲区,每个缓冲区由缓冲首部缓冲体两部分组成。

  • 缓冲首部用于标识和管理缓冲区,一般包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列链接指针等。
  • 缓冲体:用于存放数据。

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

  • 空白缓冲队列 emq。由空缓冲区所链成的队列。其队首指针 F(emg) 和队尾指针 L(emq) 分别指向该队列的首缓冲区和尾缓冲区。
  • 输入队列 inq。由装满输入数据的缓冲区所链成的队列。其队首指针 F(ing) 和队尾指针 L(inq) 分别指向输入队列的队首和队尾缓冲区。
  • 输出队列 outq。由装满输出数据的缓冲区所链成的队列。其队首指针 F(outq) 和队尾指针 L(outq) 分别指向该队列的首、尾缓冲区。

        除了上述三个队列外,还应具有四种工作缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收容输出数据的工作缓冲区,以及用于提取输出数据的工作缓冲区。

3.2 - 缓冲池的工作方式

  1. 收容输入。从空缓冲队列 emq 的队首摘下一空缓冲区,作为收容输入工作缓冲区 hin。当缓冲区 hin 数据装满后,把它挂在输入队列 inq 队列上。//空队列->输入队列
  2. 提取输入。从输入队列 inq 的队首取得一缓冲区作为提取输入工作缓冲区 sin,从缓冲区 sin 中取完数据后,将它挂到空缓冲队列 emq 上。//输入队列->空队列
  3. 收容输出。从空缓冲队列 emq 的队首取得一空缓冲区,作为收容输出工作缓冲区 hout。当缓冲区 hout 装满输出数据后,将它挂在输出队列 outq 的末尾。//空队列->输出队列
  4. 提取输出。从输出队列 outq 的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区 sout。缓冲区 sout 数据提取完后,将它挂在空缓冲队列末尾。//输出队列->空队列

// 缓冲池的工作,就是对三种队列的操作和转换过程。

2、磁盘存储器的性能和调度

        磁盘 I/O 速度的高低和磁盘系统的可靠性,将直接影响到系统的性能。

        可以通过多种途经来改善磁盘系统的性能。首先可通过选择好的磁盘调度算法,以减少磁盘的寻道时间;其次是提高磁盘 I/O 速度,以提高对文件的访问速度;第三采取冗余技术,提高磁盘系统的可靠性,建立高度可靠的文件系统。

(1)磁盘的数据组织和格式

        磁盘设备可包括一个或多个物理盘片,每个磁盘片分一个或两个存储面(Surface),每个盘面上有若干个磁道(Track),磁道之间留有必要的间隙(Gap)。//物理盘片->存储面->磁道->扇区(数据块)

        为使处理简单起见,在每条磁道上可存储相同数目的二进制位。这样,磁盘密度即每英寸中所存储的位数,显然是内层磁道的密度较外层磁道的密度高

        每条磁道又被从逻辑上划分成若干个扇区(Sectors),软盘大约为 8 至 32 个扇区,硬盘则可多达数百个。一个扇区称为一个盘块(或数据块),各扇区之间保留一定的间隙(Gap)。

        一个物理记录存储在一个扇区上,磁盘上能存储的物理记录块数目是由扇区数、磁道数以及磁盘面数所决定的。例如,一个 10GB 容量的磁盘,有 8 个双面可存储盘片,共 16 个存储面(盘面),每面有 16383 个磁道(也称柱面),63个扇区。// 10G/16 = 64M/存储面

(2)磁盘格式化和磁盘分区

        为了在磁盘上存储数据,必须先将磁盘低级格式化// 磁盘的容量划分

        下边为一条磁道格式化的情况。其中每条磁道(Track)含有 30 个固定大小的扇区(Sectors),每个扇区容量为 600 个字节,其中 512 个字节存放数据,其余的用于存放控制信息。

        每个扇区包括两个字段:

  1. 标符字段(ID Field):其中一个字节的 SYNCH 具有特定的位图像,作为该字段的定界符,利用磁道号(Track)、磁头号(Head #)及扇区号(Sectors #)三者来标识一个扇区;CRC 字段用于段校验。
  2. 数据字段(Data Field):存放 512 个字节的数据。

        值得强调的是,在磁盘一个盘面的不同磁道(Track)、每个磁道的不同扇区(Sector),以及每个扇区的不同字段(Field)之间,为了简化和方便磁头的辨识,都设置了一个到若干个字节不同长度的间距(Gap,也称间隙)。

        磁盘分区:在磁盘格式化完成后,一般要对磁盘进行分区。在逻辑上,每个分区就是一个独立的逻辑磁盘。每个分区的起始扇区和大小都记录在分区表中。// 磁盘分区,就是把物理磁盘分为多个逻辑磁盘

(3)磁盘调度算法

        磁盘调度算法的目的:减少对文件的访问时间,使各进程对磁盘的平均访问时间最小。

        由于在访问磁盘的时间中主要是寻道时间,因此,磁盘调度的目标是使磁盘的平均寻道时间最少

3.1 - 先来先服务(FCFS)

        最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度

        此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。

        但此算法未对寻道进行优化,致使平均寻道时间可能较长

3.2 - 最短寻道时间优先(SSTF)

        该算法选择要求访问的磁道与当前磁头所在的磁道距离最近的进程进程处理,以使每次的寻道时间最短,但这种算法并不能保证平均寻道时间最短。//可能出现饥饿现象

3.3 - 磁盘扫描(SCAN)算法

        SSTF 算法的实质是基于优先级的调度算法,因此就可能导致优先级低的进程发生“饥饿”(Starvation)现象。

        扫描(SCAN)算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。// 距离+移动方向

        磁头自里向外移动,到达最外磁道后,又从外向里移动,对整个磁盘进行扫描,这种算法中磁头移动的规律颇似电梯的运行,因而又常称之为电梯调度算法。//问题在于,每次都会扫描到最外层,尽管此时已经没有必要

3.4 - 循环扫描(C-SCAN)算法

        SCAN 算法既能获得较好的寻道性能,又能防止“饥饿”现象,但是当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。// 进程请求被推迟

        为了减少这种延迟,C-SCAN 算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。//此时,磁头不再回到一个固定的外层起点

3.5 - NStep-SCAN 调度算法

        在SSTF、SCAN 及 C-SCAN 几种调度算法中都可能出现磁臂停留在某处不动的情况。例如,有一个或几个进程对某一磁道有较高的访问频率,即反复请求对某一磁道的 I/O 操作,从而垄断了整个磁盘设备。我们把这一现象称为“磁臂粘着”(Armstickiness)。在高密度磁盘上容易出现此情况。

        N 步 SCAN 算法将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列。而每处理一个队列时按照 SCAN 算法,对一个队列处理完后,再处理其他队列。当正在处理某子队列时,如果又出现新的磁盘 I/O 请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。//先处理前一个队列中的进程请求,再处理下一个队列中的进程请求,每个队列固定容量

        当 N 值取得很大时,会使 N 步扫描法的性能接近于 SCAN 算法的性能;当 N = 1 时,N 步 SCAN 算法便蜕化为 FCFS 算法。

3.6 - F-SCAN 调度算法

        F-SCAN 算法实质上是 N 步 SCAN 算法的简化,即 F-SCAN 只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理。另一个是在扫描期间,将新出现的所有请求磁盘 I/O 的进程放入等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。//当前进程队列+扫描期间的进程队列

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

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

相关文章

面向对象进阶一(static,继承,多态)

面向对象进阶一 一、static二、继承2.1 继承的定义和特点2.2 继承内容、成员变量和成员方法的访问特点2.2.1继承内容2.2.2 成员变量的访问特点2.2.3 成员方法的访问方法、方法的重写 2.3 继承中构造方法的访问特点 三、this、super使用总结四、多态4.1 多态的基本概念4.2 多态调…

MySQL 学习笔记 2:触发器

MySQL 学习笔记 2:触发器 图源:ubiq.co 触发器,就像字面意思那样,它会在数据库某些事件发生时执行一些操作。 具体来说,触发器会在特定表的INSERT、UPDATE、DELETE这些类型的 SQL 语句执行时被“触发”,并…

CopyOnWriteArrayList使用以及原理分析

文章目录 一、CopyOnWriteArrayList的简介二、CopyOnWriteArrayList类的继承关系1、Iterable接口:2、Collection接口:3、List接口:4、Cloneable接口:5、Serializable接口:6、RandomAccess接口: 三、CopyOnW…

模糊图片怎么修复清晰度?这几个方法分享给你~

在我们的日常生活和工作中,经常会遇到图片模糊的问题,这可能是由于拍摄时的手抖、对焦不准确或者图片压缩过度等原因造成的。那么,如何修复模糊的图片,提高其清晰度呢?本文将为您介绍几种方法。 方法一:使…

ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>

原文链接:https://blog.csdn.net/xiefireworks/article/details/113037650 阿里云接口文档请参考官网地址 https://help.aliyun.com/document_detail/59210.html?spm5176.8195934.J_5834642020.5.11ba4378DLVi4O 此处仅介绍使用ABAP完成阿里云短信服务签名请求的…

树莓派4B的串口UART配置

1 安装串口: 如果没有更换pip源会报错,所以指定安装源 pip install pyserial -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 修改uart配置: vim /boot/firmware/config.txt 在末尾添加: dtoverlayuart2…

X86架构的Linux(Ubuntu版本)上离线安装CUnit来解决Could not find CUnit(missing:CUNIT_LIBRARY)问题

前言1 下载cunit压缩安装包:CUint-2.1-3.tar.bz2(为了安装成功请下载对应版本)2 解压安装压缩包3 sudo ./bootstrap --prefix/usr/local/cunit 生成可执行文件configure*4 sudo ./configure --prefix/usr/local/cunit5 sudo make . 编译 &…

Centos安装指定docker版本和docker-compose

目录 一. 直接安装Docker最新镜像源 1. 卸载旧版本的Docker: 2. 安装依赖包: 3. 添加Docker源: 4. 安装Docker: 5. 启动Docker服务: 6. 验证Docker是否安装成功: 二、指定Docker版本安装 1. 查看…

已解决‘mongo‘ 不是内部或外部命令,也不是可运行的程序

已解决(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序 报错代码 粉丝群里的一个小伙伴安装完MongoDB后,在cmd中启动,却说不是可运行的命令? 报错原因 报错原因:由于没有配置环境变量的…

【Redis】4、全局唯一 ID生成、单机(非分布式)情况下的秒杀和一人一单

目录 一、利用 Redis 实现全局唯一 ID 生成(1) 为啥要用全局唯一 ID 生成(2) 全局唯一 ID 生成器(3) 全局 ID 的结构(4) 代码实现① RedisIdWorker② Test (5) 全局唯一 ID 其他生成策略 二、添加优惠券(1) 数据库(2) 添加优惠券接口 三、优惠券秒杀下单功能(1) 超卖问题(2) 乐…

项目上线“G”速报 | GBASE助力四川银行反洗钱系统上线运行

随着金融机构资管业务的不断发展,藉由以银行为代表的金融机构建设反洗钱系统,向执法机构报送可疑活动,成为侦测潜在金融犯罪、打击腐败的重要防线。为更好助力反洗钱工作,四川银行着手构建新一代的反洗钱系统。作为信创第二期的重…

重磅预告丨Fortinet Demo Day系列实战攻防演练来袭!

随着网络安全形势的日趋严峻,越来越多的企业遭受了勒索、欺诈等危害。在高昂的赎金、生产损失,以及名誉损害的恐惧中,企业已经谈“黑”色变。黑客是如何悄无声息的“越过”重重高墙、道道壁垒进入到生产环境、办公空间,并在内网疯…

Android各种支持裤的最新依赖以及用户文档

https://developer.android.com/jetpack/androidx/versions 链接截图如下: 点击“Release Notes”中的链接,如果对应支持库有用户指南还能看到对应链接,还有如何添加依赖等,比如支持库中的actviity,如下:截…

【漂移-扩散通量重建 FV 方案】用于半导体和气体放电模拟的电子传输的更准确的 Sharfetter-Gummel 算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Perl 7 - 使用 Perlbrew 管理perl 版本

文章目录 关于 Perlbrew安装 Perlbrew使用 perlbrew 安装/管理 perl 版本 关于 Perlbrew 官网:https://perlbrew.pl 相关文档: App::perlbrew https://metacpan.org/pod/App::perlbrew Perlbrew 是一个工具,用于管理您$HOME 目录(或您指定的…

Flink基于信用值的流量控制

背景 flink内部实现了一个类似于tcp滑动窗口概念的流量控制功能,以满足其内部的流量控制功能,本文就来讲解下flink实现的基于信用值的流量控制的原理 实现原理 首先,我们先来看一下在flink中是如何实现数据传输的, 从上图可知&…

css animation 鼠标移入暂停会抖动

如图 实现一个赞助商横向滚动列表墙, 上下两排向右滚动,中间向左滚动,鼠标移入暂停当前行。 实现: // 使用animation.moving {animation: move 20s linear infinite; }keyframes move {0% {}100% {transform: translateX(-50%);…

可靠的手机问题修复工具分享 - 修复各种 Android 系统问题

一般来说,安卓手机都可以流畅运行。但不幸的是,有时您的Android手机可能无法正常运行,例如无响应、突然重启等。在这种情况下,您将需要Android手机维修软件。这些 Android 修复工具可以帮助您轻松解决此类问题,并还给您…

QEMU源码全解析4 —— QEMU参数解析(4)

接前一篇文章:QEMU源码全解析3 —— QEMU参数解析(3) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 本回讲解Q…

JavaWeb学生考勤签到请假系统

一、项目简介 本项目是一套JavaWeb学生考勤签到请假系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,ecl…