【操作系统】文件系统

本文为学习李治军老师《操作系统原理、实现与实践》第九章文件系统的总结。

参考资料:

  1. 哈工大李治军老师操作系统mooc视频
  2. 实践项目解析

第九章 文件系统

参考:磁盘管理

  • 用户对操作系统的使用是以文件为基础的;
  • 文件系统是对磁盘的驱动,引入五层抽象机制:
    • 从扇区到磁盘块的抽象;
    • 从单个盘块请求到多个进程的磁盘请求队列;
    • 从磁盘请求到高速缓存;
    • 从盘块集合到文件的抽象;
    • 从多个文件到构建文件系统。

磁盘工作的基本原理

  • 工作原理

    • 从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文件的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值