文章目录
- 操作系统引导:
- 磁盘初始化
- 文件打开过程角度1
- 文件的打开过程角度2
- 内存映射的文件访问
操作系统引导:
①CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机)
②)将磁盘的第一块–主引导记录读入内存,执行磁盘引导程序,扫描分区表
③从活动分区(又称主分区,即安装了操作系统的分区)读入分区引导记录,执行其中的程序
④从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作
磁盘初始化
磁盘初始化:
step1:进行低级格式化(物理格式化),将盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
Step2:将磁盘分区,每个分区由若干柱面组成(即分为我们熟悉的C盘、D盘、E盘)
Step3:进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)
ROM:
ROM中只存放很小的“自举装入程序”
开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块。并将完整的“自举程序”读入内存,完成初始化。
FCB和inode指针之间的关系
inode->对应的是struct结构体=>inode a[V],连续存储
引导块:引导操作系统初始化的一系列操作
超级块:包含一些重要的文件系统管理信息,如:魔数(是用来告诉操作系统这个文件的类型的,魔数magic number是计算机(或者说是BIOS)用来判断此设备是否包含引导程序的),磁盘转速,磁道数,扇区数。
位示图:
注1:位示图中,每个bit对应一个磁盘块,因此,若磁盘块共有n个则位示图也至少要有 nbit。
注2:这里只用了一个磁盘块存储位示图一个磁盘块大小为4KB,即 32K bit,因此这个位示图能支持的磁盘大小上限为 32K 个块。如果需要支持更多磁盘块,则需要扩充位示图的大小
inode区:
注:“inode结点"就是“索引节点”。在Unix文件系统中,所有的索引结点集中存放。用于表示“文件物理结构"的“混合索引表"被包含在inode结点中,通过“混合索引表”,即可找到一个文件中每个块存储的物理位置
注1:在Unix文件系统中,每个文件必须对应一个inode结点,而inode结点的总数量是有上限的。如:该示意图中,仅用两个磁盘块,即8KB作为inode区,假设每个inode大小为64B,则该文件系统最多只能存储8KB/64B=128个inode结点,相应地,该系统最多只能支持128个文件。
注2:当一个进程通过open系统调用打开某个文件时,操作系统需要将该文件对应的inode结点读入主存。
根目录:存储在磁盘的固定位置
注1: 根目录的信息存储在磁盘的固定位置,这样可以保证开机时,能够找到根目录,再从根目录出发找到其他信息
注2: 开机时,根目录的内容通常会被加载到内存,并一直常驻内存
注3: 由于Unix文件系统采用了“索引节点”,因此每个目录项只需包会“文件名、inode号”、文件的具体属性包含在 inode 中
挂4: 每个目录文件中默认包含两个目录项,分别是“…“和"…“。”.“表示当前目录,”…“表示上一级目录。根目录比较特殊,没有所谓的“上一级目录”,因此它的目录项”."指向自身。
问题1:为什么根目录要存放在磁盘的固定位置?
回答1:因为开机的时候,需要从根目录出发,找到操作系统初始化相关的各种文件。因此,将根目录存放在固定位置,那么开机时候取这个固定位置读入根目录的数据即可
索引表和inode 的关系:索引表是inode的一部分,红色框出来的部分是inode
思考1:如何确定目录文件A需要占多少个块?
回答1:(目录项的数量*每个目录项的大小)/块大小
文件打开过程角度1
思考2:如果从根目录开始查找,要将文件“/A/Dm”读入内存,描述背后发生了什么?
回答2:根目录文件常驻内存,首先查内存中的根目录,找到目录项A–根据目录项A可知,文件A对应 1号inode结点,因此要将1号inode结点从磁盘读入内存–根据刚读入的1号inode结点,可知文件A的索引信息,也就是知道了文件A的每一个块存储在什么位置,接下来可读入目录文件A的第一块(6号物理块)–尝试查找目录项Dm,如果没找到,那么还需要读入目录文件A的第二块(7号物理块)–找到目录项Dm之后,根据目录项记录的inode号,将Dm的inode结点从磁盘读入内存(前面属于open系统调用的内容)|–根据Dm的inode结点,读入Dm的第一块(m号物理块)、第二块(k号物理块)
每个进程一个用户打开文件表(PCB中,通过PCB,操作系统可以访问和管理进程的打开文件表。),用于记录该进程已经打开的文件。表中每一项都对应一个已打开的文件,并通过一个文件描述符(fd)来标识。文件描述符是一个整数,用于在用户进程的打开文件表中唯一标识一个已打开的文件。当进程通过系统调用(如open)打开文件时,系统会为该文件分配一个文件描述符,并返回给进程。
系统打开文件表独一份,用于记录所有已打开的文件。表中每一项都包含了文件的各种信息,如文件的inode节点指针(指向内存中已读入的inode信息)、打开该文件的进程数等。
文件的打开过程角度2
当一个进程通过open系统调用打开文件时,系统会首先查找文件的inode节点(如果尚未在内存中,则先从磁盘读取,以块为单位进行检索),并将其信息存储在系统级的打开文件表中。
然后,在用户进程的打开文件表中创建一个新的表项,指向系统级打开文件表中的相应项,并分配一个文件描述符。
最后,将文件描述符返回给进程,以便后续的文件读写操作。
TIPS:
如果多个进程同时打开同一个文件,每个进程都会在自己的打开文件表中创建一个表象,但这些表象都指向系统级打开文件表中的同一个项。
系统级打开文件表中的“打开该文件的进程数”字段会相应增加,以记录有多少个进程正在使用该文件。
内存映射的文件访问
解决读写文件效率低下的中心思想是:把磁盘访问变成内存访问。实现这种访问转变的手段就是内存映射的文件访问
内存映射的文件访问原理:把需要访问的文件映射到一个进程的虚拟地址内,这样访问该虚拟地址就相当于访问文件。
内存映射的文件访问目的:是为了文件的共享,即可以将同一个文件映射到两个或多个进程的虚拟地址空间。
文件的访问类型:顺序访问和随机访问
- 文件的实现要解决如下问题:
-
给文件分配磁盘空间
-
记录这些磁盘空间的位置
-
将文件内容存放在这些空间
非连续存放方式通过链表方式实现,在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。
把所有指针从单个数据块抽取出来,全部放在一起,形成一张表。称为文件分配表(File Allocation Table)
-
FAT数据结构是静态链表
问题1:FAT表中,每个表项的大小对文件系统有什么影响?
回答1:①对文件系统支持的最大磁盘块数有影响,如:每个FAT表项16bit,则最多只能表示2^16个块号;②)对FAT表的总大小有影响,每个表项的大小*表项的数量=FAT表的大小
问题2:简述操作系统是如何使用FAT表的?
回答2:开机时,就会把整个FAT表读入内存,系统运行过程中,该表会一直常驻内存,也就是说,查FAT表不需要读磁盘,内存里本来就有这个表。系统运行过程中,如果要访问某个文件,则首先要找到这个文件对应的目录项,从目录项中找到文件的起始块号,再根据起始块号查FAT表,从而确认文件的后序那些块存放在哪里。