4.1_5 文件存储空间管理

文章目录

  • 4.1_5 文件存储空间管理
    • (一)存储空间的划分与初始化
    • (二)存储空间管理——空闲表法
    • (三)存储空间管理——空闲链表法
      • (1)空闲盘块链
      • (2)空闲盘区链
    • (四)存储空间管理——位示图法
    • (五)存储空间管理——成组链接法
  • 总结

4.1_5 文件存储空间管理

image-20240317184135931

image-20240317184142478

(一)存储空间的划分与初始化

  安装 Windows 操作系统的时候,一个必经步骤是——为磁盘分区(C: 盘、D: 盘、E: 盘等)。

  存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)。

image-20240317184341735

image-20240317184418443

(二)存储空间管理——空闲表法

image-20240317184536653

  如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

  如图,假设采用“首次适应算法”。此时有一个新文件申请请求3个块,那么系统会从前到后依次扫描,找到第一个满足的空闲块。当扫描到“空闲盘块表”的第三个表项,即第一个空闲盘块号为13,空闲盘块数为5时(原本13~17号块都是空闲的、绿色的),选择此处放入。并更新空闲盘块数为2

  如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况。

  ①回收区的前后都没有相邻空闲区;

  ②回收区的前后都是空闲区;

  ③回收区前面是空闲区;

  ④回收区后面是空闲区。

  总之,回收时需要注意表项的合并问题

(三)存储空间管理——空闲链表法

image-20240317185245950

image-20240317185321863

(1)空闲盘块链

image-20240317185435133

  操作系统保存着链头、链尾指针

  如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。

  如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。

  适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作。

(2)空闲盘区链

image-20240317185547984

  操作系统保存着链头、链尾指针

  如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。

  如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。

  离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高。

(四)存储空间管理——位示图法

image-20240317202212962

位示图

  每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为**(行号,列号)**。

  重要重要重要:要能自己推出盘块号与(字号,位号)相互转换的公式。

  注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始。

  如本例中盘块号、字号、位号从0开始,若n表示字长,则:

  (字号, 位号) = (i, j)的二进制位对应的盘块号b=ni + j

  b号盘块号对应的字号i = b/n,位号j = b%n

  例:

  (0, 1) —> b = 16*0 + 1 = 1;

  (1, 10) —> b = 16*1 + 10 + 26;

  b = 13 —> i = 13/16 = 0,j = 13%16 = 13;

  b = 31 —> i = 31/16 = 1,j = 31%16 = 15。

如何分配

  若文件需要K个块,则

  ①顺序扫描位示图,找到K个相邻或不相邻的“0”;

  ②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;

  ③将相应位设置为“1”。

如何回收

  ①根据回收的盘块号计算出对应的字号、位号;

  ②将相应二进制位设为“0”。

  位示图法——连续分配、离散分配都适用。

(五)存储空间管理——成组链接法

  空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。

  文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

image-20240317203509839

image-20240317203615245

如何分配?

Eg:需要1个空闲块。

①检查第一个分组的块数是否足够。1<100,因此是足够的。

②分配第一个分组中的1个空闲块,并修改相应数据。

image-20240317204101434

Eg:需要100个空闲块。

①检查第一个分组的块数是否足够。100=100,是足够的。

②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。

image-20240317204250955

image-20240317204309732


如何回收?

Eg:假设每个分组最多为100个空闲块,此时第一个分组已 有99个块,还要再回收一块。

image-20240317204444030

Eg:假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。

  需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。

image-20240317204531528

image-20240317204606822

image-20240317204647351

总结

image-20240317204705847

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

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

相关文章

VScode----debug调试python代码添加上额外命令(args)

这里写目录标题 问题描述问题解决 更多内容可以点击这里查看个人博客&#xff1a;个人博客 问题描述 在服务器上运行python代码时&#xff0c;总会添加上额外的参数一般是用jyputer或者终端直接加上命令&#xff0c;现在我在vscode调试远程代码的时候想要加上这些命令. 问…

DFL《384底丹 430万》 wf/df-udt/448/96/96/32预训练模型

384底丹430万迭代&#xff1a;点击下载 训练素材19万张来自于以下数据集&#xff1a; 【更新】DST全角度训练图集V3.1 WF512【2.6W张 6GB 】【人脸混合_WF】FFHQ女性人脸数据&#xff0c;预训练炼丹专用【金鱼基础模型库】用于补全SRC极限角度香港中文大学CelebA预训练集-WF5…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面&#xff0c;上下拖动屏幕&#xff0c;顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

Vue-router3.0版本跳转报错

1.路由创建之后发现控制台push路由跳转报错了 2.解决方法&#xff1a; //在router文件中添加 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location) {return originalPush.call(this, location).catch(err > err) }3.解决了

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网

知识点&#xff1a; 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类&#xff1a; GroovyRuntimeExecPr…

git如何回退版本reset和revert命令的区别

文章目录 git回退版本的方法使用reset回退使用revert回退 总结 git回退版本的方法 Git回退到某个版本有两种方法&#xff1a;reset和revert。 使用reset回退 git reset --hard <版本号>该命令将HEAD指针移动到指定的版本&#xff0c;并重置工作目录和暂存区的内容。这…

微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应

进入下面小程序可以体验效果&#xff1a; 至于原理的话&#xff0c;解释起来毕竟麻烦&#xff0c;各位可以看源码自己分析。其实很简单&#xff0c;就算计算布局。很多网上公布的布局&#xff0c;都不能正常自适应。在下这个是完美可以的 1、WXML <view class"weui…

【遍历方法】浅析Java中字符串、数组、集合的遍历

目录 前言 字符串篇 1.1 使用 for 循环和 charAt 方法 1.2 使用增强 for 循环&#xff08;forEach 循环&#xff09; 1.3 使用 Java 8 的 Stream API 最终效果 数组篇 2.1 使用普通 for 循环 2.2 使用增强型 for 循环( forEach 循环) 2.3 使用 Arrays.asList 和 forE…

Python之Web开发中级教程----配置数据库

Python之Web开发中级教程----配置数据库 在settings.py中保存了数据库的连接配置信息&#xff0c;Django默认初始配置使用sqlite数据库。 DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: os.path.join(BASE_DIR, db.sqlite3), } } 如果需要用MySQL数据…

LeetCode 0310.最小高度树:拓扑排序秒了

【LetMeFly】310.最小高度树&#xff1a;拓扑排序秒了 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-height-trees/ 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;一个任何没有简单环路的连通图都是一棵树。 给你…

nginx做静态代理方式

改配置文件 server {listen 8899;server_name localhost;location / {root html;index index.html index.htm;} } 生成页面代码 例子 GetMapping("createIndex")public Result createIndex() {//获取后台存储数据Result result productFeignClient.getB…

python之万花尺

1、使用模块 import sys, random, argparse import numpy as np import math import turtle import random from PIL import Image from datetime import datetime from math import gcd 依次使用pip下载即可 2、代码 import sys, random, argparse import numpy as np imp…

Linux环境开发工具之yum

前言 前面我们已经对基本的指令和权限进行了介绍&#xff0c;本期开始我们将介绍常用的开发工具。例如&#xff1a;软件包管理器yum。 本期内容介绍 Linux上安装软件的方式 什么是yum yum的相关操作 yum的本地配置和yum源 一、Linux上安装软件的方式 在介绍Linux上如何安装一…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中&#xff0c;应用性能监控&#xff08;Application Performance Monitoring, APM&#xff09;扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking&#xff0c;通过对其功能特性和工作原理的详细介绍&am…

打破数据孤岛,TDengine 与 Tapdata 实现兼容性互认证

当前&#xff0c;传统行业正面临着数字化升级的紧迫需求&#xff0c;但海量时序数据的处理以及数据孤岛问题却日益突出。越来越多的传统企业选择引入时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;升级数据架构&#xff0c;同时&#xff0c;为了克服…

C++ 笛卡尔树

目录 一、性质二、构建笛卡尔树三、应用四、源码 一、性质 堆性质&#xff1a; 笛卡尔树是一种满足堆性质的树。每个节点包含两个值&#xff1a;键值&#xff08;key&#xff09;和优先级值&#xff08;priority&#xff09;。在笛卡尔树中&#xff0c;根节点的优先级值最大&am…

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类&#xff08;单例模式&#xff09; 1. 前言 在实际场景中&#xff0c;我们在编写类的过程中总会遇到一些特殊情况&#xff0c;比如设计一个类不…

[AutoSar]BSW_Com015 PDUR 模块配置

目录 关键词平台说明一、Abbreviations二、PduRBswModules三、PduRGeneration四、PduRDestPdus4.1 全局PDU ID和本地PDU ID 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php