【2021/7/19更新】【梳理】简明操作系统原理 附录二 一个简易文件系统的实现(docx)

【2021/7/19 更新】【梳理】简明操作系统原理 第三章 高级调度策略(docx) 参考教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau 在线阅读: http://pages.cs.wisc.edu/~remzi/OSTEP/ University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课... 阅读详情

配套教材:
Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Reiher
参考书目:
1、计算机操作系统(第4版) 汤小丹 梁红兵 哲凤屏 汤子瀛 编著 西安电子科技大学出版社

在线阅读:
http://pages.cs.wisc.edu/~remzi/OSTEP/
University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。
————————————————————————————————————————
这是专业必修课《操作系统原理》的复习指引。
需要掌握的概念在文档中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
文档下载地址:
链接:https://pan.baidu.com/s/1Mc5OtNjHrH3dg1qCCcmiow
提取码:0000

附录二 一个简易文件系统的实现

本章我们实现一个名为VSFS(Very simple file system)的文件系统。该系统的细节在许多文件系统中都能见到。

构思一个文件系统,主要通过两方面:
一是数据结构。在磁盘上需要采用什么结构来存储数据和元数据呢?
二是访问方法。当进程发出open()、read()、write()等系统调用时,应当怎样处理?需要读写哪些数据结构?处理效率如何?

首先我们设置一个块大小:4 KB。这个块大小比较常见。设置块大小的原因主要有二:
(1)防止单次传输的数据量过小进而导致性能低下。
(2)整体进行管理。我们不可能为每个字节记录相应的用于管理的数据。

文件系统的结构我们设计成这样:

首先是数据区(data region)。顾名思义,这部分自然用来存放数据。
接下来是索引节点(index node)区。索引节点包含了文件的元数据,包括文件大小、所在的块、访问权限、修改日期、访问日期、文件类型等信息。所有的文件系统也有类似索引节点的数据结构。
ib和db分别代表索引节点位映像(bitmap)、数据区位映像。位映像的每一位都对应一个块,标记其是否已经使用。S区域叫做超级块(super block),主要包括文件系统本身的基本信息,比如索引节点数、数据块数、各区域的起始位置等。S区也很可能包含一个魔数,方便应用程序快速识别文件系统的类型。

举例:Ext2的索引节点至少包含以下信息:

大小(字节) 名称 描述
2 mode 读、写、执行的权限
2 uid 所有者的用户ID
4 size 文件大小(字节)
4 time 访问时间
4 ctime 创建时间
4 mtime 修改时间
4 dtime inode删除时间
2 gid 所在组的ID
2 links_count 硬链接数
4 blocks 已分配的块数量
4 flags 标志位
4 osd1 (与操作系统耐油管)
60 block 磁盘指针集合(共15个)
4 generation 文件版本(NFS使用)
4 file_acl 更多的权限控制
4 dir_acl 访问控制列表(ACL)

回到我们实现的VSFS上来。
一个索引节点需要包含一些指针,指向文件在磁盘上存储的块,称为直接指针(direct pointer)。如果文件比较大,就会把这个区域用完。所以我们需要想其它办法。
一个常用的办法是:把存储直接指针的区域的一个指针改为间接指针(indirect pointer)。当文件存储的块数比较多的时候,就分配一个新的块,里面包含了额外的指针。而间接指针指向这个新分配的区域。如果还是不够,就把这个分配再做一次,直到直接指针的数量足够为止。
还可以使用二重间接指针(double indirect pointer):在索引节点中加入一个指针,指向一个块,块里全部是指向数据区的直接指针。当然,还可以再进一步,使用三重间接指针(triple indirect pointer)。原理很相似,这里不多说。这种思想称为多级索引(multi-level index)。
Linux ext2和ext3,NetApp的WAFL都采用多级索引方式。而SGI XFS和Linux ext4则采用“指针+长度”的方式来描述数据在磁盘上的位置。一个“指针+长度”结构可以代替大量的直接指针来描述一段连续的数据的存储位置。
研究表明,计算机中存储的绝大多数文件都很小。所以,索引节点一般都会留有一些位置存储直接指针;只有在存储更大的文件的时候,才启用多级索引或基于范围(extent)的表示——(头)指针与长度。例如,一个索引节点可以包含12个直接指针。当块大小为4 KB时,这种直接的表示方法最多可以表示不超过48 KB的小文件在磁盘上的分布。
当然,计算机在发展,文件系统也是。一些新型的文件系统可能采用完全不同的方式来索引文件。

下面我们为VSFS设计目录结构。目录的本质是一张表,里面存储了该目录下的各个文件的基本信息。我们采用这样的结构:

目录的每一项都有两个成员:与该目录关联的文件的索引节点号,和该项记录的长度。由上图可以看出,这个目录记录了5项,分别是当前目录、父目录、foo、bar、foobar_is_a_pretty_longname的信息。strlen一项代表文件名的长度(文件名末尾的’\0’也算)。foobar_is_a_pretty_longname正好比foo、bar多出24个字符,导致记录它的项的长度从12增加到了36。
如果删除一个目录下的文件,那么目录中对应的记录就会被擦掉并留空。要有专门的方法来表示这种情况(例如将索引号记0)。当添加新的项时,可以直接写入中间的空白部分。
文件系统常常把目录也当作一种特殊的文件对待,所以一个目录也有它的索引节点号。如果采用多级索引,那么新申请的存储间接指针的块自然也会有索引节点号。
线性表并不是存储目录的唯一方法。例如,XFS就采用B树作为目录结构。

如果用链表实现索引节点或等效的结构,会导致顺序访问和随机访问(尤其后者)的性能大幅降低。为了提升性能,有的文件系统会在内存中保留这种表,而不是向刚才说的那样将指向下一片连续区域的指针存在专门的数据块中。文件分配表(file allocation table,FAT)采用的就是这种基本结构。FAT将若干个连续扇区视为一个簇(cluster),以簇为单位来存取数据。表中每一项的索引是簇编号,而项的内容是所属文件的下一个数据块或EOF(End of File)标记。FAT与UNIX文件系统还有其它的不同,比如没有索引节点,使用目录中的项来存放元数据并指向文件的第一个数据块,这也同样为实现硬链接提供了基础。

位映像只是一种管理空闲空间的方法。一些早期的文件系统使用专门的空闲列表,用一个指针指向空闲空间的第一个块,块内具有指向下一个空闲块的指针。当有块需要被写入时,相应的头指针就要改变。
现代的文件系统则采用较复杂的结构。XFS使用B树来记录空闲块。

若使用位映像来标记空闲区域,则在创建新文件时,申请新的索引节点和数据块后,要把相应的位标为已占用。
文件系统在为新文件分配空间时,常常使用预分配(pre-allocation)的启发式策略:尽量查找连续的空闲区域。

下面通过一个例子演示VSFS如何实现读取文件:

设要打开一个文件 /foo/bar,一共12 KB,正好占了三个块。
当调用open(bar)时,文件系统需要先找到根目录的索引节点,然后依次查找foo目录和文件bar的索引节点,来获得诸如访问权限和文件大小之类的基本信息。文件系统根据需要打开的文件的绝对路径去查找需要的索引节点。通过索引节点号可以找到索引节点的位置。根没有父目录,要通过专门的方法来访问根的索引节点(想一想:在数据结构的学习中,通过一个专门的变量指向二叉树的根节点)。在多数UNIX文件系统中,根节点的索引节点号是2(inode 0代表空值,inode 1指向一个特殊的文件,该文件包含了磁盘上的全部坏块)。
找到根的索引节点后,就从索引节点中读出根目录的数据块的分布位置并进行访问。此时,文件系统通过索引节点中的指针来读取根目录文件,查找包含foo的项。找到后,文件系统就去查找foo的索引节点。如此递归查找,直到找到bar的索引节点。找到以后,就将其读入内存,检查权限。权限检查通过后,就分配一个文件描述符,并更新已打开文件表,将文件描述符返回给用户。
打开以后,程序就可以进行read()和lseek()操作了。进行读操作时,先从文件的索引节点中找到需要读取的数据块,读取,然后在索引节点中修改最后访问时间。内存中的已打开文件表也要更新,因为要修改偏移量。
读取完毕关闭文件的时候,工作量就少多了:只需要释放文件描述符。关闭文件不引发磁盘I / O。
open引发的I / O数量与路径的级数成正比例,因为每访问一级子目录都需要读取对应的索引节点和目录文件。但是I / O个数不是决定open操作的耗时的唯一因素。如果目录中的文件非常多,读完目录文件就需要较长的时间。

注意:读取时,位映像不会被访问,因为一个块是否已经被使用不影响读取。

我们继续通过一个例子来演示VSFS的写入文件操作:

如果需要创建新文件并写入或追加内容,那么还需要分配新的块。创建文件时,需要更新索引节点的位映像,还要在新文件所在目录写入新的条目,所在目录对应的索引节点也要更新,然后为新文件创建索引节点。创建一个空文件不写入数据区,但需要在找不到该文件的索引节点时创建新的索引节点。
写入新文件时,因为要在数据区写入,所以索引节点和数据区的位映像都要更新。先后顺序是:先读取新文件的索引节点,在数据区位映像中查找一个数据块,确认对应的块空闲,就将这一位标记为占用,然后在数据区写入数据,并更新索引节点。

由上面两个例子我们可以看到,读写操作会产生很多I / O。怎样提升磁盘I / O效率呢?答案是:缓存。非常多的文件系统在系统启动时申请一部分内存空间作为缓存。如果这段空间是静态分配的,它们常常占据内存的10 %。不过,现代的文件系统采用动态分配的方式。具体来说,是采用统一页缓存(unified page cache)的方式,使得在内存和文件系统之间的分配方式更灵活。这部分缓存占用的空间视需要而定。
存储空间的静态分配和动态分配各有优缺点。静态分配更容易实现,而且性能更容易预测,还容易保证每个用户都能尽量公平地分得空间。但动态分配则令空间利用率更好,但实现更复杂,并且有时还会导致性能降低:一些用户因为某段时间对空间需求较少,分配给它们的资源被分配给了其它用户;而当这些用户又需要更多空间时,可能需要等待其它用户释放资源。

出于性能的考虑,写入缓存会延迟写入。但是如果在存盘之前发生了系统故障或断电,未存盘的数据就会丢失。如果确实需要立即将数据写入磁盘,应用程序往往调用fsync(),或者通过直接I / O(Direct I / O)或Raw Disk方式绕过文件系统读写磁盘。不过,多数程序在写入缓存上都遵循文件系统的安排。
Sqribble:云原生文档操作系统与自动化排版原理 文档自动化工具的核心在于将内容生产从‘格式调试’升维为‘结构化交付’。其底层依赖模板驱动的确定性排版引擎、语义化内容归一化机制及云原生协作架构,实现标题识别、目录生成、页眉页脚同步等关键环节的零手动干预。这类工具并非替代写作,而是通过契约式模板固化设计规范,显著降低视觉决策成本,提升内容创作者在营销材料、培训手册、咨询报告等场景下的交付效率与品牌一致性。Sqribble正是这一范式的典型代表。 阅读详情

相关推荐

模板即契约:文档自动化操作系统的原理与实践

文档自动化并非简单地用AI生成内容,而是通过结构化模板、确定性规则引擎和云原生工作流,实现‘内容→结构→视觉→交付’的可复用闭环。其核心在于将排版逻辑、品牌规范与合规要求编码为可执行协议,使非设计人员也能稳定输出专业PDF。这种基于规则的确定性渲染,保障了跨设备、跨浏览器的一致性输出,显著提升知识型团队在白皮书、SOP、销售手册等高频结构化文档中的协作效率与交付质量。Sqribble 作为典型代表,体现了模板驱动而非AI驱动的文档生产力范式。

weixin_33826609的博客 319

文件系统实现

文件系统实现 文件系统结构 磁盘提供大量的外部空间来维持文件系统。磁盘的下述两个特点,使其成为存储多个文件的方便介质: 可以原地重写,可以从磁盘上读一块,修改该快,并将它写回到原来的位置。 可以直接访问磁盘上的任意一块信息。因此,可以简单地顺序或随机地访问文件,从一个文件切换到另一个文件只需要简单地移动读写磁头并等待磁盘转动即可以完成。 为了提供对磁盘的高效且...

kexinxin1的博客 998

文档操作系统:模板驱动的自动化排版原理与实践

文档操作系统是一种以模板为执行核心、面向内容生产者的自动化排版范式,其本质是将排版规则代码化、结构映射标准化、渲染逻辑确定化。它基于内容归一化引擎将杂乱输入(Word/URL/文本)统一为Heading/Paragraph/Image等原子节点,并通过约束性模板与全局样式联动机制,实现所见即所得的稳定输出。该技术显著降低非设计人员在PDF报告、白皮书、培训手册等专业文档制作中的格式维护成本,提升交付一致性与版本可控性,广泛应用于B2B营销、合规文档、知识复利等需高频、高质、高稳输出的工程化场景。

weixin_33881140的博客 279

【操作系统】简易文件系统设计

【操作系统】 简易文件系统 这个是本学期最后一次的操作系统实验,个人觉得做得还行,故写篇博客分享一下。 实验要求 创建一个100M的文件或者创建一个100M的共享内存 尝试自行设计一个C语言小程序,使用步骤1分配的100M空间(共享内存或mmap),然后假设这100M空间为一个空白磁盘,设计一个简单的文件系统管理这个空白磁盘,给出文件和目录管理的基本数据结构,并画出文件系统基本结构图,以及基本操作接口。(30分) 在步骤1的基础上实现部分文件操作接口操作,创建目录mkdir,删除目录rmdir

Dong142857的博客 6295

模板驱动型文档自动化:零代码实现专业文档智能生成

文档自动化是现代知识工作的核心提效技术,其本质是通过结构化建模将重复性文档生产从手工排版升级为逻辑驱动的智能填充。它基于模板引擎实现条件显隐、动态字段绑定与自动排版,无需编程即可完成PDF/DOCX双轨交付。相比传统邮件合并,该技术支持嵌套逻辑、样式继承与版本化管理,显著提升内容一致性与交付效率。广泛应用于咨询方案、法律文书、营销策划、教育培训等需高频产出标准化文档的场景。本文聚焦Sqribble平台,详解模板驱动、零代码自动化与所见即所得交付三大核心能力。

weixin_34396902的博客 467

从零开始构建简易文件系统

文件系统的设计涉及到多个方面,包括但不限于数据存储结构、文件和目录的管理、权限控制、数据一致性和容错能力等。在设计一个简易文件系统时,我们首先需要确定系统的基本需求,比如它需要支持哪些基本操作,是否有对数据一致性的特殊要求,以及如何高效地管理磁盘空间。元数据包括文件名、大小、权限、文件所有者等信息,也包括文件存储位置的具体指针和索引。在文件系统中,元数据通常被存储在特定的管理区域,例如inode表。// 定义元数据结构int size;// 权限位uid_t uid;// 所有者ID。

weixin_34064233的博客 1087

深圳大学操作系统实验四 文件系统

了解Linux 文件命令行操作命令;了解Linux ext3文件系统上的软硬链接;可以使用Linux或其它Unix类操作系统;学习该操作系统提供的文件系统的命令行接口;学习文件的软硬链接的使用;硬件:桌面PC软件:Linux 或其他操作系统学习使用Linux文件系统提供的的ls 、touch、rm、cp、mv、mkdir等命令(希望尽量涵盖各种满足日常编程所需操作),了解EXT2文件系统。操作部分(参考):1) 构建以下目录子树:(20%)

jannleo的博客 1998

一个简单的文件系统(操作系统课程设计)

一个简单的文件系统(操作系统课程设计)主要任务是对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性。文件管理具有对文件存储空间的管理、目录管理、文件的读/写管理以及文件的共享与保护功能。从用户的角度看,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射,所以目录应实现“按名存取”,“按名存取”是目录管理中最基本的功能,也是文件系统向用户提供的最基本的服务。目录管理中有多种实现机制,其中二级目录机制可以解决多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。

深圳大学操作系统综合实验2简易文件系统设计

综合利用文件管理的相关知识,结合对文件系统的认知,编写简易文件系统,加深操作系统中文件系统和资源共享的认识。

2401_83530078的博客 1873

模拟一个小型磁盘文件管理系统

设计一个简单的磁盘文件管理系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现: (1)支持多级目录结构,支持文件的绝对路径访问; (2)文件的逻辑结构采用流式(字节流)结构,物理结构采用链式结构中的显式链方式; (3)磁盘管理采用文件分配表; (4)实现文件操作命令:创建目录、列表目录、删除空目录、创建文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性; (5)通过主函数对所实现的功能进行测试。

实验五 文件系统和磁盘管理

为一个有空闲空间的磁盘新建一个分区; 对该分区进行格式化; 把该分区挂载到/mnt/music目录; 要求每次机器启动都自动挂载。

【2021/7/19更新】【梳理】简明操作系统原理 附录四 实时操作系统(docx)

参考教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau 在线阅读: http://pages.cs.wisc.edu/~remzi/OSTEP/ University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。 ———————————————————————————————————————— 这是专业必修

COFACTOR 467

操作系统课程设计 linux文件系统

linux版本和vc++6.0版本 含设计报告,流程图等。 设计一个简单的多用户文件系统。即 ①在系统中用一个文件来模拟一个磁盘; ②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。 ③实现这个文件系统。 ④能实际演示这个文件系统。 基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。

【2021/7/19更新】【梳理】简明操作系统原理 附录五 RAID(docx)

配套教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Reiher 参考书目: 1、计算机操作系统(第4版) 汤小丹 梁红兵 哲凤屏 汤子瀛 编著 西安电子科技大学出版社 在线阅读: http://pages.cs.wisc.edu/~remzi/OSTEP/ University of Wisconsin Madison 教授 Remzi Arpa

COFACTOR 325

SimpleFS:以太坊和RSK区块链的简单文件存储

简单文件系统 以太坊和RSK区块链的简单文件存储 参考 用例 创建文件存储 放置具有名称和字节内容的文件 按名称获取文件字节内容 按名称删除文件 获取文件名 用名称创建目录 用名称删除目录 放置大文件,包含名称和部分字节内容 获取具有名称和零件号的大文件 获取文件长度 获取目录名称 是文件 是目录 执照 麻省理工学院

三大主流交易接口实战指南:XTP、CTP与数字货币API的实盘接入解析

本文深入解析了量化交易系统实现实盘交易的关键环节,聚焦于三大主流交易接口的实战接入。详细介绍了证券领域的XTP、期货领域的CTP以及数字货币交易所API的核心特性、代码封装要点与风控实践,并提供了多市场接口整合的统一架构方案,为开发者打通量化交易的“最后一公里”提供了一份接地气的实战指南。

win55的博客 1373

【2021/7/19 更新】【梳理】简明操作系统原理 附录一 虚拟内存子系统案例选讲(VAX/VMS + Linux)(docx)

参考教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau 在线阅读: http://pages.cs.wisc.edu/~remzi/OSTEP/ University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。 ———————————————————————————————————————— 这是专业必修

COFACTOR 902

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局

本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。

weixin_31967485的博客 386

模板驱动型文档自动化:让PDF/DOCX生成变成填空题

文档自动化是企业提升知识生产力的关键技术路径,其核心在于将重复性、结构化的内容生产过程标准化、可配置化。相比AI自由生成易出事实性错误,或低代码平台维护成本高,模板驱动型文档自动化通过数据层、逻辑层与呈现层的三层解耦设计,实现字段绑定、条件渲染与样式锁定的精准控制。该技术显著降低人工干预风险,保障格式一致性与下游系统兼容性(如OCR识别、PDF嵌入字体),广泛应用于营销简报、法律意见书、结业证书、客户健康报告等B端高频交付场景。Sqribble正是这一范式的典型实践。

anjichan4261的博客 404

大疆精灵3无人机2.4GHz通信系统实测:跳频扩频技术深度解析

跳频扩频(FHSS)是一种经典的扩频通信技术,其核心原理是通过让载波频率在一个宽频带上按伪随机序列快速跳变,将窄带信号的能量扩散开来。这种技术能有效对抗固定频率干扰,提升通信的可靠性和抗截获性,在无线遥控、军事通信等领域具有重要价值。在无人机、物联网等对实时性与可靠性要求高的应用场景中,FHSS技术能显著增强复杂电磁环境下的链路鲁棒性。本文以频谱分析仪实测大疆精灵3无人机为例,深入剖析其2.4GHz频段遥控与图传系统的工作特性,揭示了其采用的成熟FHSS方案,包括约76MHz的总跳频带宽、39个信道及约2M

weixin_33935636的博客 310

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略

本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。

efc1234567的博客 612
上一篇: 【2021/7/19更新】【梳理】简明操作系统原理 第十三章 文件和目录(docx)
下一篇: 【2021/7/19更新】【梳理】简明操作系统原理 第十四章 UNIX文件系统(docx)
山上一缕烟
博客等级 码龄8年 269粉丝 498原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值