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

软考(软件设计师)存储管理—存储空间管理,文件共享保护

一、文件存取方法

1. 顺序存取(Sequential Access)
  • 原理:按记录写入顺序依次访问
  • 特点
    • 读操作:读取当前位置,指针自动前移
    • 写操作:追加到文件末尾
  • 适用场景:磁带设备、日志文件
文件头
记录1
记录2
记录3
当前指针
记录4
文件尾
2. 直接存取(Direct Access / Random Access)
  • 原理:直接定位到任意位置读写
  • 操作方式
    • seek(offset) 移动文件指针
    • read(size)/write(data) 在当前位置操作
  • 磁盘支持:通过计算物理地址实现
Program File seek(offset=1024) read(128 bytes) 返回第1024-1151字节 Program File
3. 索引存取(Indexed Access)
  • 原理:通过索引表查找记录位置
  • 工作流程
    1. 搜索索引找到记录键
    2. 获取记录物理地址
    3. 直接访问该地址
找到位置
查询记录 ID=100
搜索索引块
位置:0x1200
直接访问磁盘块0x1200

二、存储空间管理技术

1. 空闲空间管理方法
空闲空间管理
位示图 Bitmap
空闲链表
空闲区表
成组链接
2. 位示图法(Bitmap)

位示图法是一种用二进制位管理磁盘空间的技术,其基本原理如下:

  1. 数据结构:创建一个位数组(bit array),数组长度等于磁盘总块数
  2. 映射关系
    • 每个二进制位对应一个磁盘块
    • 0 表示空闲块
    • 1 表示已分配块
  3. 存储位置:位示图通常存储在磁盘固定位置(如超级块附近)
位示图
0=空闲
1=占用
0=空闲
...
状态
0
位0
1
位1
0
位2
...
...
?
位N
磁盘块0
磁盘块1
磁盘块2
...
磁盘块N
完整示例:16块磁盘的位示图管理

初始状态(全空闲):

磁盘块号: 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
位示图值: 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

操作1:分配块2、块5、块7

更新后位示图
块1:0
块0:0
块2:1
块3:0
块4:0
块5:1
块6:0
块7:1
其他:0
分配请求
扫描位示图
找到空闲块2,5,7
更新位示图

更新后位示图:

0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
0  0  1  0  0  1  0  1  0  0  0  0  0  0  0  0

操作2:分配3个连续块

App FS Bitmap 请求3个连续块 扫描连续3个0 找到块8-10 设置位8-10=1 确认更新 返回块8,9,10 App FS Bitmap

更新后位示图:

0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
0  0  1  0  0  1  0  1  1  1  1  0  0  0  0  0

操作3:释放块5和块10

释放块5
计算位置:i=5
设置bit5=0
释放块10
计算位置:i=10
设置bit10=0

更新后位示图:

0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
0  0  1  0  0  0  0  1  1  1  0  0  0  0  0  0
关键技术细节
1. 地址转换计算
  • 块号 → 位位置

    • 字节偏移 = 块号 / 8
    • 位偏移 = 块号 % 8
  • 示例:访问块13

    字节偏移 = 13 / 8 = 1 (第二个字节)
    位偏移 = 13 % 8 = 5
    检查第2字节的第5位(从0开始计数)
    
2. 空间占用计算

假设:

  • 磁盘容量:1TB
  • 块大小:4KB

计算过程:

总块数 = 1TB / 4KB = 2^30 / 2^12 = 2^18 = 262,144 块
位示图大小 = 262,144 bits / 8 = 32,768 bytes = 32KB
位示图法优缺点分析
优点缺点
✅ 空间效率高:仅需约 0.0039% 的额外空间(1/256)❌ 分配连续空间需线性扫描
✅ 状态切换快:位操作效率极高❌ 大磁盘中扫描效率低
✅ 实现简单:数据结构简洁❌ 外部碎片问题仍然存在
✅ 随机访问快:直接计算位置❌ 需要整个位图载入内存
3. 空闲链表法
  • 物理链表实现
空闲链头
块3
块7
块9
NULL

在这里插入图片描述

4. 空闲区表法(Extent-Based)
原理

空闲区表法(Free Space Management with Extent Lists)是一种通过记录连续空闲区域来管理磁盘空间的技术,特别适合处理连续分配的场景。其核心思想是:

  1. 数据结构:维护一张表格(或链表),每个表项记录:
    • 空闲区的起始块号
    • 空闲区的长度(连续块数)
  2. 分配策略:当需要空间时,在表中查找满足需求的空闲区
  3. 合并机制:释放空间时自动合并相邻空闲区
FreeExtent
+start_block: int
+block_count: int
+next: FreeExtent*
完整示例:16块磁盘的空闲区表管理

初始状态(全空闲):

空闲表头
起始块:0 长度:16
NULL

操作1:分配3个连续块

App FS FreeList 请求3个连续块 查找足够空闲区 找到[0-15]长度16 从头部分配3块 更新为[3-15]长度13 alt [首次适应] 返回块0-2 App FS FreeList

更新后空闲表:

空闲区1: 起始块=3, 长度=13

操作2:再分配5个连续块

首次适应
请求5块
查找策略
扫描表项
找到3-15长度13>5
分配块3-7
更新为起始块=8,长度=8

更新后空闲表:

空闲区1: 起始块=8, 长度=8

操作3:释放块0-2(3块)

与块8不相邻
释放块0-2
创建新空闲区
起始块=0,长度=3
检查相邻性
插入表头
新表:0,3->8,8

更新后空闲表:

空闲区1: 起始块=0, 长度=3
空闲区2: 起始块=8, 长度=8

操作4:释放块3-7(5块)

左邻块2
右邻块8
释放块3-7
创建新区间3,5
检查相邻性
与0,3合并:0+3+5=8 -> 0,8
与8,8合并:0+8+8=16 -> 0,16

最终空闲表:

空闲表头
起始块:0 长度:16
NULL
分配策略对比
策略操作方式优点缺点
首次适应从表头扫描,选择首个足够大的区域分配速度快易产生外部碎片
最佳适应扫描整个表,选择最小的足够区域减少大空闲区割裂易产生微小碎片
最差适应扫描整个表,选择最大的空闲区减少微小碎片破坏大空闲区
空间占用计算

假设:

  • 磁盘容量:1TB
  • 块大小:4KB
  • 平均空闲区大小:16块

计算:

总块数 = 1TB / 4KB = 256M 块
平均空闲区数 = 256M / 16 = 16M
表项大小 = 8字节(4字节起始块 + 4字节长度)
总空间 = 16M × 8B = 128MB
优缺点分析
优点缺点
✅ 减少外部碎片❌ 分配时间随表增大而增加
✅ 高效管理大文件❌ 小碎片无法利用
✅ 支持快速连续访问❌ 需要定期合并操作
✅ 实现相对简单❌ 大磁盘中表可能很大
5. UNIX成组链接法

成组链接法是UNIX文件系统采用的高效空闲块管理方法,核心思想是:

  1. 分组管理:将空闲块分成若干组
  2. 链式连接:每组最后一个块存储下一组信息
  3. 超级块缓存:内存中缓存第一组空闲块信息
块102指向
块202指向
超级块
块100,101,102
块200,201,202
块300,301,302
完整示例:12块磁盘的成组链接管理

初始状态(3块/组):

块3存储
块6存储
块9存储
块12存储
超级块
块1,2,3
下一组指针:块4
块4,5,6
下一组指针:块7
块7,8,9
下一组指针:块10
块10,11,12
结束标记:0

内存超级块内容:

空闲块数空闲块列表
3[1, 2, 3]

操作1:分配3个块

App SuperBlock Disk 请求分配3块 直接分配块1,2,3 读取块3内容 返回[下一组指针:块4] 读取块4内容 返回块4,5,6信息 分配成功 超级块更新为空闲数=3列表=[4,5,6] App SuperBlock Disk

操作2:再分配1个块

空闲数=3
分配1块
超级块状态
分配块4
更新超级块
空闲数=2
列表=5,6

操作3:释放块10,11,12

App SuperBlock Disk 释放块10,11,12 检查超级块状态 添加块10,11,12到列表 释放成功 将当前组写入新释放块 确认写入 重置超级块指向新组 alt [超级块未满] [超级块已满] App SuperBlock Disk
优缺点分析
优点缺点
✅ 分配效率高(O(1)平均)❌ 实现复杂度高
✅ 释放操作快速❌ 小规模磁盘不划算
✅ 减少磁盘I/O(超级块缓存)❌ 需维护链式结构
✅ 天然抵抗碎片化❌ 极端情况需递归加载

三、文件共享和保护

文件共享机制

软链接与硬链接

硬链接(Hard Link)

底层原理

在 Linux 文件系统中:

  • 每个文件对应一个唯一的 inode(索引节点)
  • inode 存储文件的元数据(权限、大小、时间戳等)
  • 硬链接是指向同一个 inode 的多个目录项
file.txt
backup.txt
目录A
Inode 123
目录B
数据块
元数据:链接数=2

创建与操作(终端命令)

# 创建原始文件
$ echo "Original Content" > original.txt# 创建硬链接
$ ln original.txt hardlink.txt# 查看inode信息
$ ls -li
123456 -rw-r--r-- 2 user group 17 Jan 1 10:00 hardlink.txt
123456 -rw-r--r-- 2 user group 17 Jan 1 10:00 original.txt
# ↑ 相同的inode号(123456)和链接数(2)# 修改硬链接文件
$ echo "New content" >> hardlink.txt# 检查原始文件
$ cat original.txt
Original Content
New content# 删除原始文件
$ rm original.txt# 硬链接仍然有效
$ cat hardlink.txt
Original Content
New content

关键特性

特性说明
inode 相同所有硬链接共享同一 inode
文件大小与原文件相同(不占用额外空间)
跨文件系统❌ 不支持
链接目录❌ 不允许(避免循环引用)
删除影响减少链接计数,仅当计数为0时删除数据
权限同步所有硬链接权限始终相同(同一 inode)

使用场景

  • 文件多重备份(防止误删)
  • 同一文件需要在多个位置访问
  • 节省空间的"副本"创建
软链接(Symbolic Link / Symlink)

底层原理

  • 软链接是独立的文件,有自己的 inode
  • 内容存储目标文件的路径(字符串)
  • 类似Windows的快捷方式
file.txt
symlink.txt
内容为
目录A
Inode 123
数据块
目录B
Inode 456
/path/to/file.txt

创建与操作(终端命令)

# 创建原始文件
$ echo "Source Content" > source.txt# 创建软链接(绝对路径)
$ ln -s /home/user/source.txt abs_link.txt# 创建软链接(相对路径)
$ ln -s source.txt rel_link.txt# 查看链接信息
$ ls -l
lrwxrwxrwx 1 user group 11 Jan 1 10:00 abs_link.txt -> /home/user/source.txt
lrwxrwxrwx 1 user group 10 Jan 1 10:00 rel_link.txt -> source.txt
-rw-r--r-- 1 user group 15 Jan 1 10:00 source.txt# 访问软链接
$ cat rel_link.txt
Source Content# 删除原始文件
$ rm source.txt# 软链接失效(断链)
$ cat rel_link.txt
cat: rel_link.txt: No such file or directory# 检查断链状态
$ ls -l rel_link.txt
lrwxrwxrwx 1 user group 10 Jan 1 10:00 rel_link.txt -> source.txt  # 红色显示

关键特性

特性说明
inode独立于目标文件
文件大小等于路径字符串长度
跨文件系统✅ 支持
链接目录✅ 允许
删除影响目标文件删除后失效
权限总是 777(实际权限由目标决定)

核心区别对比

特性硬链接软链接
本质同一文件的多个目录项存储路径的特殊文件
inode与目标文件相同独立 inode
跨文件系统❌ 不支持✅ 支持
链接目录❌ 禁止✅ 允许
原始文件删除仍可访问(链接数减1)链接失效(断链)
文件大小与目标文件相同路径字符串长度
路径依赖相对路径依赖位置
更新影响所有链接同步更新链接指向不变,目标可更换
权限与目标相同总是 lrwxrwxrwx
查找命令find . -samefile 文件find -type l -ls
Linux 系统视角
Inode表
文件A inode
文件B inode
软链接 inode
数据块
数据块
路径字符串
目录
fileA → inodeX
hardlink → inodeX
目录
symlink → inodeY
文件保护机制
1. 访问控制矩阵
访问控制矩阵
域:用户/进程
对象:文件
权限:R/W/X
2. 访问控制列表(ACL)
  • 原理:为每个文件维护权限列表
  • 结构
文件X ACL
用户A:RWX
用户B:R--
组C:R-X
3. UNIX权限模型(9-bit)

权限位分解

“文件类型”: 1
“所有者权限” : 3
“组权限” : 3
“其他用户” : 3

权限示例

第一位表示文件的类型,-代表文件,d代表目录

 -rwxr-xr--↑↑↑↑ ↑↑│||| |└─ 其他:读│||| └── 组:执行│|│└── 组:读││└──── 所有者:执行|└───── 所有者:写└────── 所有者:读

[“hardlink → inodeX”]
Directory2[目录] --> EntryC[“symlink → inodeY”]


#### 文件保护机制##### 1. 访问控制矩阵```mermaid
graph LRA[访问控制矩阵] --> B[域:用户/进程]A --> C[对象:文件]B --> D[权限:R/W/X]
2. 访问控制列表(ACL)
  • 原理:为每个文件维护权限列表
  • 结构
文件X ACL
用户A:RWX
用户B:R--
组C:R-X
3. UNIX权限模型(9-bit)

权限位分解

“文件类型”: 1
“所有者权限” : 3
“组权限” : 3
“其他用户” : 3

权限示例

第一位表示文件的类型,-代表文件,d代表目录

 -rwxr-xr--↑↑↑↑ ↑↑│||| |└─ 其他:读│||| └── 组:执行│|│└── 组:读││└──── 所有者:执行|└───── 所有者:写└────── 所有者:读
http://www.dtcms.com/a/269120.html

相关文章:

  • 虚幻引擎Gameplay框架
  • STM32固件升级设计——串口IAP升级(基于YMODEM协议)
  • CosyVoice2.0整合包:免费一键启动,释放语音克隆的创意潜能
  • day048-系统负载高排查流程与前后端分离项目
  • 上传Vue3+vite+Ts组件到npm官方库保姆级教程
  • python高级变量XIV
  • 【数据结构之哈夫曼树与编码实现】
  • 【Linux操作系统】简学深悟启示录:Linux基本指令
  • OpenStack扩展
  • 05. study_JSBridge机制
  • 7.7日 实验03-Spark批处理开发(2)
  • Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
  • C++11标准库算法:深入理解std::none_of
  • 低代码平台的性能测试实践与挑战
  • qiankun 微前端项目中的 Token 鉴权方案
  • python dict list 去重
  • 【数据驱动视角下的流体模拟:CFD 与深度学习(GANs/PINN)在圆柱绕流及机翼分析中的应用】
  • Video Background Remover V3版 - AI视频一键抠像/视频换背景 支持50系显卡 一键整合包下载
  • 动手学深度学习13.7. 单发多框检测(SSD)-笔记练习(PyTorch)
  • Pycharm恢复默认设置,配置导致复制粘贴等不能使用
  • 气候大模型的演化路径与产业落地展望:AI重构全球气候科学的新范式
  • 在bash shell 函数传递数组的问题
  • CSS知识复习4
  • 卷积神经网络:卷积层的核心原理与机制
  • MATLAB | 绘图复刻(二十一)| 扇形热图+小提琴图
  • C++11中的std::ratio:编译时有理数运算的艺术
  • 暑假算法日记第三天
  • WebRTC与RTMP
  • iOS App抓包工具排查后台唤醒引发请求异常
  • Python编译器(Pycharm Jupyter)