第一章

一、什么是操作系统

Q:HelloWorld 从代码到显示到屏幕,经过了哪些os过程?

编译成可执行文件、用户告诉shell执行该可执行文件、

计算机体系中的接口

  • UI:

  • API:源代码和第三方库的接口

  • ABI(Application Binary Interface)为应用程序二进制接口

    如果链接器可以将 MSVC 编译出来的目标文件和 GCC 编译出来的目标文件链接到一起,那么链接器首先需要支持 MSVC 编译生成的目标文件的格式 PE/COFF 和 GCC 的 ELF 格式。

    此外,不同格式的目标文件需要拥有相同的符号修饰标准、变量内存分布方式、函数调用方式等等。其中目标文件格式、符号修饰标准、变量内存分布方式、函数调用方式等这些跟二进制可执行代码兼容性相关的内容称为 ABI

  • ISA:

二、操作系统的作用

  • 用户与计算机硬件系统之间的接口(API/GUI)
  • 系统资源管理者(处理机、存储器、IO设备等)
    • 处理器管理:
    • 存储器管理:内存的分配和回收
    • IO的管理:
  • 实现对计算机资源的抽象

三、操作系统的发展

1、批处理系统

  • 联机批处理系统:IO由CPU管理、增加输入输出机和磁带
  • 脱机批处理系统:IO脱离主机控制、增加专门处理IO的卫星机

为了进一步提升CPU利用率,又引入了多道程序系统

2、多道程序系统

  • 允许多个程序同时进入内存、交替在CPU中运行
  • 宏观上并行,微观上串行

3、多道批处理系统

  • 批处理系统+多道程序技术 = 多道批处理系统(简称批处理系统)
  • 特点:多道、成批

4、分时系统

  • 把处理机的运行时间分成很短的时间片,轮流分配给各联机作业使用
  • 特点:多路性、交互性、独立性、及时性
  • 提高响应速度方法:
    • 采用可重入代码
    • 引入虚存,减少对换

四、操作系统的基本实现机制

1.异常

  • 中断是异步异常,可能随时发生,与处理器正在执行的内容无关。中断主要由I/O设备、处理器时钟或定时器产生,可以被启用或禁用
  • 同步异常,它是某一特定指令执行的结果。在相同条件下,异常可以重现。例如内存访问错误、调试指令以及被零除。
    • 系统调用也视为同步异常,或陷阱trap
    • 软件和硬件都可以产生中断,软件中断通常称为陷阱trap

![image-20240311084047635](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240311084047635.png)

  • 陷阱处理程序:处理少量事件,多数转交给其他的内核或执行体模块处理

![image-20240311090408330](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240311090408330.png)

2.系统调用

-

![image-20240311090717846](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240311090717846.png)

操作系统的基本类型

操作系统特征

  • 并发 vs 并行
  • 共享
    • 互斥共享(打印机、变量)
    • 同时访问(宏观)
  • 虚拟

  • 异步性

操作系统的功能

  • 处理机管理
    • 进程控制、同步、通信、调度
  • 设别管理
    • 任务
    • 功能
  • 文件系统
    • 存储空间、目录、文件读写、文件保护、提供接口

什么是系统调用

什么是异步、同步异常

微内核架构有什么特点

img

第二章、系统引导

计算机的启动过程

硬件如何知道操作系统内核的位置?

  • bootloader
    • 负责找到内核,将内核加载到主存储器中,并启动内核执行
    • 一般存储在ROM
    • 作用:初始化硬件设备、建立内存空间的映射表,为调用操作系统内核做准备
image-20240318192423126

Bootloader

大部分分为两个阶段

  • Stage 1
    • 汇编语言 实现
    • 需要初始化硬件设备
    • bootloader直接 从ROM上加载,为加载stage2准备RAM空间
  • Stage 2
    • 通常用C语言来实现
    • 初始化这一阶段需要使用的硬件设备和其它功能
    • 内核镜像 从存储器 读到RAM中,并为内核设置启动参数
    • 将CPU指令寄存器的内容设置为内核入口函数的地址,即可将控制权从bootloader转交给操作系统内核 (???)
image-20240318192010363

初始化过程

  • 处理器核初始化:对相关寄存器内容进行初始化
    • 处理器复位
    • 调试接口初始化
    • TLB初始化:将TLB每项逐一清空,避免错误映射
    • Cache初始化:对Tag进行初始化,将Cache块状态设置为无效,避免访问Cache错误命中
  • 总线接口初始化
    • 内存初始化
    • IO总线初始化
  • 设备的探测及驱动加载

MIPS的基本地址空间

image-20240318193231533
  • kuseg
    • 2GB,用户态下唯一可用的地址空间
    • 需要通过MMU中的TLB进行地址变换
    • 存取都会通过cache
  • kseg0
    • 内核态可用地址
    • kseg0的虚拟地址被 连续映射 到物理地址的 低512MB 空间
    • MMU将kseg0的地址最高位清零,就得到物理地址用于访存
    • 存取都会通过cache
    • 内核放置在kseg0
  • kseg1
    • 唯一在系统重启时能正常工作的地址空间
    • 虚拟地址被 连续映射 到物理地址的 低512MB 空间
    • 高三位清零可映射到对应的物理地址
    • 非cache存取
    • 主要用于访问外设
  • kseg2
    • 只能在内核态下使用
    • 需要通过MMU中的TLB进行地址变换
    • 存取都会通过cache

MIPS启动过程

image-20240318210841574 image-20240318210856723 image-20240318210917538

X86 CPU系统的启动

  • 第一步:加载BIOS
    • BIOS设置程序是被固化到电脑主板上地ROM芯片中的一组程序,其主要功能是为电脑提供最底层的、最直接的硬件设置和控制。BIOS通常与硬件系统集成在一起(在计算机主板的ROM或 EEPROM中),所以也被称为固件
  • 第二步:读取MBR
    • MBR即主引导记录,是硬盘上第0磁头第0磁道第一个扇区,大小是512字节,存放了预启动信息、分区表信息
  • 第三步:BootLoader
    • Boot loader 也可以称之为操作系统内核加载器(OS kernel loader), 是操作系统内核运行之 前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图 ,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准 备。通常是严重地依赖于硬件而实现的
    • GRUB 和 LILO 最重要的Linux加载器
  • 第四步:加载内核
  • 第五步……

第三章、内存管理

程序的链接与装载

编译、链接、装载、执行

  • 一个程序本质上都是由 bss段、data段、text段三个组成的

    • bss段:存放未初始化的全局变量。bss是英文Block Started by Symbol的简称。bss段属于静态内存分配
    • data段:存放已初始化的全局变量。数据段属于静态内存分配
    • text段:存放程序执行代码。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
  • 一个装入内存的可执行程序,除了 bss、data和text段外,还需构建一个栈(stack)和一个堆(heap)

    • 栈(stack):存放、交换临时数据的内存区。

      存放程序局部变量(不包括static声明的变量,static声明的变量会存放在data段)

      保存/恢复函数调用现场:在函数被调用时,其参数也会被压入发起调用 的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中

    • 堆(heap):存放进程运行中动态分配的内存段。

      大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用 free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

程序编译

程序从源代码到可执行文件的步骤:预处理、编译、汇编、链接

  • 预处理

    • 删除注释、展开宏定义、处理条件预编译指令、处理“#include”预编译指令(将被包含的文件插入该预编译指令的位置,这一过程是递归进行的)、添加行号和文件名标识
    • gcc -E hello.c -o hello.i
  • 编译

    • 检查代码规范性、把代码翻译成汇编语言
    • gcc -S hello.i -o hello.s
  • 汇编

    • 生成ELF格式目标文件

      程序编译后生成的目标文件至少含有 3 个节区 (Section),分别为.text、.data 和.bss

      ELF 格式中 Section 与 Segment 是不同

    • as hello.s -o hello.o

  • 链接

程序的装载和执行

存储器分配方法

单道程序的内存管理

多道程序的内存管理

  • 固定式(静态)分区

    • 程序适应分区,单队列/多队列分配方式

    • 内部碎片,造成空间浪费

      分配大小大于实际需要时,产生内部碎片

      • 指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片
      • 单一连续区存储管理、固定分区存储管理等都会出现内部碎片
      • 内部碎片无法被整理,但作业完成后会得到释放。它们 其实已经被分配出去了,只是没有被利用。
    • 分区总数固定,限制了并发执行的程序数目

    • 数据结构:分区表记录分区的大小和使用情况

  • 可变式(动态)分区

    • 分区适应程序

    • 没有内碎片,有利于多道程序设计,提高内存利用率

    • 会产生外部碎片

    • 数据结构:位图表示法(分区表)和链表表示法(分区链表)

    • 分配算法:

      顺序分配算法:首次、下次、最佳、最坏适应算法

  • 伙伴系统

  • 紧凑技术

    • 通过移动作业,把多个分散的小分区拼接成一个大分区,的方法称为紧凑
    • 目标:消除外部碎片

解决方法——内存扩充

  • 覆盖与交换技术:在多道程序环境下,用来扩充内存;可以解决 ”在小的内存空间运行大作业“ 的问题

  • 覆盖

    • 主要用于早期OS
    • 把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段) ,共享主存的同一个区域
    • 程序段先保存在磁盘上,当有关程序段的前一部分执行结束,把后续程序段调入内存,覆盖前面的程序段
  • 交换

    • 把暂时不用的部分从主存移到辅存中去

    • 把指定程序或数据从辅存读到相应的主存中,并将控制转给它, 让其在系统上运行

    • 交换技术的几个问题

      选择原则、交换时机(不用就换出,还是内存不够再换出?)

紧凑技术

多重分区分配

分区的存储保护

作业、进程和程序的关系

页式内存管理

页面和页框

页面:进程中的块,虚页

页框:内存中的块,实页

逻辑地址:页面号+offset

物理地址:页框号+offset

页表

记录进程的内存分配情况,实现进程运行时的动态重定位

例如,页面大小4KB,逻辑地址0xa032,那么页号就是10,页内偏移是0x32(二进制除法?数位数)

地址变换机构

页表项

  • 页号(一般不存)
  • 有效位(存在位):该页存在物理存储还是磁盘
  • 保护位:该页是否可以读取、写入或者执行
  • 参考位:追踪页是否被访问
  • 物理地址

多级页表

以二级页表举例,二级页表要设计多大?

一般正好换进一页

例如:页表项1B,页面大小8B,虚拟地址512B,物理地址128B,设计一个多级页表

答:一个页面可以放置8个页表项,也就是管理8个页面,在题目中,虚拟地址有9位,其中低3位是页内偏移量offset,剩余6位可以用于存储页表偏移量(也就是页表大小),则这里可以设计成二级页表,一级和二级页表都包含8个页表项,都是3位偏移量

拓展:如果虚拟地址是1KB,也即是10位地址,那么剩余7位存储多级页表的偏移量(索引),可以设计成两级页表(4+3)或者三级页表(1+3+3)

为什么需要多级页表?

提高内存的利用率,但是访问时间增加了

段式内存管理

页式管理的问题

  1. 难以满足程序运行时对内存的动态需求

    • 编译器:随着编译过程的进行,读取的源程序、解析的符号表、常量表和语法树都在动态增加;子程序调用的栈空间不断变化

    • 动态链接:在程序运行时才把主程序和要用到的目标程序(程序段)链接起来

  2. 不便于数据的共享和保护

    • “数据共享”式程序处理逻辑层面的需求,而页式内存分配层面的基本单位
    • 通过“页共享保护”实现“数据共享”的难度较大

段式管理的主要动机

  • 方便编程

    通常一个作业是由多个程序段和数据段组成的,用户一般按照逻辑关系对作业分段,并能根据名字来访问程序段和数据段

  • 信息共享

    共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段却是信息的逻辑单位

  • 信息保护

  • 动态增长

  • 动态链接

地址结构

段表寄存器:段表起始地址 + 段表长度TL

逻辑地址:段号 + 段内地址

段表项:段号 + 段长+ 物理地址

可重入代码

又称为纯代码,是指在多次并发调用时能安全运行的代码。(类比java工具类?)

要求:不能使用全局变量、代码不能修改代码本身、不能调用其他的不可重入代码

分页与分段的区别

分页 分段
目的 实现非连续分配,解决碎片问题 满足用户需求
作业地址空间 单一线性 二维
信息单位 物理单位(页) 逻辑单位(段)
大小 固定,由系统确定 不定,由用户程序决定
用户 透明 可见
优点 有效解决了碎片问题,提高了内存利用率 更好实现数据共享与保护,段长可以动态增长便于动态链接

虚拟内存

一、虚拟存储器概述

虚拟内存是计算机系统存储管理的一种技术。它为每 个进程提供了一个大的、一致的、连续可用的和私有 的地址空间(一个连续完整的地址空间)。

虚拟存储提供了3个能力:

  • 给所有进程提供一致的地址空间
  • 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问
  • 根据缓存原理,上层存储是下层存储的缓存,虚拟内存叭主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效的使用了主存

优点

  • 可在较小的可用内存中执行较大的用户程序
  • 容纳更多程序并发执行
  • 不必影响编程时的程序结构
  • 空间大于物理内存

代价

虚拟存储量的扩大是以牺牲 CPU 处理时间以及内外存 交换时间为代价

限制

虚拟内存的最大容量主要由计算机的地址结构决定。例 如 32 位机器的虚拟存储器的最大容量就是 4GB

与Cache-主存机制的异同

相同点:原理,出发点

不同点:侧重点,数据通路,透明性,未命中损失

二、请求分布存储管理

预调页

按需调页

缺页错误处理机制

三、页面置换算法

页面替换策略:

最优页面替换算法OPT、先进先出页面替换算法FIFO、最近最少用页面替换算法LRU、第二次机会页面替换算法SCR、时钟页面替换算法Clock

最优置换 OPT

  • 错误率最低,但是无法被实现

  • 必须淘汰一个旧页时,淘汰页应该是以后不再访问的页或距现在最长时间后再访问的页

  • OPT通常用于比较研究,衡量其它页置换算法的效果

先进先出 FIFO

  • 淘汰最先调入内存的页
  • 实现简单,但性能较差。较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出。并且有Belady现象

Belady现象

在使用FIFO算法作为缺页置换算法时,分配的缺页增多,但缺页率反而提高,这样的异常现象称为 belady Anomaly

第二次机会 SCR

  • 解决FIFO会将常用页面淘汰的问题、减少I/O操作开销
  • 最先进入内存的页面,如果最近还在被使用,仍然有机会作为像一个新调入页面一样留在内存中

时钟页面替换算法

  • 改进SCR频繁出队和入队的实现代价
  • 思路:采用循环队列机制构造页面队列,形成类似于钟表面的环 形表

![image-20240327105446893](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240327105446893.png)

最近最少使用 LRU

  • LRU算法根据数据的历史访问记录来进行淘汰数 据,其核心思想是“如果数据最近被访问过, 那么将来被访问的几率也更高”

  • 硬件开销太大

老化算法 AGING

  • 对LRU的简化,但性能接近LRU

四、工作集模型

页目录自映射

PTbase是所有二级页表存储区域的起始地址 蓝色部分都是二级页表

有很多二级页

他二级页表可以是不连续的 吗

这个是虚拟存储空间 物理存储空间里面肯定是不连续的

PDbase是一级页表(页目录)的起始地址

第四章、进程管理

  • 内容回顾

Q:什么时候不适合使用多线程?

涉及到大量计算(计算密集型任务) + 计算不可拆分

4.2. 进程管理 - 同步和互斥

进程的三个特征:并发、共享、不确定性

竞争条件:多个进程并发访问和操作统一数据且执行结果与访问的特定顺序有关……(B条件

临界资源:一次仅允许一个进程进行访问

临界区:每个进程中访问临界资源的那段代码成为临界区

进程互斥(间接制约关系)

  • 无序访问:无法限制访问者对资源的访问顺序

进程同步(直接制约关系)

  • 有序访问

  • 刻意安排的直接制约关系

机制设计上应遵循的准则

空闲让进、忙则等待、有限等待、让权等待

基于忙等待的互斥方法

软件方法

Dekker算法

![image-20240410110620476](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240410110620476.png)

为什么在myturn要反复确定另一个进程是否想要enter?

总是让另一个进程先执行?

Peterson算法

Lamport Bakery

硬件方法

方案1:中断屏蔽

  • 执行关中断指令,进入临界区操作;退出临界区之前,执行开中断指令
  • 不适用于多处理器,代价高,限制CPU并发能力

方案2:使用test and set 指令

几个算法的共性问题

  1. 忙等待:浪费CPU时间
  2. ==优先级反转==:低优先级进程先进入临界区,高优先级进程一直忙等

基于信号量的同步方法

同步实现的基本思路

将==忙等变为阻塞==,可使用进程间通信原语:Sleep和Wakeup

Sleep原语将引起调用进程的阻塞,直到另外一个进程用 Wakeup原语将其唤醒。很明显,wakeup原语的调用需要 一个参数——被唤醒的进程ID。

问题:Wakeup信号可能丢失(参见《现代操作系统》第4版,P73)

信号量

  • 使用一个int变量来==累计唤醒次数==,称为信号量(semaphore)
  • 建议设置两种操作,$P(S)$和$V(S)$,P操作也称为semWait,V操作也称为semSignal
  • 信号量是一类特殊的变量,程序对其访问都是原子操作,且只允许对它进行P、V操作

==信号量:== 一个确定的二元组(s, q),其中s是一 个具有非负初值的整型变量,q是一个初始 状态为空的队列. 当发出P操作时:

  • s为正,则该值等于可立即执行的进程的数量 ;s <= 0,那么发出P操作后的进程被阻塞, │s │是被阻塞的进程数。
  • q是一个初始状态为空的队列,当有进程被阻 塞时就会进入此队列。

信号量的分类

  1. 二元信号量和一般信号量

    • 二元信号量取值为0、1,主要用作实现互斥
    • 一般信号量初值为可用物理资源的总数,用于进程间的协作同步问题
  2. 强信号量和弱信号量

    • 强信号量:进程从被阻塞队列释放时采取FIFO

      不会出现“饥饿”(某个进程长时间被阻塞)

    • 弱信号量:没有规定进程从阻塞队列中移除顺序

      可能出现“饥饿”

![image-20240412083024446](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240412083024446.png)

image-20240412083038247

屏障Barriers

用于进程组的同步

![image-20240412085844350](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240412085844350.png)

两个进程之间的同步实现

![image-20240412090652472](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240412090652472.png)

经典的进程同步与互斥问题

生产者消费者问题

如果缓冲区无限大,

4.3 进程管理 - 调度

基本概念

调度的性能指标

响应时间、截止时间、优先级、公平性、各种资源的均衡利用

  • 周转时间

    作业从提交到完成(得到结果)所 经历的时间

  • 吞吐量

    单位时间内所完成的作业数

  • 处理机利用率

![image-20240508101622654](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240508101622654.png)

调度算法本身的性能准则

  • 易于实现
  • 执行/开销比小

吞吐量 5 / 18 =

4 3 5 2 4 = 18

设计调度算法要点

进程优先级

  • 静态优先级

    进程创建时指定,运行过程中不再改变

  • 动态优先级

    进程创建时指定了一个优先级,运行过程中可以动 态变化

就绪队列的组织

  • 按优先级

抢占式调度与非抢占式调度

进程的分类

第一种分类:

  • I/O密集型
  • CPU密集型

第二种分类:

  • 批处理进程
  • 交互式进程
  • 实时进程

时间片

批处理系统调度算法

先来先服务FCFS

  • 顺序服务

    按照作业提交或进程变为就绪状态的先后次序, 分派CPU

  • 非抢占执行

    当前作业或进程占用CPU,直到执行完或阻塞, 才让出CPU

  • 等待让出

    在作业或进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程让出CPU

  • 特点:

    • 比较有利于长作业,而不利于短作业

    • 有利于CPU繁忙的作业,不利于I/O繁忙的作业

短作业有限SJF

对FCFS的改进,目标是减少平均周转时间

对预计执行时间短的作业(进程)优先分派处理机,但通常后来的短作业==不抢占==正在执行的作业

  • 缺点:对长作业不利、没有根据紧迫程度划分优先级

最短剩余时间有限SRTN

对SJF的改进,==改进为抢占式==执行

  • 若一个新就绪的进程比当前运行进程具有更短的完成时间,系统抢占当前进程,选择新就绪的进程执行

  • 缺点:可能导致长任务“饥饿”

最高响应比优先HRRN

交互式系统调度算法

时间片轮转RR

主要用于微观调度,设计目标是提高资源利用率

多级队列

多级反馈队列

实时系统调度算法

静态表调度

单调速率调度RMS

最早截止期优先EDF

  • 任务的绝对截止时间越早,其优先级越高,优先 级最高的任务最先被调度

  • 如果两个任务的优先级一样,当调度它们时, EDF算法将随机选择一个调度

最低松弛度优先算法LLF

  • 松弛度

    任务截止时间 - 本身剩余运行时间 - 当前时间

  • 调度时机

    有进程执行完,或有进程的Laxity为0时 (抢占)

多处理机调度

  • 非对称式多处理系统AMP

  • 对称式多处理系统SMP

4.4 进程管理 - 死锁

死锁发生的四个必要条件

  • 互斥条件
  • 请求和保持条件
  • 不可剥夺条件
  • 环路等待条件

处理死锁的方法

  • 不允许死锁发生
    • 预防死锁
    • 避免死锁
  • 允许死锁发生
    • 检测与接触死锁
    • 无所作为:鸵鸟算法

死锁预防

  • 打破互斥条件

    允许进程同时访问某些资源

  • 打破请求和保持条件

    只有当系统能够满足当前进程的全部 资源需求时,才一次性地将所申请的资源全部 分配给该进程,否则不分配任何资源

    但是这种策略会有不可预测、资源利用率低、降低进程并发性的问题

  • 打破不可剥夺条件

    允许进程强行从占有者 那里夺取某些资源

  • 打破循环等待条件

    实行资源有序分配策略

死锁避免

分配资源时判断是否会出现死锁,有则加以避免

银行家算法

  • 最大需求量不超过资金可响应

  • 分期贷款总数不超过最大需求量

  • 可推迟支付贷款

5 设备管理

逻辑I/O

设备驱动程序

中断服务程序

IO管理的特点

速度差异大、接口复杂等

IO设备的分类

按设备组织分类:

  • 块设备
  • 字符设备

按用途分类:

  • 存储设备
  • 传输设备
  • 人机交互设备

程序控制IO(轮询方式)

从设备上读数据

系统接口

设备驱动程序

硬件接口

设备控制器

中断驱动方式

直接存储访问方式 DMA

6 磁盘管理

硬盘的结构

![image-20240527142746772](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240527142746772.png)

![image-20240527142806132](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240527142806132.png)

磁盘的组织与调度

提高磁盘IO性能

廉价冗余磁盘阵列

磁盘管理的实例

7 文件系统

基本概念

文件的概念

  • 一组带标识(标识即为文件名) 的、在逻辑上有完整意义的信息项的序列。

  • 文件包括两部分:

    – 文件体:文件本身的内容;(data)

    – 文件说明:文件存储和管理的相关信息,如:文件 名、文件内部标识、文件存储地址、访问权限、访 问时间等;(meta-data)

  • 可以视为一个单独的连续的逻辑地址空间,其大小即为文件的大小,与进程的地址空间无关

文件系统

  • 操作系统中统一管理信息资源的一种软 件,管理文件的存储、检索、更新,提供安全可靠 的共享和保护手段,并且方便用户使用。

  • 层次结构:

    ![image-20240522101206594](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240522101206594.png)

文件的逻辑结构

  • 从用户的角度看文件,由用户访问方式确定
  • 字节序列、记录序列和树是三种较为常用的逻辑结构,还可以组织成堆、顺序、索引、散列

文件存取方式

  • 顺序存取
  • 随机存取(直接存取):提供读写位置

文件控制块 FCB

  • 为管理文件而设置的数据结构,保存管理文件所需 的所有有关信息(文件属性或元数据)
  • 常用属性:文件名,文件号,文件大小,文件地址,创建时间, 最后修改时间,最后访问时间,保护,口令,创建 者,当前拥有者,文件类型,共享计数,各种标志 (只读、隐藏、系统、归档、ASCII/二进制、顺序 /随机访问、临时文件、锁)

文件目录

  • 目录概念

    • 文件说明索引组成的,用于文件检索的特殊文件

    • 内容主要是文件访问和控制的信息

  • 目录内容

    • 基本信息:文件名等
    • 文件类型:结构、内容、用途、属性、文件组织
    • 地址信息:位置、长度
    • 访问控制信息:所有者、访问权限
    • 使用信息:创建时间、最后一次访问时间和用户

例:UNIX的文件类型

UNIX按性质和用途将文件分为:普通文件、目录文件、特殊文件(设备文件)、管道文件、套接字

  • 特殊文件(设备文件)

    字符设备文件、块设备文件

文件系统实现方法

  • 磁盘上文件系统的布局

    ![image-20240522102456944](C:\Users\86199\Documents\A blog\myblog\source_posts\image-20240522102456944.png)

文件控制块 FCB

  • 基本信息
    • 文件名、物理位置、文件逻辑结构、文件物理结构
  • 访问控制信息
    • 文件所有者、访问权限
  • 使用信息
    • 创建时间、上一次修改时间、当前使用信息等

文件逻辑结构

文件物理结构

  • 主要结构:连续结构、索引结构、串联(链接)结构

目录的实现

  • 直接法:目录项 = 文件名 + 文件控制块
  • 间接法:目录项 = 文件名 + 文件控制块地址(索引号)

保护文件的方法

  • 建立副本
  • 定时转储
  • 规定文件的权限

文件的一致性检查

  • 磁盘块的一致性

    每个磁盘块设置两个计数器,一个记 录在文件中出现的次数,另一个记录在空闲块中出现的 次数,最终检查两个计数器是否存在不一致问题。

  • 文件的一致性

    每个文件设置两个计数器,一个记录其 i节点被引用的次数,另一个记录文件目录中引用它的 次数,最终检查两个计数器是否存在不一致问题。

文件的存取控制

  • 存取控制矩阵
  • 存取控制表
  • 用户权限表
  • 口令

文件系统的性能问题

  • 磁盘服务

    速度成为系统性能的主要瓶颈之一,在设计文件系统时应尽可能减少磁盘访问次数

  • 提高文件系统性能的方法

    目录项分解、当前目录、磁盘碎片整理、块高速缓存、 磁盘调度、提前读取、合理分配磁盘空间、数据的优化分布、RAID技术等

    1. 块高速缓存

    在内存中为磁盘块设置的一个缓冲区,保存磁盘中某些块的 副本

实例分析