本文为学习李治军老师《操作系统原理、实现与实践》第九章文件系统的总结。
参考资料:
第九章 文件系统
参考:磁盘管理
- 用户对操作系统的使用是以文件为基础的;
- 文件系统是对磁盘的驱动,引入五层抽象机制:
- 从扇区到磁盘块的抽象;
- 从单个盘块请求到多个进程的磁盘请求队列;
- 从磁盘请求到高速缓存;
- 从盘块集合到文件的抽象;
- 从多个文件到构建文件系统。
磁盘工作的基本原理
-
工作原理
- 从CPU开始:发送命令给磁盘;
- 从磁盘开始:中断;
-
磁盘的工作过程
-
磁盘是由多个盘片组成的立体结构,一个盘片上下两面都是可读写的,磁盘利用了电流的磁效应,对一些电信号进行磁化,保存在磁盘中,用来表示一些信息;
-
磁盘的组成:磁头(Heads),柱面(Cylinder),扇区(Sector)
-
扇区是读写磁盘的基本单位,扇区的容量一般为512字节;
-
-
使用磁盘的直观方法:
- 让CPU给磁盘控制器发出读写命令,即哪个柱面C,哪个磁头H,哪个扇区S以及要读写的内存缓存区的位置和读写长度;
void do_hd_request(void) { hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr); port_write(HD_DATA,CURRENT->buffer,256); } void hd_out(drive, nsect, sect, head, cyl, cmd) { port=HD_DATA; //数据寄存器端口(0x1f0) //cpu中磁盘驱动的核心代码,outb_p接口向外设传送数据 outb_p(hd_info[drive].wpcom>>2,++port); outb_p(nsect,++port); outb_p(sect,++port); outb_p(cyl,++port); outb_p(cyl>>8,++port); outb_p(0xA0|(drive<<4)|head,++port); outb(cmd,++port); }
生磁盘的使用
-
第一层抽象:从扇区到磁盘块请求
-
建立 C、H、S扇区地址到扇区号的映射:
sector = c * (heads * sectors) + h*heads * sectors + s 扇区号 = 柱面号 × (一个柱面有多少扇区)+ 盘面号 ×(一个盘面有多少扇区)+ 扇区号;
-
根据扇区号 sector 来算出 C、H、S:
S = sector%Sectors H = sector/Sectors%Heads C = sector/Sectors/Heads
-
多个连续的扇区构成磁盘块,用户读写磁盘的基本单位变为磁盘块(用空间换时间);
- 用户发出的磁盘读写请求变为盘块号 blocknr;
- 扇区号:sector = blocknr × blocksize;
-
-
第二层抽象:多个进程产生的磁盘请求队列
-
多个磁盘访问请求出现在请求队列,需要对磁盘进行调度;
-
FCFS:先来先服务调度算法
-
SSTF:最短寻道时间有限调度算法
-
SCAN:扫描算法
-
C-SCAN:循环扫描算法(电梯算法)
-
-
-
第三层抽象:从磁盘请求到高速缓存
-
涉及次哦按高速缓存,减少磁盘读写次数,大幅提高磁盘使用效率;
-
基于文件的磁盘使用
-
第四层抽象:引出文件
-
文件是一个连续的字符流,用户可以在字符流上操作,操作系统根据映射表找到和字符流位置对应的磁盘块号,并完成从磁盘块到字符流的映射;
-
文件: 建立字符流到盘块集合的映射关系;
-
FCB(也称索引节点,inode):文件控制块,保存文件名、起始块、索引块、文件长度等信息;
-
顺序存储结构:
适合文件的直接读写,但不适合文件的动态增长;
-
链式存储结构:
文件长度增减容易,但顺序访问慢;
-
索引存储结构:一个文件的信息存放在若干不连续的物理块中,系统为每个文件建立一个专用的数据结构——索引表,并将这些块的块号存放在索引表中;
即能顺序存取,又能随机存取,满足了文件动态增长,插入删除的需求,也能充分利用外存空间,但缺点是索引表本身带来一定的系统开销;
-
多级索引:
-
-
基于文件的磁盘读取:
-
-
第五层抽象:将整个磁盘抽象成一个文件系统
-
将所有文件进行组织和管理,并最终实现文件到盘块的映射;
-
用目录树组织多个文件:
即从文件路径名
/my/data/a
找到文件a的FCB,然后从第四层抽象继续向后; -
目录的实现
-
目录中存放子目录的文件名和子目录FCB地址:
<文件名:索引值>
; -
磁盘块要划分一段连续的区域存放FCB块,并定义一个初始地址作为根目录的索引;
引导块:磁盘启动和初始化 超级块:记录两个位图有多大等信息 inode位图:哪些inode空闲,哪些被占用 盘块位图:哪些盘块是空闲的,硬盘大小不同这个图的大小也不同
-
-
-
用户读写磁盘的全部流程
实践项目8
proc文件的实现