? 实现多级目录后,添加、删除目录项要根据具体的路径,因此对树的遍历要有
深刻的理解。
3. 为了实现文件长度无限,要采取混合索引分配方式,必须对此概念有所了解。
⑵ 磁盘类Disk模拟了一个异步的磁盘.
a) 什么是同步/异步:
i) 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之
前,该调用就不返回。
ii) 异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用
者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
b) 磁盘异步读写:
i) CPU发出读写请求,不需要等待执行完成. ii) 磁盘接收请求后自行完成读写操作. iii) CPU可自行执行其他事务.
vi) 磁盘读/写操作执行完毕后,通过中断,回调或其他方式通知CPU.
⑶ NachOS如何通过同步的文件读写函数模拟异步磁盘的?
a) Disk类本身是个回调对象,通过中断回调模拟磁盘读写完成后发回CPU的消息. b) 它接受一个回调对象作为读写操作执行后的事件通知.
⑷ 同步磁盘SynchDisk:
a) 通过信号量对异步的磁盘读写进行同步
b) 继承自回调对象,当异步磁盘读写完毕后进行回调 c) 每次磁盘读写完成后,信号量执行V操作. d) 每次发出读写请求后,信号量在P操作上等待.
⑸ 磁盘扇区:
a) 原始的磁盘读写操作是以扇区为单位的. b) NachOS中: i. SectorSize = 128 ii. SectorsPerTrack = 32 iii. NumTracks = 32 iv. NumSectors = (SectorsPerTrack * NumTracks) = 1024
⑹ NachOS文件格式:filehdr.h
a) 类FileHeader定义了文件头的格式. b) FileHeader的尺寸正好为一个扇区大小
c) 成员变量dataSectors中记录了该文件内容所在的扇区.
d) FetchFrom和WriteBack分别是从指定扇区读取文件头和向指定扇区写入文件头. e) 当前文件格式所支持的文件尺寸为:
(SectorSize – 2*sizeof(int))/sizeof(int)* SectorSize = 3840
NachOS的文件格式:
⑺ 类OpenFile描述一个文件:
a) 构造函数:从一个扇区中读出文件头. b) 读写函数ReadAt和WriteAt i. 计算待读写的内容在文件头dataSectors中的位置; ii. 读写取相应扇区的内容;
⑻ 文件系统中的两个特殊文件
a) freeMapFile: i. 此文件是一个位表(bitmap),用于标识磁盘中哪些扇区已被使用. ii. 此文件的文件头始终位于0号扇区. b) directoryFile: i. 此文件用于记录文件系统中各个文件的目录结构. ii. 此文件的文件头始终位于1号扇区.
⑼ 空闲表文件freeMapFile:
a) 类bitmap,按位标记. i. 在文件系统某,一位代表一个扇区. ii. Mark 将某位设置为1(标记某扇区被使用) iii. Clear 将某位设置为0(标记某扇区没有被使用) iv. Test 判断某位是否被置1(判断某扇区是否被使用) v. FindAndSet 寻找下一个为0的位设置为1(寻找空闲扇区) vi. NumClear 返回当前为0的位(查看磁盘剩余空间) vii. 持久位表: PersistentBitmap viii. 在Bitmap的基础上增加了向文件读写功能. ix. FetchFrom和WriteBack:分别用于从一个文件读取位表和将位表写入一个文
件. x. 写入的文件就是freeMapFile.
b) 目录文件directoryFile:
i) 用于记录各个文件信息和目录层次关系. ii) 类Directory用于描述这个这个目录文件.
iii) FetchFrom和WriteBack用于读取和写入此文件
⑽ DirectoryEntry用于表示一个文件
a) inUse 该实体是否被使用 b) Sector 文件头所在的扇区 c) Name 文件名
⑾ 类Directory用于记录文件目录
a) 这个类就是directoryFile.
b) 它对DirectoryEntry的组织是简单的顺序表.
c) 没有树形结构,并且文件个数也有限制(tableSize)
⑿ 文件系统如何整合工作的FileSystem:
a) 格式化: i. 在使用文件系统前,需要进行格式化:./nachos –f ii. 类FileSystem构造函数中,打开format标志进行格式化. b) 创建文件 c) 打开文件
d) 删除文件: i. ./nachos –r filename
⒀ 格式化步骤:
a) 创建PersistentBitmap对象代表磁盘空闲表, Directory对象代表磁盘目录结构. b) 创建freeMapFile和directoryFile文件 i. 创建freeMapFile和directoryFile的文件头. ii. 将freeMapFile和directoryFile所使用的固定文件头所在扇区(0号和1号)
在freemap中标记为1.
iii. 通过文件头中的Allocate函数分配文件尺寸(修改freemap和文件头的
dataSectors).
iv. 向磁盘写入文件头.
c) 将PersistentBitmap 和Directory 的内容写入freeMapFile和directoryFile
中: i. 利用OpenFile对象打开freeMapFile和directoryFile. 将PersistentBitmap 和Directory 写入这两个文件.
⒁ 创建文件的步骤:
a) 打开目录结构
b) 查找是否存在此文件,如果存在返回false
c) 打开空闲表,查找一个空闲的扇区,如果磁盘没有空间则返回false d) 根据名字和文件头扇区向目录结构中添加此文件的记录 e) 创建文件头,并通过Allocate函数和freemap分配文件空间 f) 将文件头写入先前取得的文件头扇区 g) 更新磁盘中的目录文件和空闲表文件
⒂ 打开文件:
a) 打开目录文件(directory->FetchFrom)
b) 查找目录中是否存在此文件(directory->Find)
c) 如果查找到此文件的文件头扇区编号,则通过OpenFile对象打开(new
OpenFile(sector))
⒃ 删除文件
a) 打开目录文件(directory->FetchFrom)
b) 查找目录中是否存在此文件(directory->Find) c) 根据查找到的文件头扇区打开文件头 d) 打开空闲表
e) 通过Deallocate函数修改空闲表中所有保存文件内容的扇区
(fileHdr->Deallocate(freeMap))
f) 将文件头扇区从空闲表中清零(freeMap->Clear(sector)) g) 从目录结构中删除此文件记录(directory->Remove(name)) h) 更新磁盘中的目录文件和空闲表文件
⒄ 文件系统的多线程访问机制: