Ch3 进程描述与控制

原目录:操作系统

查看语雀原文

1. 进程

(Process)进程是一组元素的实体:

  • 基本元素:程序代码,相关数据集
  • 其余元素:存放在进程控制块,结构如下

标识符:进程唯一ID

状态:运行/阻塞/挂起

优先级:相对执行优先顺序

程序计数器:程序要执行的下一条指令的地址

内存指针:程序代码和进程相关数据的指针,以及其他进程共享内存的指针

上下文:执行时处理器寄存器中数据

IO状态信息:IO有关信息

记账信息:处理器时间总和,使用时钟数总和,时间限制,记帐号等

总结: 进程=程序代码+相关数据+进程控制块



2. 进程状态

2.1 两状态模型

image.png

2.2 五状态模型

  • 无挂起态

阻塞态必须先变为就绪态(👇就绪队列的限制)才能运行

转换:

  • ->新建
  • 新建->就绪
  • 就绪->运行
  • 运行->退出
  • 运行->就绪
  • 运行->阻塞
  • 阻塞->就绪
  • 就绪->退出

  • 有挂起态: 产生"交换":内存中进程移动到磁盘

转换: 除了内存中的就绪和阻塞,还产生了就绪/挂起和阻塞/挂起



3. 进程描述

3.1 操作系统控制结构

image.png

操作系统维护4种表:

  • 内存表:跟踪实存虚存
  • IO表:管理系统的IO设备和通道
  • 文件表:提供文件相关信息
  • 进程表-->进程映像

3.2 进程映像

进程映像=程序+数据++属性(属性即为控制块)  即slp中的栈帧(活动记录)

用户数据

用户可修改区域

用户程序

待执行程序

每个进程有一个LIFO栈,保存参数,过程调用地址和系统调用地址

进程控制块

进程表示

标识符

处理器状态

用户可见寄存器

控制和状态寄存器:程序计数器、条件码、状态信息

栈指针

进程控制信息

调度和状态信息、数据结构、进程间通信、进程特权、存储、资源所有权和使用情况



4. 进程控制

执行模式

大多处理器至少支持两种执行模式,某些指令只能在特权模式下执行,且某些区域仅能在特权模式下访问

非特权模式

  • 用户模式: 通常用户程序在该模式下运行

特权模式

  • 系统模式
  • 控制模式
  • 内核模式(kernel mode)



5. 操作系统运行

两个事实:

  • 操作系统同软件一样运行,就是一个程序
  • 操作系统也会频繁释放控制权,依赖处理器恢复控制权


操作系统的3种运行模式

无进程内核(a)

传统,古老
在所有进程外执行系统内核,当进程中断或产生系统调用,保存其上下文,把控制权交给OS内核执行系统相关功能后,再恢复进程上下文

用户进程内运行(b)

小型PC,工作站中
在用户进程的上下文中执行操作系统软件

基于进程的OS(c)

把OS当作一组系统进程实现


Ch4 线程

原目录:操作系统

查看语雀原文

1. 线程和进程

1.1 线程定义

image.png

进程(process)具有两大特点:

  • 资源所有权: 进程包含存放进程映像的虚拟地址空间
  • 调度/执行: 进程具有执行状态和优先级,是可被系统调度与分派的实体

通常把调度/执行的基本单位称为线程,拥有资源所有权的基本单位称为进程

1.2 多线程

操作系统在单个进程中支持多个并发执行路径的能力叫做多线程(multithreading)

image.png

区别并发(concurrency)和并行(parallelism)

  • 并发:能够处理多个任务的能力,没有要求同时处理
  • 并行:强调能够同时处理多个任务,并行是并发的子集

1.3 线程&进程

进程

线程

关联属性

  • 存放映像的虚拟地址空间
  • 对处理器,其他进程,文件和IO资源的受保护访问
  • 线程执行状态
  • 未运行线程的上下文
  • 执行栈
  • 存放局部变量的静态存储空间
  • 与其他进程内线程共享的内存和资源访问

进程管理

  • 进程只有一个相关的控制块和地址空间
  • 进程运行时,CPU寄存器被进程控制
  • 未运行时,保存寄存器中内容

  • 每个线程有单独的栈和控制块,其中包含寄存器值,优先级等线程相关属性
  • 进程中所有线程共享进程的状态和资源



2. 线程特点

2.1 线程功能

  • 派生(spawn):派生新进程同时派生一个线程,线程可在进程中继续派生线程,新线程放在就绪队列中
  • 阻塞/解除阻塞:当前线程发送等待,处理器执行另一个就绪进程,当事件发生,线程重新入队
  • 结束:线程完成后,释放其寄存器上下文和栈

2.2 线程优点

  • 线程创建更快速
  • 终止线程更快速
  • 线程切换更快速
  • 同进程中线程的通信效率高于独立进程通信效率

2.3 线程分类

用户级线程(User-Level Thread, ULT)

内核级线程(Kernel-Level Thread, KLT)

管理线程的所有工作都由应用程序完成,内核意识不到线程的存在

管理线程的工作由内核完成,

ULT对比KLT

ULT优点

    • 线程的管理切换无需特权
    • 调度算法可根据程序调整
    • ULT可在任何OS运行,依靠应用层级的线程库,无需底层内核支持

ULT缺点

    • ULT在执行系统调用时,除了阻塞线程,还会阻塞进程中所有线程
    • 纯ULT中,无法使用多处理技术,内核一次只能给一个进程分配一个处理器



Ch5 并发: 互斥与同步

原目录:操作系统

查看语雀原文

1. 并发原理

关于并发(concurrency)和并行(parallelism),参照Ch4 区别并发和并行

image.png

根据上图,并发中最重要的就是控制问题:控制不同进程的共享资源的访问



2. 互斥

(Mutual Exclusion)

假设多进程访问不可共享资源,称其为临界资源(critical resource),使用临界资源的程序段叫做临界区(critical section),为了避免控制问题,一次只能有一个程序处于临界区,互斥实现中会遇到下列问题:

  • 死锁:进程循环等待
  • 饥饿:进程被无限拒绝

image.png



3. 信号量

3.1 基本原理

两个或多个进程合作时使用semaphore强迫一个进程在某个位置停止:

  • 发送信号,执行semSignal(s)
  • 接收信号:执行semWait(s)

把信号量视为int变量,在其上定义了三个操作:

  • initialize: 信号量初始化为非负数(通常为1)
  • semWait: 信号量-1,当s<0,阻塞执行semWait的进程
  • semSignal: 信号量+1,若s>=0,被semWait阻塞的进程解除阻塞

3.2 二元信号量

对信号量规范定义:

  • initialize: 二元信号量只可以初始化为01
  • semWaitB:检查信号量s
  • s=0->进程阻塞
  • s=1,s置为0,继续执行
  • semSignalB: 检查是否有进程受阻
  • 有受阻进程->阻塞恢复
  • 无进程受阻->s置为1

3.3 互斥

image.png

左侧部分给出了信号量解决互斥的基本方法;右侧为ABC三个进程访问受信号量保护数据的场景


4. 生产者/消费者问题

问题描述

生产者/消费者问题是互斥的典型问题:一个或多个producer将数据放入buffer,有一个consumer从中取数据,每次取一项,在任何时候:

  • 只能有一个P或C访问buffer
  • buffer满时P不会再放数据,buffer空时C不会取数据

解决思路

4.1 无限缓冲+二元信号量

  • 算法准备

数据结构:给定缓冲区数组

  • produce()->元素in
  • consume()->元素out

给定以下变量和信号量:

  • n=(in-out),即缓冲区中数据个数
  • s, 互斥信号量
  • delay, 数据信号量,强迫consumer在数据空时等待

  • 实现

原始算法

分析

修正

该算法不能保证任何情况下的正确:

正确前提:

Producer总能在Consumer之前工作,即消费时,n总为1

错误情况:

  • consumer刚出临界区还未执行consume(),n=0
  • producer抢占,n++ ->1delay->1,表示有数据
  • consumer恢复,消费后不满足n==0,delay保持1
  • consumer连续执行,n-- ->0,消费后满足n==0,此时delay==1,semWait(1)表示进程继续,产生矛盾:n==0,缓冲区无数据,却还能继续take()

产生错误的直接原因: n变化-->delay的更新失败-->consumer第二次先于producer执行

consumer本身满足n==0,准备在此处阻塞,delay置为0,但被抢占后,n++,delay保持1,使得consumer恢复后delay未能阻塞连续消费的发生

算法因为"被producer抢占后n++,导致delay更新错误"而产生,因此使用m局部变量保存consumer中的n,使producer的抢占不会影响delay的更新

4.2 无限缓冲+一般信号量

使用一般信号量时:
n
本身替代了delay作为数据信号量,判断当前缓冲区数据


交换producer中两语句--无影响:

  • 图中顺序,producer出临界区后立刻被抢占,consumer的semWait(n)也会阻塞消费
  • 交换,全在临界区进行,更不会抢占


交换consumer中两语句--产生死锁:

  • 系统偶然错误,在n==0,consumer进入临界区执行semWait(n),此时producer无法进入临界区,无法改变n,死锁

4.3 有限缓冲+一般信号量

image.png

有限缓冲下管程,消息的解决方案见5.3和6.3

4.4 信号量的实现

关于信号量的实现,必须满足semWait和semSignal操作作为原子原语

  • 可以使用DekkerPeterson算法(参考PDF P166)
  • compare&swap指令
  • 禁用中断(仅适用于单处理器系统)



5. 管程

(Monitors)

5.1 概述

管程是一种软件模块,由一个或多个过程,一个初始化序列和局部数据组成,有下列特征:

  • 任何时候,只能有一个进程在管程中执行,其他调用管程的进程都堵塞
  • 管程中的数据变量每次只能被一个进程访问

5.2 同步&互斥

管程通过条件变量实现互斥,下列函数操作条件变量

  • cwait(c):进程的执行在条件c上阻塞,管程可被其他进程使用
  • csignal(c):恢复等待条件c的进程执行

image.png

5.3 有限缓冲+管程

image.png



6. 消息传递

6.1 概述

消息传递

进程交互需要满足同步和通信.为了实时互斥,进程需要同步,为了合作,需要通信.消息传递可以提供以上功能,且可在分布式系统,共享内存的多处理器系统和单处理器系统实现

基本实现

两个重要原语:

  • send(destination, message)
  • receive(source, message)
  • 进程以message的形式给目标进程destination发送消息;
  • 进程通过receive接收消息,当中指明了源进程source和消息message

6.2 同步&互斥

send和receive分别可能阻塞/非阻塞

send阻塞/receive阻塞

发送进程和接收进程都阻塞,直到完成投递

send无阻塞/receive阻塞

接收者阻塞,直到接收到消息(最自然的方式)

send无阻塞/receive无阻塞

双方都不等待

同步作为互斥的基础,在无阻塞send/阻塞receive,消息传递可以实现互斥,box中无消息,receive阻塞

image.png

6.3 有限缓冲+消息 

两个进程两个信箱:

  • 初始化:mayproduce填满空消息
  • 生产:mayproduce中始终放空消息,生产前从mayproduce中接收空消息,当没有空消息,说明缓冲区没有空间,阻塞直到消费后产生空间
  • 消费:消费前从maycosume中接收消息,当没有消息,说明缓冲区中无数据,阻塞,直到产生消息



7. 读者/写者问题

读者/写者问题

一个共享的数据区,一些进程(reader)只读取数据,一些进程(writer)只写数据,且满足

  • 读者可多个同时读取
  • 同时只能一个人写
  • 写的时候不能读

读进程不排除其余读进程,写进程排除所有进程

对比P/C问题

主要在于对共享空间的访问

  • R/W问题中,读者不会写数据,写者不会读数据,
  • P/C问题中P可能读取队列指针确定写的位置以及是否已满,c也会调整缓冲区表示其消费了数据

问题分类

读者优先:只要有一个读进程执行,为读进程保留数据区控制权,其余读进程可同时进行,写进程可能饥饿

写者优先:当一个写进程要执行,假设此时一个读进程正执行,暂时阻塞写进程,但其余读进程也被阻塞不能再执行,且优先恢复写进程


Ch6 并发: 死锁和饥饿

原目录:操作系统

查看语雀原文

1. 死锁原理

死锁

一组相互竞争系统资源或通信的进程发生"永久阻塞"

系统资源

可重用 

reusable

一次仅供一个进程安全使用且不会因为使用而耗尽,数量有限

死锁情况:两个进程分别占有一个资源,但都请求对方占有的资源,产生死锁

可消耗

consumable

可被生产/消耗的资源,数量通常无限
死锁情况:参考: Ch5 4.2交换consumer中两语句--产生死锁 ,很多事件组合都会导致死锁



2. 死锁的条件

死锁的必要条件

  • 互斥:一次只有一个进程可以使用一个资源
  • 占有且等待: 一个进程等待其他进程时,继续占有已分配资源
  • 不可抢占: 不能抢占其余进程已占有资源

额外条件,组成充要条件

  • 循环等待:形成闭合链,阻塞的进程间互相等待其他进程释放资源
死锁的处理方法有三种:预防(prevent),避免(avoid),检测(detect),主要针对四种死锁条件处理

3. 死锁预防

死锁预防可从四种死锁条件入手

image.png

①互斥

操作系统普遍实现,不具备禁止条件

②占有且等待

一次性请求所需资源,确保后续无等待
👹问题:低效,可能长时间阻塞以等待资源

③不可抢占

👹问题:第二种额外抢占需要满足优先级不同,且两种实现都需要系统可以容易保存与恢复进程状态

④循环等待

若AB死锁,可能是A占有Ri,请求Rj,B占有Rj请求Ri,因此杜绝B的请求就能防止死锁
👹问题:低效,产生长时间阻塞或者无必要的拒绝



4. 死锁避免

image.png

资源向量化

进程启动拒绝
(死锁避免策略)

资源分配拒绝
(银行家算法)⭐

参考: 银行家算法例题

进程启动拒绝和资源分配拒绝的区别:

进程启动拒绝是基于假设:新旧进程一起以最大请求访问资源,安全但产生不必要的拒绝;
资源分配拒绝是基于动态判断:当前进程中是否有能够运行结束,当其结束后释放资源能否满足其他进程结束,循环,最终保证所有进程都执行结束



5. 死锁检测

死锁检测和死锁预防的区别:
预防策略很保守,属于"未雨绸缪"检测算法属于不限制系统的资源分配,但定期执行算法检测当前是否有死锁,并在有死锁后恢复系统,属于"亡羊补牢"

image.png

算法

参考: 死锁检测算法

银行家算法和死锁检测算法本质相同,只是在系统的使用时间在分配资源前后与否



6. 综合死锁策略

image.png



7. 总结

image.png


银行家算法例题

原目录:操作系统 / Ch6 并发: 死锁和饥饿

查看语雀原文

image.png

安全状态判断--银行家算法(PDF p198)

  1. 仍需要资源

P1

0

0

0

0

P2

0

7

5

0

P3

6

6

2

2

P4

2

0

0

2

P5

0

3

2

0

  1. 安全状态

由银行家算法:

p1执行:(2 1 0 0)+(0 0 1 2)=(2 1 1 2)[加的是当前分配,非仍需要或最大需求]

p4执行:(2 1 1 2)+(2 3 5 4)=(4 4 6 6)

p5执行:(4 4 6 6)+(0 3 3 2)=(4 7 9 8)

p2执行:(4 7 9 8)+(2 0 0 0)=(6 7 9 8)

p3执行:(6 7 9 8)+(0 0 3 4)=(6 7 12 12)

所有进程都能执行结束

  1. 根据死锁检测算法

Allocation矩阵如下

  1. 没有分配资源都为0的进程,不标记
  2. 初始化W=(2 1 0 0)
  3. 进程p1需求可满足,标记P1

W = W+(0 0 1 2)=(2 1 1 2)

  1. 重复,最终所有进程都接受了标记
  2. 则没有死锁

银行家算法和检测算法:

银行家算法和死锁检测是同一种算法,但前者专门指资源分配前通过算法得出的安全状态而决定是否分配资源给某个线程;后者则是判断当前状态下是否有进程无法执行完毕

  1. 3,不存在
  2. 假设同意后,使用银行家算法[对请求进程的"当前分配"增加对"可用资源"中扣除]

image.png

此时可用资源变为(2 0 0 0)

p1执行:(2 0 0 0)+(0 0 1 2)=(2 0 1 2)[加的是当前分配,非仍需要或最大需求]

p4执行:(2 0 1 2)+(2 3 5 4)=(4 3 6 6)

p5执行:(4 3 6 6)+(0 3 3 2)=(4 6 9 8)

p2,p3无法执行,产生死锁


Ch7 内存管理

原目录:操作系统

查看语雀原文

1. 内存管理需求

内存管理需要满足以下五种需求:

  • 重定位(relocation): 程序换出到磁盘中后下次下次换入时要放入换出前区域很困难,需要重定位到内存的不同区域
  • 保护(Protection): 当前进程以外的其他程序不能未经授权地访问(\)该进程地内存单元
  • 共享(sharing): 保护机制也需要灵活性,以允许多个进程访问内存的同一部分,内存管理系统在不损害基本保护的前提下,允许对内存共享区域进行受控访问
  • 逻辑组织(Logical Origanization): 计算机系统中的内存总是被组织成线性(或一维)的地址空间,该地址空间由一系列字节或字组成
  • 物理组织(Physical Origanization): 计算机存储器至少有两级:内存和外存.二两级存储间移动信息由系统负责,即为存储管理的本质

2. 内存分区

image.png

2.1 固定分区

将内存分成若干边界固定的区域

image.png

  • 两类固定分区

image.png

  • 等大分区问题 内部碎片:任何程序,无论大小,都需要单独完整占用一个分区,当装入分区的数据块小于分区大小,限制空间也无法利用造成浪费
  • 不等大分区放置算法

多队列法

将每个进程放到能容纳它的最小分区, 每个队列负责维护该分区换出的进程,单个分区,该方法最优,内部碎片少,整体看,当分区有挂起进程,但此时别的分区本可以容纳,却由于非对应队列而无法执行,增加阻塞

单队列法

当没有可用分区后,进行交换,优先换出可容纳该进程的最小分区

image.png

2.2 动态分区


image.png

定义

分区的长度和数量可变,进程装入内存时,系统分配给它一块与其容量完全相等的内存空间

外部碎片

动态分区时,内存中会出现"空洞",无法满足任何进程的空间需求,只能换出其余进程,

  • 这种碎片是对内存整体来说
  • 压缩: 运用动态重定位的方法,将进程位置移动,整理碎片成一个足够大的空间

2.3 伙伴系统

运用二分法的思想,进程请求空间s,开始给进程分配大小为2u内存:

  • 如果2u-1<s≤2u,分配整个空间
  • 否则分为两部分,如果2u-2<s≤2u-1,分配给两个伙伴中的一个
  • 重复,且当遇到空间不足时还可以合并伙伴

3. 重定位

image.png

  • 重定位的硬件支持

image.png

  • 相对地址的使用

加载模块被加载到内存时,全部使用相对地址,只有真正执行才使用绝对地址

假设某进程占据了内存中一段完整的相邻分区:

程序装入的实际起点(Base)1024,假设x装入后Bounds2688,此时统一相对化地址:开始执行x的语句

jump 400,400+1024=1424 < 2688,读取400处指令

load 1200,1200+1024=2224 < 2688,加载1200处数据



4. 分页

将内存和进程都分割成同样大小的块,进程中为(page),内存中为(frame),没有外部碎片,唯一的内部碎片为每个进程的最后一页

页表: 内存中的帧无法连续保存同一进程的页,为了标注实际的对应关系,每一个进程维护一个页表

例题:使用16位寻址,页大小1k,已知相对地址1502,和部分页表,求逻辑地址与物理地址

:1502化为二进制0000,0101,1101,1110,1K=210,16-10=6,6位用于片选

page:000001,offset:0111011110=478

则相对地址1502的逻辑地址:对于page1(000001)的偏移量为478(0111011110)二者产生的16位数一样,但含义不一样

page:000001->frame:000110

则物理地址:0001100111011110

逻辑地址

物理地址


5. 分段

把程序和数据分为几个段(segment),有最大长度限制,不要求所有段长度一致


image.png

例题:使用16位寻址,段号占4,已知逻辑地址0001,0010,1111,0000和部分段表,求逻辑地址与物理地址

:片选4

segment:0001,offset:0010,1111,0000

段表中Length代表该段分区长度,起始地址Base=0010,0000,0010,0000

offset+Base=0010,0011,0001,0000即物理地址

 本章动画: http://williamstallings.com/OS-Animation/Animations.html


Ch8 虚拟内存

原目录:操作系统

查看语雀原文

硬件和控制结构

1. 分页

image.png

  • 虚拟地址与页表项

image.png

1.1 地址转换

注意点:

  • 虚拟地址逻辑地址
  • 页表指针寄存器位于"进程控制块"
  • 由于页表长度基于进程长度而变化,因此页表不能在寄存器中保存,须在内存中且可访问
  • 一般每个进程都一个页表,页表可能占据巨大的空间:某系统中,一个进程可有虚存2GB=231,页大小29 ,则一个进程就需要222
  • 解决:在虚存中保存页表--页表本身也使用分页机制

1.2 二级页表

对一个32位机器,当虚拟空间大小4GB,页大小4KB时

  • 一般分页

image.png

当页大小4k,4G/4k=220,需要220,220=2MB个页表项,直接放置在内存占据空间

  • 二级分页

image.png

👉

32位机器中,当页大小为4KB,虚拟空间4GB:

232/4k=220,分为220,当每页都使用一个4B的页表项映射,构成一张二级页表,需要内存空间4*220=4MB

页目录表(Directory)/一级页表/根页表

页表地址(Table)/二级页表/用户页表

👈

4GB空间分为1024个可被页目录索引的页组(二级页表),每个页组长4MB.包含1024个项,每项对应大小4KB的页.

此时实存中只保存了210个一级页表项

4B页表项即32b地址,符合32位机

222/4k=210,需要210个页目录,1级是包含1024个项的页目/一级页表

1.3 倒排页表

(Inverted Page Table)


image.png

多级页表不足

页表大小与虚拟空间大小成正比

倒排

使用散列函数将n位页号映射到散列表得到m位帧号,表中有指向倒排表的指针,倒排表中有页表项.这种结构下,散列表和倒排表各有一项对应一个实存页:

  • 散列指针->页表项
  • ->页表项/物理地址

由于多个虚拟地址可能映射到一个散列表项中,需要使用链接技术管理溢出,因此无论有多少进程,支持多少虚拟页,页表只需要实存中的一个固定部分

(类比数据结构散列表有限,但通过散列函数和二次散列等方式保证了散列值的不同)

  • 称为"倒排"的原因:使用帧号而非虚拟页号索引页表

1.4 转换检测缓冲区(TLB)

快表(TLB: Translation Lookaside Buffer)

image.png

虚存访问的普遍问题:会访问两次物理实存:访问页表、访问物理地址

使用TLB旨在解决该问题:

  • 给定虚拟地址,处理器先检查TLB
  • 若命中,则检索帧号形成物理地址(避免了二次访问)
  • 未命中,使用页号检索页表,当存在位
  • 已置位,直接从页表项中取出帧号形成物理地址,更新TLB
  • 未置位,缺页(page fault)发生,操作系统接管,从外存中取出数据装入页,更新页表


image.png

  • TLBcache的关系
    TLB实际上是一块特殊的cache,用于保存最近使用过的页表项,从而避免再次进入内存访问
    TLBRAM中取数据--cache映射三种:直接,全关联,组关联(参考:系统级编程 Ch12 Cache深入)

1.5 页尺寸

image.png

1.6 分页与缺页率

  • 由a,开始页尺寸加大,缺页率升高,然后又成反比,最终,当页和进程大小一样,没有缺页出现(分段)
  • 由b,当分配的页框数越充裕,缺页率越低
     



2. 分段

image.png


基于分段的虚拟内存中,每个进程有唯一的段表


  • 存在位:由于一个进程可能只有一部分段在内存中,因此段表有一位表示段是否存在
  • 修改位:表明上次被装入内存到目前位置其内容是否改变

3. 段页式

段页式结构中,每个进程使用一个段表和一些页表. 段表项:包含段长和Base,无需存在位和修改位,留在页级处理


  • 页表项:类似纯粹的分页,需要P,M
  • 程序员角度:逻辑地址=段号+段偏移
  • 系统角度:段偏移即指定的页号+页偏移

操作系统策略

1. 读取策略

策略意义

决定某页何时取如内存

方式

  • 请求分页式(Demand paging):访问到某页时才取入
  • 问题:开始可能遇到大量缺页中断
  • 预约分页式(Preparing):事先读取多于当前需要的页
  • 问题:当大多数页没有用到时,效率低

2. 放置策略

策略意义

决定进程块驻留在实存的什么位置

方式

  • 对分段系统和NUMA(nonuniform memory access非一致存储器访问)系统
  • 放置策略影响较大
  • 对分页或段页式系统
  • 放置位置无影响,地址转换和内存访问对不同位置页框执行效率一致

3. 置换策略⭐

策略意义

决定读取新页时应该置换出内存中哪一页

方式

  • OPT:最佳策略,选择换出下次访问距当前时间间隔最长的页
  • 问题:不可能实现,需要预测未来的进程
  • LRU:最近最少使用,换出上次访问距今时间最长的页
  • 问题:性能接近OPT,实现开销巨大
  • FIFO:先进先出队列
  • 问题:实现简单,但隐含替换留存时间最久的页,不一定符合局部性原理,中断多
  • Clock Policy:时钟策略
  • 👇时钟置换策略 ,以较小的开销实现LRU性能

3.1 时钟置换策略

时钟策略给每个页框关联一个"使用位",实现了较小开销下接近LRU的性能

具体实现⭐:

  1. 当某页第一次被放入内存中,"使用位"置为1,且有一个指针与内存缓冲区关联.
  2. 外存中数据块要换入时,指针扫描缓冲区,查找使用位=0的页框
  • 当遇到使用位=1的页框,置为0
  • 当所有页框都为0,换出第一块
  • 当所有页框都为1,将每个页框使用位置0,回到起点块换出
  1. 当某页框被置换出后,指针指向该位置的下一个页框

例子: 要换入页727,初始指针在页框2
页框2处使用位为1,置为0,指针后移
页框3处使用位为1,置为0,指针后移
页框4处使用位为0,换出,727置入,指针后移

4. 驻留集管理

策略意义

决定给进程分配多少空间,允许其中多少页驻留在内存中

分配方式

  • 固定分配策略:分配固定的页框
  • 可变分配策略:根据缺页率,可动态调整页框分配

置换范围

  • 局部置换:只换出分配该进程内存页框中的页
  • 全局置换:可换出内存所有可用页框中的页

组合方式

  • 固定+局部:缺页时,从该进程驻留页中选择一页换出
  • 可变+局部:评估后,为进程分配不一定等大的页框,缺页时,从当前进程驻留页中换出,但系统不时重新评估,动态调整
  • 可变+全局:最易于实现,所有进程页框数一样,但系统维护一个空闲页框列表,当缺页发生,空闲页框可加入进程驻留集,从而改变驻留集大小

5. 清除策略

策略意义

确定何时将已经修改的一页写回辅存

方式

  • 请求式(demand cleaning):当一页被置换时才写回
  • 问题:中断解除阻塞前要经过旧页写回和新页读入两次
  • 预约式(precleaning):将修改的多页在置换前成批写回
  • 问题:可能浪费资源,毕竟大部分页在写回后又会修改

6. 加载控制

策略意义

影响系统并发度:驻留在内存中的进程数量

影响

  • 进程太少:进程运行处于阻塞态的概率较大
  • 进程太多:平均到每个进程的驻留集空间不够,频繁缺页中断,发生系统抖动

本章动画: http://williamstallings.com/OS-Animation/Animations.html


内存MindMap

原目录:操作系统 / Ch8 虚拟内存

查看语雀原文


内存.xmind



扩展: 存储器内部组织

原目录:操作系统 / Ch8 虚拟内存

查看语雀原文

1. 芯片

1.1 集成电路

image.png

数字逻辑中的内容:利用输入电平的高低表示10,经过门电路的处理得到输出

1.2 芯片


一块晶片上有大量芯片,每个芯片上有无数的门电路用于处理数据,位元用于存储数据

1.3 位元和DRAM

半导体存储器的基本结构是位元,可被多种技术实现,但都具有以下性质:

  • 可稳定保持两种状态
  • 可读/可写

位元普遍有三个功能端口:

  • Select,用来选择位元
  • Control,用来确定读写
  • Data-In,接收1,0电信号
  • Sense,输出当前状态

图示为一个储存1信息的DRAM结构: 电容具有漏电的自然趋势,因此需要周期性充电保持存储状态--"动态"的来历

  • 写操作:位线输入高低电压代表10,利用晶体管的特性,施加电压到地址线导通,电荷传输到电容器保存
  • 读操作:施加电压到地址线,电容器放电,电荷被位线接收,经过放大器放大,对比参考值,确定位值是1还是0

1.4 芯片逻辑

一块RAM芯片内部位元的组织形式

参考链接: SDRAM基础知识
一般RAM芯片中阵列组织使用W×B表示:有W字长,每个字有B位宽,字的位宽决定半导体存储器一次读/写数据的位数 对于一个16MbDRAM,可以有多种内部阵列组织:

当阵列中位宽16bits(极端)

1M×16b,1M16位字

当阵列中位宽1bit(极端)

16M×1b,16M1位字

当采用4M×4(常见)

4M×4b,4M4位字

4M×4时DRAM内部结构如下:


image.png

放大存储阵列:

逻辑上

DRAM组织成42048×2048的方阵,阵列元素使用行和列控制线连接,行控制线连接行内每个位元的Select端口,列控制线连接Data-In/Sence端口


log2(4M)得到22,需要22根地址线,各取11位控制行与列,最终确定4位位元参与读/写:

  • :每根位线的位驱动器根据对应数据线的值激活为1/0
  • :每根位线的值经过放大器,传递到数据线

1.5 模块组织

多块RAM芯片组成一块存储器
对于更大容量的存储器,需要RAM芯片的阵列,此时需要保证位宽的一致,RAM不满足存储器位宽要求,需要多个RAM组成一个模块达到位宽要求

当使用256K×2组成一个1M×8的存储器时,如图显示了如何使用4个芯片组成一个芯片模块

  • 1M×8=4×(256K×2)×4
  • 共需要16RAM芯片组成存储器,其中4个芯片组成一个bank;


  • log2(256k)=18,行列控制位各9位
  • 还需要2位进行组选择



2. 位宽与性能

总线宽度

  • 数据总线宽度对系统性能影响:数据总线越宽,一次传送的位数越多
  • 地址总线宽度对系统容量影响:地址总线越宽,可访问单元越多

CPU位宽

32位CPU和64位CPU的两大区别体现在此

  • 数据总线:32位下,CPU在处理指令时只能处理最多32,64位下能够翻倍,大幅提升了对指令的执行能力,即前面得到字的位宽决定半导体存储器一次读/写数据的位数,在真实的计算机中,位宽由CPU决定
  • 地址总线:32位下,最大寻址空间最大也只有2^32=4Gb,64位下能有2^64b,更大的物理存储空间也提升了系统性能



3. 位宽与存储系统

虚拟内存中的二级页表如下

  • 32位二级页表结构(字节寻址): 假设页大小4k,虚存空间4G232/4k=220,页表个数为220,需要页表项也为220
  • 当每页都使用一个4bytes的页表项,则需要内存空间4*220=4M
  • 对所有一级页表项占据的空间分页
  • 222/4k=210,则需要210,因为给定每页一个页表项
  • 此时实存中保存了210个页表项,每个页表项4bytes,实际占用内存4k

内存习题

原目录:操作系统 / Ch8 虚拟内存

查看语雀原文

例1:虚拟内存映射

虚拟内存使用2入口TLB,2路组关联cache,一个页表,假设cache块大小8个字,页大小16个字,RAM如如分块,两个块为一个页框


  1. 进程p的虚拟地址位数
  2. 物理地址位数
  3. 求出虚拟地址(18)10的格式,解释转换为物理地址的过程
  4. 已知虚拟地址610转换为物理地址(54)10,给出物理地址形式,确定主存cache块位置,给出过程
  5. 已知虚拟地址(25)10page1,偏移量9,给出物理地址,以及访问数据全过程



解答:

image.png


例2:置换策略

Consider the following page reference string:  7,2,3,7,2,5,1,4,6,5,7,1,0,5,4,0,2,3,0,5 Assuming demand paging with 4 frames, please show the frame contents of the pages after each page reference for the following page-replacement algorithms and count the page interrupt times for every replacement algorithm.

a) LRU replacement  (3分)

b) Optimal replacement (3分)

c) FIFO replacement  (3分)

d) Clock replacement (4分)

LRU

OPT

FIFO

Clock




Ch9 单处理器调度

原目录:操作系统

查看语雀原文

1. 处理器调度类型

1.1 调度的目的

调度是以满足满足系统目标(响应时间,吞吐率,处理器效率)的方式,把进程分配到一个或多个处理器上执行

1.2 调度类型

类型

解释

理解⭐

长程

决定加入待执行进程池

将批作业/程序加载到系统,最少使用

中程

决定加入部分或全部位于内存中的进程集合

一定涉及到交换(swapping),挂起态到其他态的转换,稍频繁

短程/分派器

决定处理器执行哪个可运行进程

决定下次执行哪个进程,最频繁,以下事件都属于短程调度:时钟中断、I/O中断、操作系统调用、信号量

I/O

决定可用I/O设备处理哪个挂起的I/O请求

与I/O请求有关

1.3 调度队列&层次

  • 调度队列

本质上,调度属于队列管理,在排队环境中减少延迟优化性

image.png

  • 调度层次

图示反映了不同进程态转换所属的调度

image.png



2. 调度算法

2.1 短程调度规则

根据面向的对象:系统/用户,是否与性能相关,系统的调度规则也不同,它们互相依赖可以根据需求切换


对象

性能

用户

相关

周转时间

(Turnaround time)

周转时间=等待时间+执行时间

对批处理作业适用

响应时间

进程从提交请求到接收响应时间间隔,

对用户需要接收响应的进程更适用

最后期限

DDL接近时,规则会降低其余目标

其他

可预测性(predictability)

无论负载大小,用户不希望出现大范围波动

系统

相关

吞吐量 (Throughput)

单位时间完成最大进程数

处理器利用率

(Processor efficiency)

处理器忙状态占比

对共享系统重要,但单用户/实时系统不重要

其他

公平性

没有额外限定时,每个进程应该平等对待

强制优先级

优先执行高优先度的

平衡资源

当资源都忙,优先调用较少使用紧缺资源的进程

2.2 选择调度策略⭐

场景模型: 调度队列

  • 对于cpu进程,执行完成->释放,超时->重新入列
  • 对于I/O进程,执行完成->释放,I/O阻塞->进入阻塞队列(阻塞队列中,I/O设备就需要处理,此时为忙碌,一旦完成I/O,相关设备空闲),非阻塞超时->重新入列

image.png


FCFS (先来先服务)

决策模式

非抢占

调度时间

当前进程完毕,执行下一进程

进程选择

设置就绪队列,当前进程结束后,执行队列中存在最久的进程

缺点

  • 一个短进程可能会等待很久
  • 不利于I/O密集型进程:cpu进程执行时,I/O设备可能空闲,当I/O进程通过就绪队列后阻塞,cpu又空闲

优点

  • 适用长进程
  • 利于处理器密集型进程

Round-Robin(RR轮转)

决策模式

抢占

调度时间

按基于时钟中断的时间片(time slicing)执行

进程选择

基于FCFS选择下一时间片执行的进程

缺点

  • 时间片短虽然利于短作业,但耗费资源,最好让时间片长度略大于典型交互时间,当时间片大于最初进程运行时间后,退化为FCFS
  • 在兼具处理器密集进程和I/O密集进程时:I/O进程使用处理器如果阻塞,这段时间占据时间片,实际上处理器没能执行

优点

  • 适用通用的分时系统和事务处理系统

virtual RR(虚拟轮转)

决策模式

抢占

调度时间

同上RR

进程选择

见👇与RR对比

对比

区别:
I/O进程阻塞接触后没有回到就绪队列,而是进入辅助队列,直接面向处理器,辅助队列中进程优先于就绪队列,弥补了I/O阻塞带来的执行缺失

SPN(ext)(最短进程优先)

决策模式

非抢占

调度时间

当前进程完毕,执行下一进程

进程选择

预期处理时间最短的进程下一个执行

缺点

  • 长进程的可预测度降低
  • 长进程可能饥饿

优点

  • 适用短作业

SRT(最短剩余时间)

决策模式

抢占

调度时间

新进程抵达后决定

进程选择

新进程抵达后选取剩余时间最短者

缺点

  • 记录过去的服务时间,增加开销

优点

  • 不像FCFS偏向长进程,也不像SPN偏向短进程

HRRN(Higest Response Ration Next最高响应比优先)

决策模式

非抢占

调度时间

当前进程完毕,执行下一进程

进程选择

计算最大响应比的进程作为下一个

响应比

  • R:响应比
  • w:等待时间
  • s:预计服务时间

R最小值为1.0,只有第一个进入系统的进程才可能达到



例题:调度策略

给出以下进程调度,比较不同策略下的调度情况:

image.png

此处时间表示某一时刻而非时间段

image.png

FCFS:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RR, q=1:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

规律总结:

  • 规律:阶梯状
  • 易错:以5-6-7为例的就绪队列状况,新线程进入先于当前进程重新入队

SPN:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SPN是非抢占式,一定是一个进程完全执行完后再切换

SRT:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SRT=SPN+抢占

HRRN:

 

0

1

2

R

3

4

5

6

7

8

R

9

10

11

12

R

13

14

15

16

17

18

19

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

 

7/6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

 

 

 

 

 

 

 

 

 

9/4

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

 

 

8/5

 

 

 

 

12/5

 

 

 

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

3/2

 

 

 

 

7/2

 

 

 

 

 

 

 

Feedback,q=1:

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

A

1

2

3

结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

 

 

1

2

2

2

3

3

3

3

3

3

4

4

4

5

5

5

6

结束

C

 

 

 

 

1

2

2

2

3

3

3

3

3

4

4

结束

 

 

 

 

D

 

 

 

 

 

 

1

2

2

2

3

3

3

3

4

4

4

5

结束

 

E

 

 

 

 

 

 

 

 

1

2

结束

 

 

 

 

 

 

 

 

 

技巧:阶梯+再个方格中标注当前优先级,纵向比较,选择数字小的,当数字一样,选择先处于此优先级的进程(先入队)

 

本章动画: http://williamstallings.com/OS-Animation/Animations.html


Ch11 I/O管理与磁盘调度

原目录:操作系统

查看语雀原文

1. I/O管理

image.png

1.1 I/O设备

人可读

  • 打印机
  • 终端:显示器,键盘,鼠标等

机器可读

磁盘,usb密钥,传感器

通信

调制解调器

1.2 I/O功能组织

程序控制I/O

处理器代表进程给IO模块发送IO指令,进程进入忙等待直到IO操作完成

中断驱动I/O

处理器代表进程给IO模块发送IO指令:分为两种情况:

  • 进程非阻塞:处理器执行后续指令
  • 阻塞进程:处理器被中断并执行操作系统的指令,将当前的进程设为阻塞态,调度其余进程

DMA

专门的DMA模块控制内存和IO模块间的数据交换.为传输数据,处理器给DMA模块发送请求后执行后续指令,只有整个数据库传输结束后,处理器才被中断

小结

 

无中断

有中断

处理器实现IO和内存间传输

程序控制IO

中断驱动IO

IO和内存直接传输

 

DMA

1.3 I/O发展

总结:

1. 处理器直接控制外设
2. IO模块控制外设,处理器非中断式处理IO
3. 处理器可中断处理IO
4.
DMA模块

5. IO配置专门处理器

6. IO存储器独立
总结: IO去处理器化

1.4 I/O缓冲


IO设备

面向块信息保存在固定大小的块中,每次传输一块0/1

面向流

设备以字节流输入/输出数据,没有快结构

单缓冲

系统为操作分配一个内存中系统部分的缓冲区

优点

  • 用户进程可在下一块读取时处理当前块
  • 缓冲区在系统内存中非用户进程内存中,故系统可换出它

缺点

  • 系统必须记录给用户进程分配缓冲区的情况
  • 交换逻辑有漏洞:IO和换出磁盘是一块时,若执行IO,再换出可能出问题

面向流

  • 一次传送一字节--系统和用户的交互p/c模型进行
  • 一次传送一行--适于哑终端

面向块

无明显提升

双缓冲

面向流

  • 一次传送一字节--用户进程无需再为IO挂起,提高性能
  • 一次传送一行--对比两倍长单循环无明显提升

面向块

提高复杂性,提升性能

循环缓冲

支持大量IO

缓冲作用

当进程需求远大于IO模块处理请求时,即使再多的缓冲也会被填满;

但在多道环境中,当有多种IO和进程,缓冲能够提高系统效率,提升单个进程性能



2. 磁盘调度

2.1 磁盘结构

磁道(track):存储磁头在某一盘片(platter)某个位置上个访问的所有数据

扇区(sector):每个扇区数据量相同,外长内短,故外层数据密度小;sector是一次I/O的最小数据单位

簇(cluster):多个连续的sector组成簇,簇是文件分配的最小单位


image.png

2.2 性能参数


image.png

一个磁盘的正常访问顺序为

  1. 寻道:IO磁头定位到包含数据的磁道==>寻道时间
  2. 旋转:磁头等待含有目标数据的扇区转到下方==>旋转延迟
  3. 实现读写:IO==>存取时间

寻道时间

磁头定位到某磁道

旋转延迟

抵达磁道后,适当扇区旋转到磁头下

传输时间

数据传输时间

存取时间

寻道时间+旋转延迟

总平均存取时间

寻道时间+旋转延迟+传输时间

T:传输时间,b:字节数, N:一个磁道字节数, r:旋转速度(r/s)

2.3 顺序组织&随机组织

  • 顺序读取:读取连续存放在一起的数据,只有在第一次需要寻道
  • 随机读取:读取非连续扇区中的数据,每个扇区都需重新寻道

例题:

一个典型磁盘,平均寻道时间4ms,转速7500rpm,每个磁道500个扇区,每个扇区512字节,假设读取一个包含2500个扇区,大小1.28MB的文件,计算总时间:

顺序组织:文件连续存放在相邻磁道与扇区

顺序组织下,只有第一次需要寻道:
第一个磁道中:

  • 寻道时间:4ms
  • 旋转延迟=1/2*1r/7500rpm=30000ms/7500=4ms
  • 500扇区(全读):1/7500rpm=8ms

合计:16ms

其余每个磁道:

  • 旋转延迟:4ms
  • 读取时间:8ms

合计4*12=48ms


因此读取完5个磁道共需:64ms

随机组织:文件随机分布在不同磁道的扇区

随机组织下,每个扇区都需要重新寻道:

  • 寻道时间:4ms
  • 旋转延迟:4ms
  • 读取一个扇区:8ms/500=0.016ms

因此读取完2500个扇区共需:2500*8.016=20040ms

结论:完全随机的存取时性能非常差

2.4 调度策略

2.2的内容说明IO性能主要被寻道时间拖累,因此需要在访问磁道时采取策略

当一个磁盘200磁道,磁盘请求队列中的随机请求被磁盘调度程序依次接收:55-58-39-18-90-160-150-38-184(起始磁道100)

FIFO

顺序处理IO队列中项目

访问记录

Priority

通常短作业优先级高,长作业优先级低

LIFO

先处理最晚入队的请求

利用局部性原理,先处理最新的请求,可以减少磁臂移动

SSTF(最短服务时间优先)

优先处理移动到指定磁道耗时最少的请求,同样利用局部性原理

SCAN

磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道或没有此方向请求后反向扫描处理请求

  • 不如SSTF和LIFO全面的利用局部性原理,忽视了刚刚扫描的区域

C-SCAN

磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道然后直接返回到起点途中不处理请求,接着重新扫描,即对所有请求的处理只在一个方向

NSCAN,FSCAN

SSTF,SCAN,C-SCAN在进程对某个磁道有较高访问速度时,可能很长时间都不移动(局部性原理),为了避免"黏性",将请求队列分段,每次只完整处理一段

  • N步SCAN把请求队列分为N个子队列,当N较大,性能接近SCAN,当N等于1,退化为FIFO
  • FSCAN使用两队列,一趟扫描中的新请求放入另一个队列,方便下轮优先处理

本章动画: http://williamstallings.com/OS-Animation/Animations.html




Ch12 文件管理

原目录:操作系统

查看语雀原文

1. 文件和文件系统

image.png

1.1 文件系统架构⭐

image.png

  • 设备驱动--Device IO layer(外设指磁盘,磁带等辅存设备)
  • 基本文件系统--Physical layer
  • 基本IO管理程序--Directory management layer
  • 逻辑IO--Logical layer



2. 文件组织和访问

image.png

文件组织

数据结构

堆 Pile

优点

最简单,按照达到顺序被收集,记录的组成域可以不同,没有规范

缺点

堆文件没有结构,访问记录是需要穷举查找

顺序文件


优点

最常见,每条记录长度相同,且组成记录的域也是数量相同,长度固定

缺点

记录有规范,域的位置大小都已知,只需要保存域的值,访问记录还是需要使用顺序查找

索引顺序文件


优点

保持了顺序文件的特点,增加了索引和溢出文件

缺点

基于文件的域进行处理,无法使用其他属性查找记录

索引文件

  • 完全索引类似索引顺序方式
  • 部分索引运行使用定义的属性进行查找

直接/散列文件

允许直接访问磁盘中任何一个地址已知块



3. 记录组块

image.png

 

image.png

记录组块

如上图所示,记录是访问结构化文件的逻辑单元,而内存中的块是与辅存IO交互的基本单位,因此记录必须组织成块

定长

记录定长,且若干完整记录在一块,因此块内会产生内部碎片

变长跨越式

使用变长记录,使得块中无剩余空间,但有些记录会跨块,使用指针连接

变长非跨越式

使用变长记录,但不允许跨块,因此还会有内部碎片



4. 辅存管理

image.png

4.1 文件空间分配:

文件空间分配时有三个问题:

  • 是否一次分配空间
  • 空间分配多少
  • 如何追踪分配给文件的分区

对应解决:

分配策略
  • 预分配:开始就声明文件大小,一次就分配完成
  • 动态分配:有需要时分配
分区大小
  • 动态的大规模分区:性能好又避免浪费
  • 以块为单位:灵活性强,但需要的FAT更大
如何追踪

使用文件分配表FAT来管理

4.2 文件分配方式

连续

文件创建时分配一组连续的块,采用基于长度可变分区的预分配策略

链式

基于单个块的动态分配,适合顺序文件,局部性原理不再适用,可周期性合并

索引

每个文件在FAT中有一级索引,文件每个分区在索引中有一个表项,文件的索引单独保存在一块中
既可以基于分区,也可以基于块,需要定期整理


4.3

(Volumns)

image.png