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

美食网站开发计划如何连接wordpress

美食网站开发计划,如何连接wordpress,淘宝网站建设方案,网站是如何设计配置方案的第七章 文件管理 文章目录第七章 文件管理7.1 文件和文件系统7.1.1 数据项、记录和文件7.1.2 文件名和类型7.1.3 文件系统的层次结构7.1.4 文件操作7.2 文件的逻辑结构7.2.1 文件逻辑结构的类型7.2.2 顺序文件(Sequential File)7.2.3 记录寻址7.2.4 索引文件(Index File)7.2.5 …第七章 文件管理 文章目录第七章 文件管理7.1 文件和文件系统7.1.1 数据项、记录和文件7.1.2 文件名和类型7.1.3 文件系统的层次结构7.1.4 文件操作7.2 文件的逻辑结构7.2.1 文件逻辑结构的类型7.2.2 顺序文件(Sequential File)7.2.3 记录寻址7.2.4 索引文件(Index File)7.2.5 索引顺序文件(Index Sequential File)7.2.6 直接文件和哈希文件7.3 文件目录7.3.1 文件控制块和索引结点7.3.2 简单的文件目录7.3.3 树形结构目录(Tree-Structured Directory)7.3.4 目录查询技术7.4 文件共享7.4.1 基于有向无循环图实现文件共享7.4.2 利用符号链接实现文件共享7.5 文件保护7.5.1 保护域(Protection Domain)7.5.2 访问矩阵7.5.3 访问矩阵的修改7.5.4 访问矩阵的实现7.6 文件存储空间管理 - 空闲磁盘块管理7.6.1 存储空间的划分与初始化7.6.2 存储空间管理7.7 虚拟文件系统和文件系统挂载7.1 文件和文件系统 7.1.1 数据项、记录和文件 1、数据项 数据项Data Item文件系统中最低级的数据组织形式用于**描述对象的属性或特征**。可分为两种类型 基本数据项字段 定义描述对象 单一属性的最小逻辑单位不可再分。 组成 基本数据项的 “型” 数据名 数据类型 数据名如“学号”、“姓名” 数据类型如整数、字符串、布尔值 值如“30211”、“王有年” 组合数据项组项 定义由 多个基本数据项组合 而成的复合属性。 特点 可拆分。 逻辑上作为一个整体处理。 例子 工资 { 基本工资: xxxx, 工龄工资: xxxx, 奖励工资: xxxx }2、记录 记录 一组相关数据项的集合用于描述对象的某方面属性。 1️⃣ 记录的数据项组成 记录包含哪些数据项取决于对象的描述需求 示例1学生作为“班级成员” 数据项类型示例值学号整数30211姓名字符串王有年年龄整数20所在班级字符串计算机2023课程成绩组合数据项{数学:90, 英语:85}示例2学生作为“医疗对象” 数据项类型示例值病历号字符串M20231105身高浮点数175.5体重浮点数65.2病史字符串列表[“过敏性鼻炎”] 同一对象在不同场景下记录的数据项可能完全不同 2️⃣ 关键字Key 定义能 唯一标识一条记录的数据项或数据项组合。 作用快速定位、避免重复类似数据库的主键。 关键字类型 单字段关键字最常见例如学号、病历号保证不重复即可。复合关键字多字段组合当单个字段无法唯一标识时使用如姓名出生日期。 ⚠️ 关键字的选择原则 唯一性不能有两条记录的关键字相同。稳定性尽量选择不常变动的字段如学号比年龄更适合作关键字。简洁性优先用单个字段实在不行再用组合。 3、文件 文件的定义与分类 文件 由 创建者定义 、具有 文件名 的 一组相关元素 的集合。 文件的两种结构类型 类型特点应用场景典型应用有结构文件由 若干个相关记录Records 组成 适用于需要频繁查询/修改部分数据的场景数据库表、学生档案无结构文件视为 字符流连续的字节序列适合整体读写如照片、视频文本文件、图像、二进制文件 文件属性File Attributes 属性说明示例文件类型 用途或格式分类如.txt、.exe、.mp4.pyPython源码文件长度 当前大小字节/KB/GB或最大允许长度1024 KB物理位置 存储的设备和地址如磁盘C:、扇区编号/dev/sda1, 块号2048建立/修改时间 ⏰创建时间、最后修改时间2023-10-05 14:30:00 ❗ 注意 这些属性由 文件系统管理用户不可直接修改如物理位置。文件的类型和长度影响其存储和访问方式。 4、文件 vs 记录 vs 数据项 的层次关系 #mermaid-svg-mNDb8stVUgy9qQgc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .error-icon{fill:#552222;}#mermaid-svg-mNDb8stVUgy9qQgc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mNDb8stVUgy9qQgc .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mNDb8stVUgy9qQgc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mNDb8stVUgy9qQgc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mNDb8stVUgy9qQgc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mNDb8stVUgy9qQgc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mNDb8stVUgy9qQgc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mNDb8stVUgy9qQgc .marker.cross{stroke:#333333;}#mermaid-svg-mNDb8stVUgy9qQgc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mNDb8stVUgy9qQgc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .cluster-label text{fill:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .cluster-label span{color:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .label text,#mermaid-svg-mNDb8stVUgy9qQgc span{fill:#333;color:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .node rect,#mermaid-svg-mNDb8stVUgy9qQgc .node circle,#mermaid-svg-mNDb8stVUgy9qQgc .node ellipse,#mermaid-svg-mNDb8stVUgy9qQgc .node polygon,#mermaid-svg-mNDb8stVUgy9qQgc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mNDb8stVUgy9qQgc .node .label{text-align:center;}#mermaid-svg-mNDb8stVUgy9qQgc .node.clickable{cursor:pointer;}#mermaid-svg-mNDb8stVUgy9qQgc .arrowheadPath{fill:#333333;}#mermaid-svg-mNDb8stVUgy9qQgc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mNDb8stVUgy9qQgc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mNDb8stVUgy9qQgc .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-mNDb8stVUgy9qQgc .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-mNDb8stVUgy9qQgc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mNDb8stVUgy9qQgc .cluster text{fill:#333;}#mermaid-svg-mNDb8stVUgy9qQgc .cluster span{color:#333;}#mermaid-svg-mNDb8stVUgy9qQgc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mNDb8stVUgy9qQgc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-mNDb8stVUgy9qQgc .file*{fill:#faf!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .file span{fill:#faf!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .struct*{fill:#6af!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .struct span{fill:#6af!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .data*{fill:#2ec27e!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .data span{fill:#2ec27e!important;stroke:#333!important;stroke-width:2px!important;color:white!important;}#mermaid-svg-mNDb8stVUgy9qQgc .field*{fill:#a8748c!important;stroke:#333!important;stroke-width:1px!important;}#mermaid-svg-mNDb8stVUgy9qQgc .field span{fill:#a8748c!important;stroke:#333!important;stroke-width:1px!important;}#mermaid-svg-mNDb8stVUgy9qQgc .group*{fill:#a8748c!important;stroke:#333!important;stroke-width:1px!important;}#mermaid-svg-mNDb8stVUgy9qQgc .group span{fill:#a8748c!important;stroke:#333!important;stroke-width:1px!important;}文件 File有结构文件记录 Record无结构文件字符流数据项 Data Item基本数据项--字段组合数据项--组项7.1.2 文件名和类型 1、文件名和扩展名 文件名【同一目录下不允许有重名文件】 1. 文件名长度限制 系统/文件系统最大长度限制特点MS-DOS8字符短文件名老系统严格限制旧版 UNIX14字符早期标准NTFSWin NT255字符长文件名✅现代系统支持长文件名 ❗ 2. 禁用字符 常见禁用符号空格、*/:?\|因用作命令分隔符或路径符现代系统改进NTFS/Linux 允许空格需用引号或转义符包裹如 my file.txt。 3. 大小写敏感性问题 系统类型是否区分大小写示例是否相同文件MS-DOS/Win95❌ 不区分MYFILE myfileUNIX/Linux✅ 严格区分MYFILE ≠ myfile扩展名 1. 扩展名的作用 标识文件类型通过扩展名后缀快速识别文件的格式和用途。 例如.txt → 文本文件.jpg → 图片文件.exe → 可执行程序。 关联打开程序 操作系统用它匹配默认打开方式如双击 .pdf 用 Adobe 打开。 2. 命名规则 规则示例说明分隔符文件名.扩展名用 . 分隔如 docx长度1~4个字符常见少数扩展名更长如 .jpeg大小写敏感视操作系统而定Windows 通常不区分.TXT .txt3. 常见扩展名一览 类型典型扩展名用途文本文件.txt, .md纯文本/标记语言图片文件.jpg, .png图像存储可执行文件.exe, .bin程序/二进制代码文档文件.pdf, .docx格式化文档压缩文件.zip, .rar打包压缩数据 2、文件类型 文件按用途分类 1、系统文件System Files 权限特点 仅供系统使用多数仅允许调用执行禁止读写✋。部分文件对用户完全隐藏如 Windows 系统 C:\Windows\System32。 2. 用户文件User Files 自由度高 用户完全控制可读、写、删、改✅用户将这些文件委托给系统保管。包括源代码.c/.py、文档.docx、媒体.mp4等。 分类 子类型典型扩展名作用源代码.java, .cpp程序员编写的原始代码可执行文件.exe, .app直接运行的程序数据文件.xlsx, .db存储用户数据3. 库文件Library Files 共享但保护 允许调用如数学库、图形库但禁止修改。提供通用功能避免重复造轮子。 示例 静态库.lib/.a编译时绑定。动态库.dll/.so运行时调用。 文件按数据形式分类 1. 源文件Source Files 定义 包含原始代码或数据的文本文件由程序员/用户直接编写‍。一般为ASCII/Unicode编码。 特点 扩展名.c (C语言)、.py (Python)、.txt (纯数据)。 2. 目标文件Object Files 定义 源文件经编译生成的中间文件包含机器码但未完整链接。不可直接执行需进一步处理。 特点 扩展名.obj (Windows)、.o (Linux/macOS)。内容二进制代码 符号表函数/变量地址。 3. 可执行文件Executable Files 定义 完全链接后的文件可直接由操作系统运行✅。包含机器指令 库依赖 资源。 特点 平台扩展名Windows.exeLinux无扩展名或.binmacOS.app#mermaid-svg-fOytoLipLVoQD1X9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .error-icon{fill:#552222;}#mermaid-svg-fOytoLipLVoQD1X9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fOytoLipLVoQD1X9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fOytoLipLVoQD1X9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fOytoLipLVoQD1X9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fOytoLipLVoQD1X9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fOytoLipLVoQD1X9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fOytoLipLVoQD1X9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fOytoLipLVoQD1X9 .marker.cross{stroke:#333333;}#mermaid-svg-fOytoLipLVoQD1X9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fOytoLipLVoQD1X9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .cluster-label text{fill:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .cluster-label span{color:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .label text,#mermaid-svg-fOytoLipLVoQD1X9 span{fill:#333;color:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .node rect,#mermaid-svg-fOytoLipLVoQD1X9 .node circle,#mermaid-svg-fOytoLipLVoQD1X9 .node ellipse,#mermaid-svg-fOytoLipLVoQD1X9 .node polygon,#mermaid-svg-fOytoLipLVoQD1X9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fOytoLipLVoQD1X9 .node .label{text-align:center;}#mermaid-svg-fOytoLipLVoQD1X9 .node.clickable{cursor:pointer;}#mermaid-svg-fOytoLipLVoQD1X9 .arrowheadPath{fill:#333333;}#mermaid-svg-fOytoLipLVoQD1X9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fOytoLipLVoQD1X9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fOytoLipLVoQD1X9 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-fOytoLipLVoQD1X9 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-fOytoLipLVoQD1X9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fOytoLipLVoQD1X9 .cluster text{fill:#333;}#mermaid-svg-fOytoLipLVoQD1X9 .cluster span{color:#333;}#mermaid-svg-fOytoLipLVoQD1X9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fOytoLipLVoQD1X9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}编译链接库文件源文件 .c/.py目标文件 .obj/.o可执行文件 .exe文件存取控制属性分类 1. 只执行文件Execute-only File 权限 允许被核准的用户调用执行如运行程序禁止❌ 读内容、❌ 修改/写入 2. 只读文件Read-only File 权限 允许文件主及授权用户读取内容禁止❌ 修改、删除或写入 3. 读写文件Read-Write File 权限✏️ 允许文件主及授权用户读取 修改如编辑、保存注意需谨慎设置权限防止越权操作 文件组织形式和处理方式分类 1、普通文件Regular File 内容 ASCII码文本或二进制码程序/数据例子 用户创建的源代码.c/.py、文档.txt系统自带的内核代码、实用工具如 ls 命令 特点最常见的文件类型可直接读写内容 2、目录文件Directory File 本质 文件目录的集合一种特殊文件功能 记录**下属文件的元信息**名称、权限等支持文件检索如 ls、操作如 cd 权限控制和普通文件类似需 r 读目录、w 增删文件举个栗子/home/user/ 是一个目录文件存放下属文件列表。 3、特殊文件Special File / Device File 代表对象️ I/O设备如键盘、打印机、磁盘设计目的统一用文件接口管理设备 访问方式 像操作文件一样 读/写设备如 /dev/sda 代表磁盘实际执行由 设备驱动程序完成 权限验证与普通文件规则一致但操作可能受限 类型细分 字符设备如 /dev/tty按字符流传输块设备如 /dev/sda按数据块传输 7.1.3 文件系统的层次结构 文件系统的模型可分为三个层次: 最底层是对象及其属性中间层是对对象进行操纵和管理的软件集合最高层是文件系统提供给用户的接口。 1、对象及其属性 1️⃣ 文件File 核心对象文件是文件系统直接管理的实体。多样性包括 文本文件、二进制文件、可执行文件 等不同类型。管理内容 存储占用磁盘空间读取/写入控制权限管理元数据维护文件名、大小、修改时间等 关键作用用户和程序操作的基本单位 2️⃣ 目录Directory 功能帮助用户 组织文件、快速检索。目录项包含 文件名标识文件文件属性如权限、类型、大小物理地址 / 指针指向文件在磁盘的实际位置 优化目标 加快查找速度索引、哈希等优化方法层级结构如树形目录/home/user/docs/ ⚡ 影响目录设计直接影响 文件存取效率 3️⃣ 存储空间Disk/Tape Storage 核心任务高效管理文件和目录占用的 物理存储。管理方式 空间分配如连续分配、链式分配、索引分配碎片整理减少空间浪费磁盘调度优化提高读写速度 重要性好的存储管理能 提升系统整体性能 2、对对象进行操纵和管理的软件集合 操纵对象 存储空间管理 - 管理文件在磁盘上的存储分配 【对象存储空间】目录管理 - 组织文件和目录结构 【对象目录】地址转换 - 逻辑地址↔物理地址转换【对象文件】读写管理 ✍️ - 控制文件读写操作【对象文件】共享与保护 - 实现文件共享和安全机制【对象文件】 与文件系统有关的软件分为四个层次自底向上 1️⃣ I/O控制层设备驱动程序层 功能 最底层直接与硬件交互 ️⚡通过 磁盘驱动程序 控制物理设备如读写磁盘扇区。 2️⃣ 基本文件系统层数据块交换层 功能 负责内存 ↔磁盘的 数据块传输如缓存块加载/写回⇄不关心内容含义只处理原始块操作。 3️⃣ 基本I/O管理程序磁盘事务层 核心任务 逻辑块 → 物理块映射 ️如文件第3块对应磁盘的哪个扇区空闲盘块管理标记哪些块可用/已占用I/O缓冲区分配优化读写速度⏳→ 4️⃣ 逻辑文件系统用户接口层 功能 处理 文件和记录 的高层操作 ✨提供 符号文件名访问如/home/note.txt实现 文件保护权限控制和 元数据管理创建时间、大小等 用户视角 “右键属性”都来自这一层 #mermaid-svg-Er1aKzDlCun8ZB8k {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .error-icon{fill:#552222;}#mermaid-svg-Er1aKzDlCun8ZB8k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Er1aKzDlCun8ZB8k .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Er1aKzDlCun8ZB8k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Er1aKzDlCun8ZB8k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Er1aKzDlCun8ZB8k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Er1aKzDlCun8ZB8k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Er1aKzDlCun8ZB8k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Er1aKzDlCun8ZB8k .marker.cross{stroke:#333333;}#mermaid-svg-Er1aKzDlCun8ZB8k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Er1aKzDlCun8ZB8k .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .cluster-label text{fill:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .cluster-label span{color:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .label text,#mermaid-svg-Er1aKzDlCun8ZB8k span{fill:#333;color:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .node rect,#mermaid-svg-Er1aKzDlCun8ZB8k .node circle,#mermaid-svg-Er1aKzDlCun8ZB8k .node ellipse,#mermaid-svg-Er1aKzDlCun8ZB8k .node polygon,#mermaid-svg-Er1aKzDlCun8ZB8k .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Er1aKzDlCun8ZB8k .node .label{text-align:center;}#mermaid-svg-Er1aKzDlCun8ZB8k .node.clickable{cursor:pointer;}#mermaid-svg-Er1aKzDlCun8ZB8k .arrowheadPath{fill:#333333;}#mermaid-svg-Er1aKzDlCun8ZB8k .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Er1aKzDlCun8ZB8k .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Er1aKzDlCun8ZB8k .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Er1aKzDlCun8ZB8k .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Er1aKzDlCun8ZB8k .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Er1aKzDlCun8ZB8k .cluster text{fill:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k .cluster span{color:#333;}#mermaid-svg-Er1aKzDlCun8ZB8k div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Er1aKzDlCun8ZB8k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}1. 解析文件名检查权限2. 转换逻辑块为物理块3. 分配缓冲区4. 读写内存磁盘的数据块5. 驱动硬件读取磁盘扇区用户请求 read /a.txt逻辑文件系统基本I/O管理程序基本文件系统I/O控制层返回数据3、文件系统提供给用户的接口 文件系统通过 标准化的接口 为用户和应用程序提供 文件和记录操作 的方法使其无需关心底层存储细节。 (1) 命令接口Command Interface 定义用户通过 命令行终端CLI 输入指令与文件系统交互。 特点 ✅ 直接交互如 ls、cp、rm 等命令。✅ 适用于管理员、开发者 或 需要手动操作文件的场景。 (2) 程序接口Program Interface / API 定义应用程序通过 系统调用System Calls 访问文件系统。 特点 ✅ 编程方式调用如 open()、read()、write()。✅ 适合软件开发 文件系统的层次结构详细版 7.1.4 文件操作 创建文件 功能建立新文件并分配存储空间。【进行 Create 系统调用】步骤 为新文件 分配外存空间如磁盘。在 文件目录中创建目录项记录文件属性 ✅ 文件名✅ 外存地址物理位置✅ 元数据大小、权限、时间等。 删除文件 ️ 功能释放文件占用的资源。【进行 Delete 系统调用参数文件名和文件路径】步骤 查找目录项根据文件名定位到对应条目。回收空间释放文件占用的外存物理删除。标记为空项删除目录中的记录逻辑删除 读文件 功能从 外存读取文件内容到内存。【进程使用read系统调用】步骤 查找目录根据文件名找到目录项。获取位置从目录项中读取文件的 外存地址。移动指针通过目录项中的 读指针定位读取位置默认从文件开头。 写文件 ✍️ 功能将 内存中的数据写入外存文件。【进程使用write系统调用】步骤 查找目录根据文件名找到对应的目录项。获取外存地址从目录项中读取文件的 外存地址。定位写指针根据目录项中的写指针或当前文件偏移量确定写入位置 如果写指针默认在文件开头如新文件或覆盖写则从起始位置写入。如果写指针在文件末尾追加模式则从结尾续写。 执行写入将内存中的数据写入外存并更新写指针的位置。 注意写入可能覆盖原有内容⚠️ 设置读/写位置 功能实现 随机存取非顺序操作。关键通过调整 文件的读/写指针直接跳转到指定位置。 顺序存取每次操作必须从头开始。随机存取灵活定位。 当用户对文件进行多次操作读/写时如果每次都要从目录检索开始根据文件名找外存位置会导致重复检索开销大效率低下。 引入 open() 系统调用提前加载文件信息到内存。避免重复目录检索用空间换时间。 “打开文件” - open(文件路径文件名对文件的操作类型只读r/读写rw) 判断权限: 根据文件存放路径找到相应的目录文件从目录中找到文件名对应的的目录项并检查该用户是否有指定的操作权限。建立连接在用户和文件之间创建一个 逻辑通道无需重复检索目录。内存缓存将 文件的属性如外存地址、权限、大小等 从目录项 拷贝 到 内存的打开文件表。返回索引号系统为用户分配一个 文件描述符File Descriptor【也称索引号】后续操作直接凭此索引访问文件。 “关闭文件” - close() ✖️ 断开连接释放文件描述符“退票”。清理内存从打开文件表删除该文件的表目。同步数据可选如果文件被修改可能将缓冲区的数据写回磁盘。 文件属性操作 ⚙️ 功能直接修改/查询文件的元数据metadata。 常用系统调用 rename修改文件名 chown改变文件所有者 chmod修改文件权限读/写/执行 stat/fstat获取文件状态 ℹ️包括大小、创建时间、类型、权限等。 目录操作 功能管理文件系统的目录结构。常用系统调用 mkdir创建目录 rmdir删除空目录 ️要求目录必须为空getcwd获取当前工作目录 ️chdir切换工作目录 注意 删除非空目录需递归操作如rm -rf命令 文件共享与系统级操作 功能实现多进程/用户共享文件或管理文件系统。关键系统调用 link创建硬链接同一文件的多个入口⛓️symlink创建软链接快捷方式删除原文件后失效mount/unmount挂载/卸载文件系统 ️ 7.2 文件的逻辑结构 检索速度同时受以下两种结构影响 文件的逻辑结构File Logical Structure 定义从 用户视角 看到的文件组织形式【在用户看来文件内部的数据应该是如何组织起来的。】 核心特点 用户可见 用户直接操作。独立于物理存储 与磁盘如何存放无关。组成单位由 逻辑记录Logical Record构成用户可以直接处理的数据及其结构又称为 文件组织(File Organization) #mermaid-svg-cykuJbUz3lBe5SeI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cykuJbUz3lBe5SeI .error-icon{fill:#552222;}#mermaid-svg-cykuJbUz3lBe5SeI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cykuJbUz3lBe5SeI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-cykuJbUz3lBe5SeI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cykuJbUz3lBe5SeI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cykuJbUz3lBe5SeI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cykuJbUz3lBe5SeI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cykuJbUz3lBe5SeI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cykuJbUz3lBe5SeI .marker.cross{stroke:#333333;}#mermaid-svg-cykuJbUz3lBe5SeI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cykuJbUz3lBe5SeI g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-cykuJbUz3lBe5SeI g.classGroup text .title{font-weight:bolder;}#mermaid-svg-cykuJbUz3lBe5SeI .nodeLabel,#mermaid-svg-cykuJbUz3lBe5SeI .edgeLabel{color:#131300;}#mermaid-svg-cykuJbUz3lBe5SeI .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-cykuJbUz3lBe5SeI .label text{fill:#131300;}#mermaid-svg-cykuJbUz3lBe5SeI .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-cykuJbUz3lBe5SeI .classTitle{font-weight:bolder;}#mermaid-svg-cykuJbUz3lBe5SeI .node rect,#mermaid-svg-cykuJbUz3lBe5SeI .node circle,#mermaid-svg-cykuJbUz3lBe5SeI .node ellipse,#mermaid-svg-cykuJbUz3lBe5SeI .node polygon,#mermaid-svg-cykuJbUz3lBe5SeI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cykuJbUz3lBe5SeI .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-cykuJbUz3lBe5SeI g.clickable{cursor:pointer;}#mermaid-svg-cykuJbUz3lBe5SeI g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-cykuJbUz3lBe5SeI g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-cykuJbUz3lBe5SeI .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-cykuJbUz3lBe5SeI .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-cykuJbUz3lBe5SeI .dashed-line{stroke-dasharray:3;}#mermaid-svg-cykuJbUz3lBe5SeI #compositionStart,#mermaid-svg-cykuJbUz3lBe5SeI .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #compositionEnd,#mermaid-svg-cykuJbUz3lBe5SeI .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #dependencyStart,#mermaid-svg-cykuJbUz3lBe5SeI .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #dependencyStart,#mermaid-svg-cykuJbUz3lBe5SeI .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #extensionStart,#mermaid-svg-cykuJbUz3lBe5SeI .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #extensionEnd,#mermaid-svg-cykuJbUz3lBe5SeI .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #aggregationStart,#mermaid-svg-cykuJbUz3lBe5SeI .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI #aggregationEnd,#mermaid-svg-cykuJbUz3lBe5SeI .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cykuJbUz3lBe5SeI .edgeTerminals{font-size:11px;}#mermaid-svg-cykuJbUz3lBe5SeI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}实现实现继承继承继承包含包含«interface»文件逻辑结构无结构文件二进制流/字符流-无固定格式«abstract»有结构文件顺序文件记录按顺序排列索引文件索引表存储记录地址支持快速随机访问索引顺序文件分组建立索引顺序查找索引加速顺序存储物理连续分配物理块号起始块号逻辑块号链式存储物理非连续分配通过指针链接记录文件的物理结构File Physical Structure- 非空闲磁盘块管理 ️ 定义文件在 外存磁盘上的实际存储方式对用户透明。【在操作系统看来文件的数据是如何存放在外存中的。】 核心特点 用户不可见 由操作系统管理。依赖存储介质 与磁盘块大小、分配策略相关。 在外存管理中为了方便对文件数据的管理文件的逻辑地址空间也被分为了一个一个的文件“块” 。文件的逻辑地址表示为(逻辑块号块内地址) 的形式操作系统 为文件分配存储空间都是以块为单位 的。用户通过逻辑地址来操作自己的文件操作系统要负责实现从逻缉地址到物理地址的映射 类型描述目录项内容优点缺点连续分配文件占用的磁盘块物理相邻 起始块号、文件长度支持顺序访问和直接访问(即随机访问)连续分配的文件在顺序访问时速度最快不方便文件拓展;存储空间利用率低会产生磁盘碎片外部碎片链式分配隐式链接除文件的最后一个盘块之外每个盘块中都存有指向下一个盘块的指针显式链接 建立一张文件分配表(FAT)显式记录盘块的先后关系(开机后FAT常驻内存)隐式链接起始块号、结束块号显式链接起始块号隐式链接很 方便文件拓展不会有碎片问题 外存利用率高。显式链接很 方便文件拓展不会有碎片问题外存利用率高并且 支持随机访问。相比于隐式链接来说地址转换时不需要访问磁盘文件分配表常驻内存因此文件的访问效率更高。隐式链接只支持顺序访问不支持随机访问查找效率低指向下一个盘块的指针也需要耗费少量的存储空间。显式链接文件分配表的需要占用一定的存储空间。索引分配为文件数据块建立索引表若文件太大可采用链接方案、多层索引、混合索引链接方案记录的是雪全层准合案引记录的是顶级索引块的块号支持随机访问易于实现 文件的拓展索引表需占用一定的存储空间。访问数据块前需要先读入索引块。若采用 链接方案查找索引块时可能需要 很多次读磁盘操作连续分配连续分配方式要求每个文件在磁盘上占有一组连续的块 可以直接算出逻辑块号对应的物理块号因此 连续分配支持顺序访问和直接访问(即随机访问) 链式分配 考试题目中遇到未指明隐式/显式的“链接分配”默认指的是隐式链接的链接分配 隐式链接 显式链接把用于链接文件各物理块的指针显式地存放在一张表中即 文件分配表(FAT, File Allocation Table ) 索引分配索引分配允许文件离散地分配在各个磁盘块中系统会为每个文件建立一张索引表索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。 超级超级超级重要考点: ①要会根据多层索引、混合索引的结构计算出 文件的最大长度(Key:各级索引表最大不能超过一个块); ②要能自己分析 访问某个数据块所需要的读磁盘次数(Key: FCB中会存有指向顶级索引块的指针因此可以根据FCB读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外要注意题目条件--顶级索引块是否已调入内存) #mermaid-svg-M7rAVxhJ8qqLQMX2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .error-icon{fill:#552222;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .marker.cross{stroke:#333333;}#mermaid-svg-M7rAVxhJ8qqLQMX2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .nodeLabel,#mermaid-svg-M7rAVxhJ8qqLQMX2 .edgeLabel{color:#131300;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .label text{fill:#131300;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .classTitle{font-weight:bolder;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .node rect,#mermaid-svg-M7rAVxhJ8qqLQMX2 .node circle,#mermaid-svg-M7rAVxhJ8qqLQMX2 .node ellipse,#mermaid-svg-M7rAVxhJ8qqLQMX2 .node polygon,#mermaid-svg-M7rAVxhJ8qqLQMX2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 g.clickable{cursor:pointer;}#mermaid-svg-M7rAVxhJ8qqLQMX2 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-M7rAVxhJ8qqLQMX2 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .dashed-line{stroke-dasharray:3;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #compositionStart,#mermaid-svg-M7rAVxhJ8qqLQMX2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #compositionEnd,#mermaid-svg-M7rAVxhJ8qqLQMX2 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #dependencyStart,#mermaid-svg-M7rAVxhJ8qqLQMX2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #dependencyStart,#mermaid-svg-M7rAVxhJ8qqLQMX2 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #extensionStart,#mermaid-svg-M7rAVxhJ8qqLQMX2 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #extensionEnd,#mermaid-svg-M7rAVxhJ8qqLQMX2 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #aggregationStart,#mermaid-svg-M7rAVxhJ8qqLQMX2 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 #aggregationEnd,#mermaid-svg-M7rAVxhJ8qqLQMX2 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-M7rAVxhJ8qqLQMX2 .edgeTerminals{font-size:11px;}#mermaid-svg-M7rAVxhJ8qqLQMX2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}实现实现实现«interface»文件物理结构连续分配文件占用连续磁盘块链接分配文件块通过指针链接-分为隐式链接FAT和显式链接索引分配索引块存储文件块地址逻辑结构 vs 物理结构 文件内部各条记录链式存储:由创建文件的用户自己设计的 文件整体用链接分配:由操作系统决定 索引文件的索引表用户自己建立的映射:关键字→记录存放的逻辑地址 索引分配的索引表操作系统建立的映射:逻辑块号→物理块号 7.2.1 文件逻辑结构的类型 1、按文件是否有结构分类 有结构文件记录式文件 定义像Excel表格一样按记录存储数据每条记录描述一个实体如学生信息表。一般来说每条记录有一个数据项可作为关键字(作为识别不同记录的ID) 1. 定长记录 特点 ✅ 所有记录长度相同如身份证号固定18位 ✅ 数据项位置固定类似表格列对齐 ✅ 高速访问直接计算偏移量定位秒级跳转⚡ 2. 变长记录 特点 记录长度可变但每个记录的长度都是可知的如病历摘要、商品评论 ⚠️ 需额外存储长度信息如开头2字节记录长度 访问速度较慢需顺序遍历 无结构文件流式文件 定义字节流 形式存储如MP3/EXE文件 特点 ✅ 极致简单仅按字节编号以字节为单位的。 ✅ 灵活通用任何数据都可存储 ✅ 访问方式读写指针控制 应用场景源程序、可执行文件、库函数等所采用的就是无结构的文件形式 2、按有结构文件的组织方式分类 一、顺序文件Sequential File➡️ 定义指由一系列记录 按某种顺序排列 所形成的文件。【文件中的记录一个接一个地顺序排列(逻辑上)。】 核心特点 存储方式 定长记录直接物理连续存储如数组️变长记录需用分隔符/长度前缀标记如CSV 物理上存储 顺序存储 逻辑上相邻的记录物理上也相邻(类似于顺序表)链式存储 逻辑上相邻的记录物理上不一定相邻(类似于链表) 结构 串结构记录之间的顺序与关键字无关。通常 按照记录存入的时间决定记录的顺序顺序结构记录之间的顺序 按关键字顺序排列。 访问特性 ✅ 顺序访问极快适合磁带等顺序存储介质️❌ 随机访问极慢平均需遍历n/2条记录 二、索引文件Indexed File 定义为可变长记录文件建立 一张索引表为 每个记录设置一个表项 核心特点 结构组成 数据区原始变长记录索引区固定格式的〈key, 物理地址〉映射表像字典 访问特性 ✅ 随机访问极快O(1)时间复杂度⚡ ❌ 空间开销大需额外存储索引表 三、索引顺序文件Indexed Sequential File 定义分组建立索引 —— 为每个文件建立一张索引表时并不是为每一个记录建立一个索引表项而是为一组记录中的第一个记录建立一个索引表项。 核心特点 分层结构 数据分块如每100条记录为一组只索引每组的第一个记录空间省50%✨ 访问特性 ✅ 折中了顺序和索引的优点 ✅ 适合 超大规模文件 7.2.2 顺序文件(Sequential File) 1、顺序文件的排列方式 1. 串结构 ⏳时间序列式 特点 无脑追加按存入时间的先后进行排序 的各记录之间的顺序与关键字无关。零排序记录之间没有逻辑关联 → 纯线性结构 ➖检索代价 必须从头遍历直到找到指定的记录或查完所有的记录为止。平均查找次数 n/2 最坏情况查完全部记录 应用场景系统日志文件️、区块链交易记录按时间戳追加⛓️ 2. 顺序结构 关键字排序式 特点 强制排序用户指定 唯一关键字如学号/身份证号, 可以是 任意类型的变量每个记录的关键字值 在文件中具有唯一性。有序记录 按关键字严格排序像字典拼音排序检索加速支持高效算法 → 如折半查找法、插值查找法、跳步查找法等方法提高检索效率。 应用场景学生信息表按学号排序 链式存储无论是定长/可变长记录都无法实现随机存取每次只能从第一个记录开始依次往后查找顺序存储 可变长记录无法实现随机存取。每次只能从第一个记录开始依次往后查找定长记录可实现随机存取。记录长度为L则第i个记录存放的相对位置是i*L 若采用串结构无法快速找到某关键字对应的记录若采用顺序结构可以快速找到某关键字对应的记录(如折半查找 - 快速检索) 一般来说考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。 2、顺序文件的优缺点 ✅ 顺序文件的优点 1. 批量存取效率极高 最佳场景需要大批量连续读写如日志备份、数据导出 2. 存储结构简单 定长记录物理存储连续类似数组访问简单高效变长记录利用分隔符CSV、JSON等管理 3. 适合顺序存储设备磁带️ 磁带只能顺序访问 → 顺序文件是唯一可行方案 ❌ 顺序文件的缺点 1. 随机访问性能差⏳ 查找复杂度平均O(n/2)最差O(n)遍历全表变长记录更慢额外解析记录边界加剧I/O开销 2. 修改增/删/改困难 ⚠️ 插入/删除必须移动后续记录类似数组操作时间复杂度O(n)【如果是串结构则相对简单】扩容受限变长记录易导致存储碎片化 解决方案日志文件Log / Transaction File 核心思想避免实时修改主文件采用批处理合并方式 实现方式 主文件Main File 保持顺序结构只读操作日志Log File 记录增删改请求定期合并如4小时/每日生成新主文件 用顺序文件的场景批量处理 顺序设备如日志备份、ETL数据流 避免使用的场景高频随机读写 低延迟要求如在线交易系统 7.2.3 记录寻址 1、隐式寻址方式 隐式寻址Implicit Addressing是顺序文件访问记录的方式通过读/写指针自动定位记录地址适用于定长/变长记录的顺序文件。 定长记录 存储结构所有记录固定长度L物理连续存储类似数组 指针操作 读指针Rptr指向 下一个待读取记录的首地址 // 每当读完一个记录时便执行 Rptr Rptr L 示例若 L100B当前 Rptr0x1000读完后 Rptr0x10640x1000 100 写指针Wptr指向 下一个待写入位置 // 在每写完一个记录时便执行 Wptr Wptr L 变长记录 存储结构每个记录包含长度字段Li存储不连续 指针操作: 设置读或写指针在每次读或写完个记录后须将读或写指针加上LiLi是刚读或刚写完的记录的长度。 Rptr Rptr Li sizeof(Li) 关键问题 性能损失每次需解析长度字段 → 额外I/O开销随机访问低效必须顺序扫描前 i-1 个记录才能找到第 i 个时间复杂度O(n) 2、显式寻址方式 通过文件中记录的位置 定长记录文件 获得第i个记录相对于第一个记录首址的地址: Aii×L首地址为0。A_i i × L 首地址为 0。 Ai​i×L首地址为0。 由于获得任何记录地址的时间都非常短故可利用这种方法对定长记录实现随机访问。 变长记录文件 记录长度不固定L1, L2, ...必须顺序解析前 i-1 个记录才能定位第 i 个检索时间长很低效 Ai∑i0i−1Li1A_i \sum_{i0}^{i-1}L_i 1 Ai​i0∑i−1​Li​1 利用关键字 定长记录文件 变长记录文件用户必须指定一个字段作为关键字系统将利用该关键字顺序地从第一个记录开始与每一个记录的关键字进行比较直到找到匹配的记录。 ⚡ 隐式寻址 vs 显式寻址 特性隐式寻址显式寻址访问方式指针自动移动直接跳转通过索引适用记录定长/变长通常定长随机访问❌ 慢O(n)✅ 快O(1)~O(log n)存储开销低高 7.2.4 索引文件(Index File) 1、按关键字建立索引 问题背景 定长记录文件可通过计算直接定位记录支持高效 随机访问。变长记录文件必须 顺序查找效率低O(n)时间。⏳ 解决方案索引表 索引表结构 每个表项包含 指针记录在逻辑地址空间的首地址。长度记录的长度L。 索引表按 关键字排序本身是 定长记录的顺序文件。 检索流程 折半查找在索引表中 用关键字快速定位 记录O(log n)时间。直接访问根据 指针和长度定位 主文件中的记录。 更新操作 新增记录需同步 更新索引表维护排序。删除/修改类似处理可能 需调整索引表。⚠️ 2、具有多个索引表的索引文件 背景问题 单索引表限制只能按 一个关键字 检索。实际需求不同用户希望按不同属性快速查找。 解决方案多索引表 索引表结构 每个检索属性一个索引表例如 图书编号索引主键书名索引✍️ 作者索引 出版时间索引 ️ 所有索引表按各自关键字排序仍是 定长记录文件。 检索流程 用户选择检索条件如作者鲁迅→ 在对应索引表中折半查找→ 通过指针定位主文件记录。 更新操作 ⚙️ 增/删/改记录需 同步更新所有相关索引表维护排序性。 核心优势 多维度检索支持按任意关键字属性高效查询适应不同需求。高效随机访问索引表将O(n)顺序查找优化为O(log n)随机访问。⚡动态维护便捷记录增删仅需调整索引表无需重组主文件。 ⚠️ 缺点 存储开销大每个记录需在多个索引表中保留条目占用额外空间。更新代价高修改主文件需同步更新多个索引表。⏱️ 7.2.5 索引顺序文件(Index Sequential File) 1、索引顺序文件的特征 基本概念索引顺序文件是 顺序文件的改进版在保留顺序文件核心特性的基础上通过 引入索引表 和 溢出文件显著提升了文件操作的灵活性。 核心特点 记录按关键字顺序存储保留顺序文件的特性 支持随机访问通过索引表实现 增删改更高效利用溢出文件管理动态变更 核心组件 文件索引表 提供 随机访问能力通过折半查找快速定位记录。⚡将O(n)顺序检索优化为O(log n)。 溢出区Overflow File 存储新增、删除或修改的记录避免频繁重组主文件。类似数据库的“临时缓冲区”定期合并到主文件。⏳ ✅ 优势 随机顺序双模式既可快速访问单条记录又支持高效顺序扫描。动态维护便捷溢出区减少插入/删除时的数据迁移开销。✨低成本升级在顺序文件基础上仅增加索引和溢出区存储开销可控。 ⚠️ 局限性 溢出区膨胀长期不合并可能导致检索性能下降需定期维护。⚠️不适合高频更新大量修改时溢出区管理复杂度增加。⏱️ 2、一级索引顺序文件 基本原理 首先将变长记录顺序文件中的 所有记录分为若干个组如50个记录为一个组。然后为顺序文件 建立一张索引表并为 每组中的第一个记录在索引表中建立一个索引项其中 含有该记录的关键字和指向该记录的指针。 检索流程详解两步法 1️⃣ 第一步索引表查找定位记录组 输入用户/程序提供的 目标关键字 查找算法 二分查找索引表有序时 ⚡顺序查找简单但略慢 输出 找到 目标记录所在分组 的首记录表项提取该组的 起始位置指针指向主文件 2️⃣ 第二步主文件顺序查找定位目标记录 输入索引表返回的 组起始位置查找方法 从起始位置开始顺序扫描 该组记录 逐个比对关键字直至命中目标或失败 平均查找次数 每组 k 条记录 → 平均需查 k/2 次 索引顺序文件的平均查找次数是√N 总记录数 N每组记录数 ≈ √N组数 ≈ √N组数 × 每组记录数 ≈ N 1️⃣ 查索引表定位组 对√N个索引项进行二分查找 → 平均比较次数≈log₂(√N)当N较大时可近似为O(√N)例如顺序查找索引表时。 2️⃣ 查主文件组内顺序查找 每组√N条记录 → 平均查找√N/2次 总查找次数 ≈ √N索引 √N/2组内 ≈ √N 3、两级索引顺序文件 为顺序文件建立多级索引即为索引文件再建立一张索引表从而形成两级索引表。 7.2.6 直接文件和哈希文件 1、直接文件 核心特点 关键字Key → 物理地址Address的直接转换 无需中间查找跳过索引、链表或顺序扫描一步到位空间换时间通过特定算法将键值转换为地址实现 O(1) 访问理想情况下。 2、哈希文件 核心概念 键值→地址的间接映射哈希文件是直接文件的经典实现利用 哈希函数Hash Function 快速定位记录。但与纯直接文件不同它采用 「间接寻址」 关键字Key → Hash值 → 目录表指针 → 物理块地址 哈希文件流程详解 1️⃣ Hash函数H: 作为标准函数存于系统中供存取文件时调用。 输入记录的关键字 K输出目录表索引 A H(K) 示例H(ID101) 5 → 指向目录表的第5项 2️⃣ 目录表指针表每个表项存储 物理块指针如磁盘块地址 3️⃣ 物理存储块实际存放记录的数据块 7.3 文件目录 文件目录是文件系统的“导航地图️”目录管理的核心要求如下 1️⃣ 按名存取Name-Based Access 用户视角只需输入 文件名如 report.docx系统自动找到文件位置。底层实现目录中记录 文件名 → 物理地址 的映射。 2️⃣ 提高检索速度Fast Lookup 优化手段 哈希目录用哈希表加速文件名查找。树形结构层级目录减少单层文件数。 关键目标减少磁盘I/O尤其在大中型文件系统中 3️⃣ 文件共享File Sharing 多用户场景多个用户访问同一文件。实现方式 硬链接多个目录项指向同一文件。符号链接快捷方式记录目标文件路径。 优势节省存储空间 保证数据一致性 4️⃣ 允许重名Name Reuse 用户自由不同用户可对不同文件使用相同名字。实现原理 目录隔离用户私有目录如 /home/user1/ vs /home/user2/。命名空间通过路径全称区分如 /home/user1/notes.txt ≠ /home/user2/notes.txt。 7.3.1 文件控制块和索引结点 文件控制块File Control Block, FCB 是操作系统中用于 描述和控制文件 的数据结构文件与文件控制块一一对应。 文件目录文件控制块的有序集合即 一个文件控制块就是一个文件目录项。 目录文件一个文件目录也被看做是一个文件 1、文件控制块 FCB(File Control Block) 在文件控制块中通常应含有三类信息即基本信息、存取控制信息及使用信息。 基本信息类 文件名指用于标识一个文件的符号名在每个系统中每一个文件都必须有唯一的名字用户利用该名字进行存取。文件物理位置指 文件在外存上的存储位置它包括: 存放文件的设备名文件在外存上的起始盘块号指示文件所占用的盘块数或字节数的文件长度。 文件逻辑结构指示 文件是流式文件还是记录式文件、记录数文件是定长记录还是变长记录 等。文件的物理结构指示 文件是顺序文件还是链接式文件或索引文件。 存取控制信息类 文件主的存取权限核准用户的存取权限一般用户的存取权限 使用信息类 文件的建立日期和时间文件上一次修改的日期和时间当前使用信息。 当前已打开该文件的进程数是否被其它进程锁住文件在内存中是否已被修改但尚未拷贝到盘上等。 2、索引结点 1️⃣ 问题背景传统目录检索的瓶颈 传统FCB目录结构如FAT 每个FCB完整存储文件名文件描述信息占用空间大。 例FCB64B盘块1KB → 每块仅存16个FCB。检索时需逐块调入内存依次比对文件名。⏳存在性能问题若目录占用N个盘块平均需 (N1)/2次磁盘I/O。 例640个FCB → 40块 → 平均20次磁盘访问 2️⃣ 优化方案UNIX的i-node设计 核心思想分离文件名与文件元数据减少目录检索时的磁盘I/O i-node索引结点结构 组成部分作用节省点文件名文件标识短字符串仅存14BUNIX为例i-node指针指向文件元数据物理地址/权限等2B指针 → 取代完整FCB✨文件元数据存储在独立的i-node中磁盘另存检索时不加载按需读取3️⃣ 磁盘索引结点 存放在磁盘上的索引结点。每个文件有唯一的一个磁盘索引结点 磁盘i-node的七大核心字段 字段作用 特别说明文件主标识符记录文件所有者用户/组ls -l看到的user:group就是它文件类型标明是普通文件、目录、设备文件等-普通文件d目录c字符设备…文件存取权限控制用户/组/其他用户的读r、写w、执行x权限chmod 755修改的就是它 文件物理地址13个地址项iaddr(0)~iaddr(12)以直接或间接方式给出数据文件所在盘块的编号混合索引结构 → ⚡️ 支持大文件高效访问文件长度文件实际大小字节为单位du和ls -l显示的数据源 文件连接计数硬链接数量多少目录项指向本i-node为0时文件真正删除 ♻️文件存取时间记录最后访问、修改、i-node变更时间touch命令会更新这些时间 ⏰ 4️⃣ 内存索引结点 为什么需要内存i-node 磁盘i-node存储在硬盘每次访问都要读盘 → 慢 内存i-node加载到RAM减少磁盘I/O → 快 核心思想高频访问的元数据 缓存在内存避免重复读盘 ⚡ 内存i-node五大新增字段 字段用途 场景举例1. i-node编号唯一标识内存中的i-node内核通过编号快速查找缓存 2. 状态标志标记是否被 锁定locked 或 修改dirty写文件时加锁防止并发冲突 3. 访问计数记录多少进程正在使用此i-nodeOpen计数计数0时可安全释放缓存 ♻️4. 设备号指向文件所属的文件系统如/dev/sda1跨设备文件操作时定位磁盘位置 5. 链接指针维护空闲链表和哈希队列加速i-node查找内核通过哈希表快速定位内存i-node ⚡内存i-node vs. 磁盘i-node 特性磁盘i-node内存i-node新增字段存储位置磁盘内存进程打开文件时加载核心作用持久化存储元数据加速访问 动态管理文件状态生命周期文件存在即存在文件打开时创建关闭后可能释放7.3.2 简单的文件目录 1、单级文件目录 基本概念 单级文件目录Single-Level Directory 是最简单的文件目录结构整个系统只有一张目录表每个文件占一个目录项包含 文件名如report.txt️ 文件扩展名如.txt、.exe 文件长度大小️ 文件类型文本、二进制、目录等️ 文件物理地址存储在磁盘的哪个位置 其他属性如只读、隐藏等✅ 状态位1已占用0空闲 特点 每个文件 唯一对应一个目录项文件名必须唯一按名存取 - 不能有重名查找方式线性扫描 全部目录项 ⚡ 工作流程 创建文件Create 1️⃣ 检索全部目录项 → 检查文件名是否已存在避免重名 2️⃣ 找空白目录项状态位0 3️⃣ 填入文件名、属性并置状态位1 删除文件Delete️ 1️⃣ 查找目标目录项 2️⃣ 释放文件占用的存储空间如磁盘块 3️⃣ 清空目录项状态位0 ✅ 优点 简单易实现 ️满足最基本功能按名存取open(a.txt) 能定位到文件 ❌ 缺点 查找速度慢 平均需扫描 N/2 个目录项N文件总数不允许重名 在多用户/多任务环境下难以避免冲突无法共享文件 所有用户必须用相同文件名访问同一文件不能个性化命名 适用场景 单用户环境如早期DOS系统 ️文件数量极少 2、两级文件目录 基本概念 两级文件目录Two-Level Directory 是为了解决单级目录的缺点而设计的。它在 主目录MFD下为每个用户单独建立用户文件目录UFD形成两级结构 主文件目录MFD记录所有用户信息用户名 指向UFD的指针 用户文件目录UFD用户自己的文件列表类似单级目录但只属于该用户 ️ ✅ 核心思想用户隔离 → 每个用户有自己的“私人文件夹”互不干扰 ⚡ 工作流程 创建文件Create 1️⃣ 查MFD → 找到对应用户的UFD指针 2️⃣ 在UFD中检查文件名是否冲突只需检查自己的文件不用管其他用户 3️⃣ 分配空白目录项填入文件信息状态位1 ✅ 删除文件Delete️ 1️⃣ 查MFD → 定位到UFD 2️⃣ 在UFD中找到目标文件释放存储空间 3️⃣ 清除目录项状态位0 访问文件Open 路径形式/用户名/文件名 ✅ 优点对比单级目录 改进点两级目录解决方案实际效果查找速度快只需查 nMFD mUFD 次从单级的 Nn×m → 降到 nm允许用户重名不同用户的UFD可含同名文件如 A/test和B/test用户A和B的 temp.txt 共存支持基础共享可通过系统链接【让不同用户的不同文件名指向同一个物理文件】让不同用户访问同一物理文件用户A的 data.txt → 用户B的 backup.txt ❌ 缺点 用户隔离太强 合作开发时跨用户访问文件需手动配置权限或链接不够灵活。共享仍有限 需显式设置共享文件表或符号链接天然不支持多级协作。 7.3.3 树形结构目录(Tree-Structured Directory) 1、树形目录 基本概念 树形目录Tree-Structured Directory 是现代OS最常用的文件组织方式将文件系统组织为一棵倒置的树 根目录/ 最顶层的唯一目录如Linux的/、Windows的C:\节点子目录 树的中间层文件夹可无限嵌套叶节点文件 树的末端实际数据文件 ⚡ 核心特性 单根唯一性 全系统 只有一个根目录所有文件和目录都从根派生。例如Linux中绝对路径/home/user/file.txt必须从/开始。 单父依赖 每个文件/目录 只能有一个父目录避免环路类似单继承。例外通过链接硬链/软链实现多路径访问。 混合存储能力 目录项可以是 子目录的FCB 如/home/user/Documents/数据文件的FCB 如/home/user/report.txt 用 标志位 区分类型如d代表目录-代表文件。 / (根目录) ├── home/ 用户主目录 │ ├── alice/ 子目录 │ │ ├── Documents/ 子目录 │ │ │ └── project.docx 数据文件 │ │ └── notes.txt 数据文件 │ └── bob/ 子目录 │ └── Downloads/ 子目录 └── etc/ 配置文件目录 └── passwd 2、路径名和当前目录 路径名Path Name 在树形目录中每个文件的绝对路径是从根目录/出发的唯一访问路径所有目录和文件名用 / 连接。 当前目录/工作目录Current Directory 解决方案为每个进程设置工作目录Working Directory默认从此目录出发解析路径。 路径类型定义示例当前目录/home/alice特点绝对路径 从根目录 / 开始的完整路径/home/alice/Documents/notes.txt唯一但冗长相对路径 从当前目录开始的缩写路径Documents/notes.txt 或 ../bob/file简洁需上下文 特殊符号 . 当前目录如 ./file 当前目录下的 file.. 父目录如 ../file 上级目录中的 file ⚖️ 树形目录的优缺点 优势 清晰层次️不同用户/项目分属不同子树如 /home/user1/ vs /var/log/。权限隔离可为每层目录设置不同访问权限如 chmod 750 /home/secret/。 ⚠️ 缺点 逐级访问开销⏳ 查找 /a/b/c/file 需读3次目录a→b→c增加磁盘I/O。解决方案通过符号链接ln -s缩短访问路径。 相对路径陷阱若当前目录变化如 cd ..相同相对路径可能指向不同文件树形结构不便于实现文件的共享 系统根目录用户目录范例关键命令Linux//home/username/pwd显示当前目录WindowsC:\C:\Users\Username\cd切换目录 3、目录操作 创建目录 作用在用户目录UFD或其子目录中新建目录或文件。 规则 检查当前目录下是否有同名文件/目录避免冲突❌ mkdir 或 touch 重名会报错。 示例 mkdir new_folder # 创建目录 touch new_file.txt # 创建文件️ **删除目录 ** 情况处理方法示例命令空目录直接删除无风险✅rmdir empty_dir非空目录两种方式① 递归删除所有子文件和目录rm -r ② 禁止删除非空目录如要删除必须采取递归调用方式来将其删除如早期 MS-DOSrm -r non_empty_dir (⚠️rm -rf /危险)改变当前目录 作用切换工作目录简化相对路径操作。 常用命令 cd /home/user/Documents # 绝对路径切换 cd ../Downloads # 相对路径返回上级再进入Downloads cd ~ # 回到用户主目录如 /home/username查看当前目录 pwd # 输出/home/user/Documents➡️ 移动目录/文件 作用调整目录结构修改文件路径。 命令 mv old_dir new_location/ # 移动目录路径变化 mv file.txt ../new_name.txt # 移动并重命名风险移动系统关键目录如 /usr/bin可能破坏依赖关系 链接操作 文件共享 链接类型特点命令示例硬链接共享 i-node删除原文件不影响硬链接⚠️ 不可跨文件系统ln source.txt hard_link软链接类似快捷方式存储目标路径✅ 可跨文件系统原文件删除后失效ln -s source.txt soft_link查找文件 精确匹配指定完整文件名 find /home -name report.pdf # 在 /home 下搜索 report.pdf模糊匹配通配符 * 或 ? find . -name *.log # 当前目录及其子目录中所有 .log 文件按类型查找目录/文件/链接 find /var -type d # 查找 /var 下所有目录7.3.4 目录查询技术 当用户请求访问文件时如cat report.txt系统执行以下流程 1️⃣ 文件名解析 用户提供文件名 → 系统在目录结构中搜索该文件。查找方式 绝对路径从根目录 / 逐级匹配如/home/user/report.txt。相对路径基于当前目录检索如./docs/report.txt。 关键目标找到文件的控制块FCB或索引结点i-node。 2️⃣ 获取文件元数据 通过FCB/i-node获取文件关键信息 大小 | 权限 | 时间戳 | 物理地址磁盘块号 3️⃣ 定位磁盘数据 系统根据 FCB/i-node 中的物理地址计算出文件在磁盘上的具体位置柱面/扇区。 4️⃣ 读取文件到内存 磁盘驱动程序执行 I/O 操作 寻道磁头移动到目标位置机械硬盘有延迟。⚡ 传输数据从磁盘读入内存缓冲区。 用户态交付最终将文件内容返回给用户程序如 cat 显示内容。 1、线性检索法 核心概念 线性检索法顺序检索法是最基础的目录搜索策略通过逐级比较文件名在目录中查找目标文件适用于单级目录和树形目录结构。 单级目录检索简单但低效 流程 输入用户提供文件名如 report.txt。检索系统依次遍历目录项逐一比对文件名。结果 ✅ 找到 → 返回文件控制块FCB或 i-node。❌ 未找到 → 报错“文件不存在”。 缺点效率低目录项多时耗时O(n) 时间复杂度。 树形目录检索多级路径解析 示例路径/usr/ast/mbox 1️⃣ 解析根目录 / 读入分量名 usr → 与根目录项顺序比较。 匹配结果找到 usr 目录项 → 获取其 i-node 号如 6。 定位数据根据 i-node 6 读取 usr 目录的物理盘块如 132号。 2️⃣ 解析第二级 /usr/ast 读入分量名 ast → 与 132 号盘块中的目录项顺序比较。 匹配结果找到 ast → 获取其 i-node 号如 26。 定位数据根据 i-node 26 读取 /usr/ast 的盘块如 496号。 3️⃣ 解析最终文件 /usr/ast/mbox 读入分量名 mbox → 与 496 号盘块中的目录项顺序比较。 匹配结果找到 mbox → 获取其 i-node 号如 60。 成功i-node 60 中存储了文件物理地址检索完成 ⚠️ 中断条件 任意一级匹配失败如 ast 不存在 → 立即终止并返回 “文件未找到”。 2、Hash 方法 核心思想 Hash 方法通过 文件名 → Hash值 → 快速定位目录项显著提升检索效率理想情况下O(1)适用于大目录场景。但需处理Hash冲突和通配符兼容性问题。 Hash 检索流程 无冲突场景理想情况 输入文件名如 report.txt。 计算Hash值通过Hash函数如MD5、CRC32转换为索引值。 hash(report.txt) % 100 → 索引值42定位目录项直接访问目录表的第42项。 ✅ 匹配成功 → 获取文件物理地址。❌ 目录项为空 → 文件不存在。 ⚡ 优势只需一次计算和访问速度极快 冲突处理关键难点 当不同文件名计算出相同Hash值时系统按以下规则解决 检查目录项若已存文件名 ≠ 目标名 → 发生冲突重新Hash 新索引 (原Hash值 常数) % 目录长度该 常数应与目录的长度值互质。重复步骤1直到找到匹配或空项。 举例report.txt和 data.log的Hash值均为42 第一轮查42 → 存的是 data.log不匹配。第二轮查 (421)%10043 → 找到 report.txt成功 限制与兼容性 场景处理方法原因文件名含通配符如*.txt退化为线性检索 Hash无法处理模糊匹配目录动态扩容需Rehash所有文件 Hash值依赖目录长度⚠️ 注意Hash函数选择应尽量均匀分布如SHA-1减少冲突概率。 性能对比 方法时间复杂度适用场景线性检索O(n)小目录/含通配符Hash检索O(1)*大目录/精确文件名匹配*注O(1)为平均情况冲突频繁时可能退化。 7.4 文件共享 7.4.1 基于有向无循环图实现文件共享 1、有向无循环图 DAG(Directed Acyclic Graph) 核心概念 有向无环图DAG 是一种允许文件/子目录被多个父目录引用的目录结构。 问题背景树形目录中文件共享必须通过属主目录非对称共享❌。DAG解决方案文件可被多个目录直接链接 如何建立共享链接 硬链接物理地址拷贝 操作将文件的物理盘块号复制到父目录项中。风险 若某个用户对文件 追加内容仅对操作者可见其他用户无法共享更新部分数据不一致多个父目录可能指向不同版本的文件内容。 适用场景适合 只读文件 致命缺陷硬链接破坏了共享文件的统一性 符号链接软链接 操作父目录中存储文件的路径名而非物理地址。优势所有父目录访问同一文件追加内容对所有用户可见。代价需要额外解析路径性能略低。适用场景适合 协作文件 2、利用索引结点 - 硬链接 传统目录 vs 索引结点方案 传统目录索引结点存储内容直接把文件地址、属性存目录里️目录只存文件名i-node指针共享问题硬链接导致更新不同步所有人通过i-node访问同一文件核心结构 #mermaid-svg-hCrqXDsHapQ1h8LY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .error-icon{fill:#552222;}#mermaid-svg-hCrqXDsHapQ1h8LY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hCrqXDsHapQ1h8LY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hCrqXDsHapQ1h8LY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hCrqXDsHapQ1h8LY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hCrqXDsHapQ1h8LY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hCrqXDsHapQ1h8LY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hCrqXDsHapQ1h8LY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hCrqXDsHapQ1h8LY .marker.cross{stroke:#333333;}#mermaid-svg-hCrqXDsHapQ1h8LY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hCrqXDsHapQ1h8LY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .cluster-label text{fill:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .cluster-label span{color:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .label text,#mermaid-svg-hCrqXDsHapQ1h8LY span{fill:#333;color:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .node rect,#mermaid-svg-hCrqXDsHapQ1h8LY .node circle,#mermaid-svg-hCrqXDsHapQ1h8LY .node ellipse,#mermaid-svg-hCrqXDsHapQ1h8LY .node polygon,#mermaid-svg-hCrqXDsHapQ1h8LY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hCrqXDsHapQ1h8LY .node .label{text-align:center;}#mermaid-svg-hCrqXDsHapQ1h8LY .node.clickable{cursor:pointer;}#mermaid-svg-hCrqXDsHapQ1h8LY .arrowheadPath{fill:#333333;}#mermaid-svg-hCrqXDsHapQ1h8LY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hCrqXDsHapQ1h8LY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hCrqXDsHapQ1h8LY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hCrqXDsHapQ1h8LY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hCrqXDsHapQ1h8LY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hCrqXDsHapQ1h8LY .cluster text{fill:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY .cluster span{color:#333;}#mermaid-svg-hCrqXDsHapQ1h8LY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hCrqXDsHapQ1h8LY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-hCrqXDsHapQ1h8LY .计数*{fill:#f9f!important;stroke:#333!important;}#mermaid-svg-hCrqXDsHapQ1h8LY .计数 span{fill:#f9f!important;stroke:#333!important;}文件名指针用户目录索引结点文件地址文件属性countcount计数器记录有多少目录指向该文件 如何解决共享问题 多用户的文件目录中都设置有指向共享文件的索引结点指针。此时由任何用户对共享文件所进行的操作都将引起其相应结点内容的改变 删除文件通过count确保安全删除如何系统收费始终由创建者count1时负责。【count2时创建者不能删除该文件 因为若删除了该文件也必然删除了该文件的索引结点这样便会使另一个使用者的指针悬空】 #mermaid-svg-7VXkbVfj7ou3KHNA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA .error-icon{fill:#552222;}#mermaid-svg-7VXkbVfj7ou3KHNA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7VXkbVfj7ou3KHNA .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-7VXkbVfj7ou3KHNA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7VXkbVfj7ou3KHNA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7VXkbVfj7ou3KHNA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7VXkbVfj7ou3KHNA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7VXkbVfj7ou3KHNA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7VXkbVfj7ou3KHNA .marker.cross{stroke:#333333;}#mermaid-svg-7VXkbVfj7ou3KHNA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7VXkbVfj7ou3KHNA .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7VXkbVfj7ou3KHNA text.actortspan{fill:black;stroke:none;}#mermaid-svg-7VXkbVfj7ou3KHNA .actor-line{stroke:grey;}#mermaid-svg-7VXkbVfj7ou3KHNA .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA .sequenceNumber{fill:white;}#mermaid-svg-7VXkbVfj7ou3KHNA #sequencenumber{fill:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA .messageText{fill:#333;stroke:#333;}#mermaid-svg-7VXkbVfj7ou3KHNA .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7VXkbVfj7ou3KHNA .labelText,#mermaid-svg-7VXkbVfj7ou3KHNA .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-7VXkbVfj7ou3KHNA .loopText,#mermaid-svg-7VXkbVfj7ou3KHNA .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-7VXkbVfj7ou3KHNA .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7VXkbVfj7ou3KHNA .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-7VXkbVfj7ou3KHNA .noteText,#mermaid-svg-7VXkbVfj7ou3KHNA .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-7VXkbVfj7ou3KHNA .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7VXkbVfj7ou3KHNA .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7VXkbVfj7ou3KHNA .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7VXkbVfj7ou3KHNA .actorPopupMenu{position:absolute;}#mermaid-svg-7VXkbVfj7ou3KHNA .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-7VXkbVfj7ou3KHNA .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7VXkbVfj7ou3KHNA .actor-man circle,#mermaid-svg-7VXkbVfj7ou3KHNA line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-7VXkbVfj7ou3KHNA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}用户Ainode用户B修改文件内容实时同步更新请求删除count2→拒绝用户Ainode用户B 7.4.2 利用符号链接实现文件共享 1、利用符号链接(Symbolic Linking)的基本思想 符号链接允许 一个文件有多个“父目录”但 只有一个主父目录其他都是快捷方式 符号链接 创建“文件快捷方式”存储目标文件路径访问时自动跳转 传统树结构符号链接结构父目录类型所有连接都是实线真实父目录 ️1个实线主父目录 N个虚线符号链接 2、如何利用符号链实现共享 示例让 D5 共享 D6 的文件 F8实现符号链接 创建符号链接文件 系统在目录 D5 下创建 LINK 类型 文件名称与原文件相同F8。该文件**内容仅为真实文件路径**如 /D6/F8。 # Linux命令行示例ln -s ln -s /D6/F8 D5/F8 # 创建符号链接文件结构变化 目录/文件类型存储内容/D6/F8真实文件文件数据/D5/F8符号链接路径 /D6/F8️ 用户访问流程 用户 B 打开 /D5/F8 → 系统发现是符号链接不是真实文件。操作系统自动解析路径 /D6/F8并访问真实文件。最终读写操作 作用在 /D6/F8 上实现共享 即使软链接指向的共享文件已被删除Link型文件依然存在只是通过 Link 型文件中的路径去查找共享文件会失败(找不到对应目录项) 3、利用符号链实现共享的优点 1️⃣ 文件主Owner绝对掌控 索引结点i-node指针 仅有**文件主**持有而 共享用户只能通过路径访问 。文件主删除文件后️【无耦合安全删除 】 其他用户的符号链接自动失效 ❌不会出现“悬空指针”问题。系统检测到文件不存在自动删除无效符号链避免累积垃圾。 2️⃣ 支持跨系统/网络共享 符号链可指向任何有效路径包括 同一磁盘不同目录 不同磁盘/分区 网络文件如 Web 链接 3️⃣ 灵活权限管理 ️ 用户只需 路径访问权限无需持有原文件的 i-node。适合多用户环境 如服务器共享文件。 4、利用符号链的共享方式存在的问题 性能略低每次访问需 解析路径比硬链接多一次 I/O。死链Dangling Link若原文件被删需手动或定期清理无效符号链可用 find -xtype l 查找。存储开销每个符号链占用 1 i-node 少量空间存路径字符串。 7.5 文件保护 威胁类型典型案例防护措施具体实现技术/工具1. 人为因素 - 误删文件 - 恶意篡改 - 越权访问存取控制机制 - 权限分档rwx - ACL访问控制列表 - 多因素认证2. 系统因素 - 磁盘故障 - 系统崩溃 - 软件漏洞系统容错技术 ♻️- RAID磁盘阵列 - 事务日志Journaling - 热备组件3. 自然因素 - 磁盘老化 - 磁场干扰 - 物理损坏后备系统 ️- 定期备份全量/增量 - 异地容灾 - 数据校验 口令保护 口令一般存放在文件对应的 FCB 或索引结点中。 用户访问文件前需要先输入“口令”操作系统会将用户提供的口令与FCB中存储的口令进行对比如果正确则允许该用户访问文件。 优点: 保存口令的空间开销不多验证口令的时间开销也很小。 缺点: 正确的“口令”存放在系统内部不够安全。 密码保护 使用某个“密码”对文件进行加密在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。优点: 保密性强不需要在系统中存储“密码”缺点: 编码/译码或者说加密/解密要花费一定时间 7.5.1 保护域(Protection Domain) 1、访问权 1️⃣ 基本概念 定义进程对某个对象Object 执行特定操作的权限。【由**系统控制**进程对对象的访问】对象类型 硬件对象 磁盘、打印机、内存等。软件对象 文件、程序、数据库等。 权限示例文件 → 读R、写W、执行X。 2️⃣ 访问权的表示方法 例子进程对文件 report.txt 有 读写权限 → (report.txt, {R, W}) ✏️ 2、保护域 1️⃣ 基本概念 定义保护域Domain是 进程对一组对象访问权的集合规定了进程能访问的对象和操作范围。核心规则 进程只能在指定的域内操作不能跨域越权 2️⃣ 保护域的特性 特性说明例子 ️对象集合 一个域包含一组可访问的对象文件、打印机等。域1文件F、打印机PR1权限绑定 每个对象在域中有明确的权限如读、写、执行。域1中文件F1可读文件F2可读写跨域共享 同一对象可出现在多个域中权限可能不同。打印机PR1同时属于域2和域3 3️⃣ 保护域的作用 最小权限原则 限制进程仅拥有必要权限避免过度授权。隔离性 防止错误/恶意进程破坏其他域的资源。灵活共享 ♻️通过跨域分配对象实现安全共享。 3、进程和域间的静态联系 静态域进程 整个生命周期仅绑定一个固定保护域权限 无法动态调整。问题 权限过度分配进程可能获得实际不需要的访问权如同时拥有磁带机和打印机权限。特性 权限固定进程启动时就拥有域内所有对象的权限无法中途释放/变更。资源浪费域需包含进程全程可能用到的所有对象即使某阶段不需要, 存在闲置权限。 4、进程和域间的动态联系方式 动态域进程在不同的 运行阶段 可以关联 不同的保护域一对多联系。核心优势 按需分配权限进程只在当前阶段拥有必要的最小权限。特性 阶段化权限进程生命周期被划分为多个阶段每个阶段绑定一个域。最小权限域仅包含当前阶段所需的对象。 7.5.2 访问矩阵 1、基本的访问矩阵 基本概念 访问矩阵Access Matrix 是表示 保护域Domain 和 对象Object 之间权限关系的数据结构。行Row 域Domain代表进程执行的权限环境如 D₁, D₂。列Column 对象Object代表系统中的资源如文件 F₁、打印机 Printer 1。矩阵项Cell 访问权Access Rightsaccess(i, j) 表示域 Dᵢ 对对象 Oⱼ 的操作权限如 R-读W-写E-执行。 访问矩阵示例 域\对象F₁F₂F₃F₄F₅F₆Printer 1Plotter 2D₁RR, WD₂RR,W,ER, WWD₃R,W,EWW是由 三个域 和 8个对象 所组成的: 进程在域D1中运行时它能读文件F1、读和写文件F2。进程在域D2中运行时它能读文件 F3、F4和F5以及写文件F4、F5和执行文件F4此外还可以使用打印机 1。进程在域D3中运行时才可使用绘图仪 2。 2、具有域切换权的访问矩阵 Switch 权限S在访问矩阵中新增一项表示域间的切换权。 仅当 switch_access(i, j) S 时进程才能从 域 Dᵢ 切换到 Dⱼ。切换权**由系统或管理员授予**避免进程随意越权。 具有域切换权的访问矩阵示例 域\对象F₁F₂F₃F₄F₅F₆Printer 1Plotter 2域 D₁域 D2域 D3D₁RR, WSD₂RR,W,ER, WWSD₃R,W,EWW 允许在域D1中的进程切换到域D2中允许在域D2中的进程切换到域D3中。 7.5.3 访问矩阵的修改 1、拷贝权(Copy Right) 拷贝权Copy Right 是一种 动态权限扩展机制允许进程将 某个域中对某对象的访问权复制到其他域 中但会对权限的传播进行限制以防止无限扩散风险。 关键点 拷贝标记*在访问权如 R*、W*中* 表示该权限可被拷贝至其他域。限制拷贝拷贝后生成的权限不带 *如 R* → R阻止进一步扩散。目的实现权限的 可控共享避免权限滥用。 域\对象F₁F₂F₃D₁EW*D₂ER*ED₃E运行在D2域中的进程可以将其对文件F2的读访问权扩展到域 D3中去使在域D3中运行的进程也具有对文件F2的读访问权。 运行在域D1中的进程可以将其对文件F3的写访问权扩展到域 D3中去使在域D3中运行的进程也具有对文件F3的写访问权。 域\对象F₁F₂F₃D₁EW*D₂ER*ED₃ERW2、所有权(Owner Right) 所有权Owner Right 赋予进程对某对象 完整的控制权包括 增删权限可以修改其他域对该对象的访问权。动态权限管理无需管理员介入拥有者可自主调整权限。 所有权用 O 标记在访问矩阵中如 access(i,j) O表示域 Dᵢ 对对象 Fⱼ 拥有所有权。 域\对象F₁F₂F₃D₁O,EWD₂R*,OR*,O,WD₃E在域 D1中运行的进程(用户)是文件F1的所有者它能增加或删除在其它域中的运行进程对文件F1的访问权。 如下表在域 D1中运行的进程删除了在域D3中运行的进程对文件F1的执行权; 在域 D2中运行的进程(用户)是文件F2和文件F3的拥有者, 该进程可以增加或删除在其它域中运行的进程对这两个文件的访问权。 如下表在域 D2中运行的进程增加了在域D3中运行的进程对文件F2和F3的写访问权。 域\对象F₁F₂F₃D₁O,ED₂R*,OR*,O,WD₃WW3、控制权(Control Right) 拷贝权和所有权都是用于改变矩阵内同一列的各项访问权的或者说是用于改变在不同域中运行的进程对同一对象的访问权的。 控制权Control Right 可用于改变矩阵内同一行中(域中)的各项访问权亦即用于改变在某个域中运行的进程对不同对象或域的访问权的。 权限标记access(i,j) Control表示域 Dᵢ 可以控制域 Dⱼ 的权限。 域\对象F₁F₂F₃F₄F₅F₆Printer 1Plotter 2域 D₁域 D2域 D3D₁RR, WD₂RR,W,ER, WWControlD₃R,W,EWW 在 access(D₂,D3)中包括了控制权则一个在域 D2中运行的进程能够改变对域D3内各项的访问权。 7.5.4 访问矩阵的实现 1、访问控制表(Access Control List) ACL对 访问矩阵按列(对象)划分为 每一列建立一张访问控制表 ACL。在该表中已把矩阵中属于该列的 所有空项删除此时的访问控制表是由一 有序对(域权集)所组成的。 ACL(F₁) { (D₁, {R, W}), (D₂, {R}), (D₃, {W}) }域的两种实现方式 域类型说明示例场景用户作为域每个用户是一个域权限绑定用户身份用户A可读文件F用户B可写文件F。进程作为域每个进程是一个域权限绑定进程身份进程P₁可执行程序进程P₂不可。 ACL的存储与查询 存储位置 文件系统ACL 常存放在文件的控制块FCB或 i-node中。数据库作为对象的元数据。 权限查询流程 缺省 ACLDefault ACL 是一种 预先定义的权限模板用于在新建子对象文件/目录时自动继承权限。 核心功能当在目录下创建新文件或子目录时系统会 自动将缺省 ACL 的权限赋予新对象无需手动设置。 #mermaid-svg-lDaCtyGFo7UPkWbw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .error-icon{fill:#552222;}#mermaid-svg-lDaCtyGFo7UPkWbw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lDaCtyGFo7UPkWbw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lDaCtyGFo7UPkWbw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lDaCtyGFo7UPkWbw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lDaCtyGFo7UPkWbw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lDaCtyGFo7UPkWbw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lDaCtyGFo7UPkWbw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lDaCtyGFo7UPkWbw .marker.cross{stroke:#333333;}#mermaid-svg-lDaCtyGFo7UPkWbw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lDaCtyGFo7UPkWbw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .cluster-label text{fill:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .cluster-label span{color:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .label text,#mermaid-svg-lDaCtyGFo7UPkWbw span{fill:#333;color:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .node rect,#mermaid-svg-lDaCtyGFo7UPkWbw .node circle,#mermaid-svg-lDaCtyGFo7UPkWbw .node ellipse,#mermaid-svg-lDaCtyGFo7UPkWbw .node polygon,#mermaid-svg-lDaCtyGFo7UPkWbw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lDaCtyGFo7UPkWbw .node .label{text-align:center;}#mermaid-svg-lDaCtyGFo7UPkWbw .node.clickable{cursor:pointer;}#mermaid-svg-lDaCtyGFo7UPkWbw .arrowheadPath{fill:#333333;}#mermaid-svg-lDaCtyGFo7UPkWbw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lDaCtyGFo7UPkWbw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lDaCtyGFo7UPkWbw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lDaCtyGFo7UPkWbw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lDaCtyGFo7UPkWbw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lDaCtyGFo7UPkWbw .cluster text{fill:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw .cluster span{color:#333;}#mermaid-svg-lDaCtyGFo7UPkWbw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lDaCtyGFo7UPkWbw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}找到权限未找到找到权限未找到用户/进程请求访问对象检查缺省ACL允许/拒绝访问检查对象ACL拒绝访问2、访问权限(Capabilities)表 访问权限表访问矩阵按行(即域)划分便可由 每一行构成一张访问权限表。换言之这是由一个域对每一个对象可以执行的一组操作所构成的表。表中的每一项即为该域对某对象的访问权限。 当域为用户(进程)、对象为文件时访问权限表便可用来描述一个用户(进程) 对每一个文件所能执行的一组操作。 访问权限表的组成三字段 字段说明类型对象类型如文件、打印机、目录。权力域对该对象的操作权限如 读、写、执行。对象指向对象的指针如 UNIX 的 i-node 编号。 ️ 安全性实现 禁止用户直接访问权限表 权限表存储在内核或受保护的 系统专用区用户进程无法直接修改。只有通过 合法性检查的系统调用 才能查询或更新权限。 动态权限绑定流程 #mermaid-svg-2SY1mP6z6XUIKMI7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .error-icon{fill:#552222;}#mermaid-svg-2SY1mP6z6XUIKMI7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2SY1mP6z6XUIKMI7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .marker.cross{stroke:#333333;}#mermaid-svg-2SY1mP6z6XUIKMI7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .cluster-label text{fill:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .cluster-label span{color:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .label text,#mermaid-svg-2SY1mP6z6XUIKMI7 span{fill:#333;color:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .node rect,#mermaid-svg-2SY1mP6z6XUIKMI7 .node circle,#mermaid-svg-2SY1mP6z6XUIKMI7 .node ellipse,#mermaid-svg-2SY1mP6z6XUIKMI7 .node polygon,#mermaid-svg-2SY1mP6z6XUIKMI7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .node .label{text-align:center;}#mermaid-svg-2SY1mP6z6XUIKMI7 .node.clickable{cursor:pointer;}#mermaid-svg-2SY1mP6z6XUIKMI7 .arrowheadPath{fill:#333333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-2SY1mP6z6XUIKMI7 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-2SY1mP6z6XUIKMI7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2SY1mP6z6XUIKMI7 .cluster text{fill:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 .cluster span{color:#333;}#mermaid-svg-2SY1mP6z6XUIKMI7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2SY1mP6z6XUIKMI7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}有权无权进程首次访问对象查ACL: 是否有权?创建访问权限项并绑定到进程拒绝访问并触发异常后续访问直接校验权限表访问完成? 释放权限项 对比ACL与权限表Capabilities 特性访问控制表ACL访问权限表Capabilities视角对象为中心文件→用户权限域为中心进程→可访问对象查询效率对象被访问时需遍历ACL进程直接持有权限表无需重复检查 7.6 文件存储空间管理 - 空闲磁盘块管理 7.6.1 存储空间的划分与初始化 7.6.2 存储空间管理 空闲表法 空闲链表法 位示图法 成组链接法 空闲表法、空闲链表法不适用于大型文件系统因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。 基本原理 空闲块根据大小划分成若干个组。【UNIX默认采用每组100个空闲块的配置】每个组的空闲块通过链表进行连接链表中的每个节点表示一个空闲块。当系统需要分配存储空间时首先根据请求的大小选择合适的链表然后从链表中分配空闲块。当块被释放时它会被返回到相应大小的链表中。 组的划分通常有几种不同的划分策略 按固定大小划分每个组管理固定大小的块。例如组1管理1KB的块组2管理2KB的块组3管理4KB的块以此类推。按块大小范围划分根据一定的大小范围进行划分每个组管理一个大小范围内的块。例如组1管理1KB到2KB的块组2管理2KB到4KB的块等。按指数划分将空闲块的大小按照指数级别划分比如2的倍数的块2KB, 4KB, 8KB等 7.7 虚拟文件系统和文件系统挂载 普通文件系统 vs 虚拟文件系统 文件系统挂载 文件系统挂载(mounting)即文件系统安装/装载–如何将一个文件系统挂载到操作系统中? ① 在VFS中注册新挂载的文件系统。内存中的挂载表(mount table)包含每个文件系统的相关信息包括文件系统类型、容量大小等。 ② 新挂载的文件系统要向VFS提供一个函数地址列表 ③ 将新文件系统加到挂载点(mountpoint)也就是将新文件系统挂载在某个父目录下【windows 和C、D盘平级Mac 在根目录下的Volumes文件夹下】 参考 教材 计算机操作系统第四版 (汤小丹) (Z-Library).pdf 操作系统 (罗宇清华大学出版社 2023年) (Z-Library).pdf 视频 王道计算机考研 操作系统 【天勤考研】成组链接法
http://www.pierceye.com/news/391509/

相关文章:

  • 一站式网站建设业务沈阳网站建设 熊掌号
  • 58同城网站建设目的劳务公司怎么注册需要什么要求
  • 龙华网站建设设计公司国家中小学智慧教育平台
  • 摄影网站采用照片做宣传_版权费是多少?pythom+网站开发规范
  • 免费制作一个自己的网站吗达内教育口碑怎么样
  • 2015做那个网站能致富网站建设模板ppt模板
  • 网站后台管理系统教程自助网站建设程序
  • 做黑帽需不需要搭建网站没有做等保的网站不能上线对吗
  • 怎么在微信建立公众号郑州专业seo首选
  • 万网网站后台国家域名
  • 怎么做 niche网站临港注册公司优惠政策
  • 做网站开发怎么做网站推广的步骤
  • 网站空间文件删不掉软文免费发布平台
  • 电子商务网站开发教程论文推广app平台有哪些
  • 郑州专业的网站建设优化自己的网站
  • 申请渠道门户网站是什么意思微信公众平台推广网站
  • 公司网站未备案公众号如何推广产品
  • 网站建设服务器环境配置郑州网站建设企业名录
  • e福州官方网站wordpress注册目录
  • 国际外贸网络交易平台网页seo搜索引擎优化
  • 做网做网站建设网站建设图片怎么切
  • 国外数码印花图案设计网站36kr wordpress
  • 上海网站建设设计公司zencart 网站入侵
  • 阜蒙县自治区建设学校网站汉中市住建局建设厅网站官网
  • windows 2008 iis怎么搭建网站手机网站模板建站
  • 优设网官网首页seo教程搜索引擎优化
  • 做问卷给钱的网站页面设计结课总结
  • 洛阳集团网站建设wordpress 深度优化
  • python做网站缺点湛江市建网站
  • 济南网站建设(选聚搜网络)在线购物网站建设