进程–>处理机

操作系统小TIPS

进程管理

程序的并发执行

程序是描述计算机所要完成的具有特定功能的,并在时间上按严格次序前后相继的计算机操作序列集合(一个静态的概念)

程序顺序执行的特点:

  1. 顺序性
  2. 封闭性
  3. 可再现性

程序在执行时应考虑的环境

  1. 独立性
  2. 随机性
  3. 资源共享性

进程

并发执行的程序在执行过程中分配和管理资源的基本单位

特点:

  1. 动态概念
  2. 并发特征(程序没有)
  3. 竞争计算机系统资源的基本单位
  4. 不同的进程可以包含同一个程序

进程的组成:

进程控制块PCB:
信息 含义
状态 说明进程当前的状态
进程标识符 标明系统中各个进程
位置信息 指明程序及数据在主存或外存的位置
控制信息 参数、信号量、消息等
队列指针 连接统一状态的进程
优先级 进程调度的依据
现场保护区 将处理机的现场保护到该区域
其他
程序
数据

进程的状态

运行态、就绪态、阻塞态/等待态、新建态、退出态

进程切换

切换的时机

  1. 时钟中断
  2. I/O中断
  3. 内存失效
  4. 遇到陷阱
  5. 系统调用

空->创建:新的批处理作业、交互登录、为提供服务而由操作系统创建、由现有进程派生

新建->就绪态:操作系统做好准备再接纳一批新进程时

就绪->运行态:需要选择一个新进程时

运行->就绪:正在运行的进程达到“允许不中断执行”的最大时间段、被优先级更高的进程抢占、进程自愿释放处理器(周期性的进程)

运行->阻塞:对于进程请求的服务,操作系统无法立即予以服务、请求一个无法得到的资源、需要进行初始化的时候、进程通信时,一个进程等待另一个进程的信息。从磁盘读数据时(可能)

阻塞->就绪:等待的时间发生时

一个读磁盘操作完成以后,操作系统会修改进程状态为就绪态

进程的创建

  1. 由系统程序模块统一创建
  2. 有父进程创建

用户登录成功后需要创建新进程
启动程序执行创建新进程


设备分配是通过在系统中设置相应的数据结构实现的,不必创建新进程。

进程的撤销

  1. 该进程已完成所要求的功能而正常终止
  2. 由于某种错误导致非正常终止
  3. 祖先进程要求撤销某个子进程

进程的通信

主从式
  1. 主进程可自由使用从进程的资源或数据
  2. 从进程的动作受主进程的控制
  3. 主进程和从进程的关系是固定的
会话式
  1. 使用进程在服务进程所提供的服务之前,必须得到许可
  2. 服务进程所提供的服务的控制由自身完成
  3. 使用进程和服务进程在通信时有固定的链接关系
消息或邮箱机制
  1. 只要存在空缓冲区或邮箱,发送进程就可以发送消息
  2. 发送进程和接受进程无直接连接关系
  3. 两进程之间存在缓冲区或邮箱
共享存储区方式

不要求数据移动

管道通信

类似于半双工
大小为内存上的一页

临界区

不允许多个并发进程交叉执行的一段程序
禁止两个进程同时进入临界区的准则:

  1. 空闲让进
  2. 忙则等待
  3. 有限等待
  4. 让权等待

实现互斥

软件方法

  1. 单标志法
    违背空闲让进
  2. 双标志法先检查
    违背忙则等待
  3. 双标志法后检查
    导致互相谦让,谁也进不了临界区
    最终饥饿
  4. Peterson算法
    代码语句中设置了turn
    无法实现让权等待

硬件实现方法

  1. 中断屏蔽法
    限制了处理机交替执行程序的能力
  2. 硬件指令法
    TestAndSet指令(原子操作)(不会主动放弃CPU,完成时会唤醒处于就绪态的进程,在开中断下运行)、Swap指令
    硬件方法不能实现让权等待

信号量

条件变量与信号量的比较

  • 相同点
    条件变量的wait/signal操作类似于信号量的p/v操作,可实现进程的阻塞/唤醒
  • 不同点
    条件变量是没有值的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反应了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。

管程

代表共享资源的数据结构,以及由对该共享资源数据结构实施操作的一组过程所组成的资源管理程序。

实现共享资源封装
每次只允许一个进程进入管程

经典同步问题

生产者消费者问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
semaphore mutex=1;	//临界区互斥信号量
semaphore empty=n; //空闲缓冲区
semaphore full=0; //缓冲区初始化为空
producer(){ //生产者进程
while(1){
produce an item in next; //生产数据
P(empty); //获取空缓冲单元
P(mutex); //进入临界区
Add next to buffer; //加入数据
V(mutex); //离开临界区,释放互斥信号量
V(full); //满缓冲区加1
}
}
consumer(){ //消费者进程
while(1){
P(full); //获取满缓冲单元
P(mutex); //进入临界区
Remove an item from buffer;
V(mutex); //离开缓冲区
V(empty); //空缓冲区加1
Consume the item; //消费
}
}
读者-写者问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int count=0;			//用于记录当前的读者数量

semaphore mutex=1; //用于保护更新count变量时的互斥
semaphore rw=1; //用于保证读者和写者互斥地访问文件
semaphore w=1; //用于实现写优先

writer() { //写者进程

while(1) {
P(w);
P(rw) ; //互斥访问共享文件

writing; //写入

V(rW); //释放共享文件
V(w);


reader() { //读者进程
while (1) {
P(w)
P (mutex) ; //互斥访问count变量
if (count==0) //当第一个读进程读共享文件时
P(rw); //阻止写进程写
count++; //读者计数器加1
V (mutex) ; //释放互斥变量count
V(w);
reading; //读取
P (mutex) ; //互斥访问count变量
count--; //读者计数器减1
if (count==0) //当最后一个读进程读完共享文件
V(rw) ; //允许写进程写
V (mutex) ; //释放互斥变量count
}
}
哲学家问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量
semaphore mutex=1; //设置取筷子的信号量
Pi() { //i号哲学家的进程
do{
P (mutex) ; //在取筷子前获得互斥量
P (chopstick[i]) ; //取左边筷子
P (chopstick[(i+1)%5]) ; //取右边筷子
V (mutex) ; //释放取筷子的信号量
eat; //进餐
V(chopstick[i]) ; //放回左边筷子
V (chopstick[(i+1)%5]) ; //放回右边筷子
think; //思考
} while (1) ;
}

死锁

死锁的原因

  1. 系统资源的竞争
  2. 进程推进顺序非法
  3. 死锁产生的必要条件:
  • 互斥条件
  • 不剥夺条件
  • 请求并保持条件
  • 循环等待条件

死锁的预防

  1. 破坏互斥条件
    不可行
  2. 破坏不剥夺条件
    用于状态易于保存和恢复的资源 如CPU的寄存器及内存资源,不适用于打印机
  3. 破坏请求并保持条件
    采用预先静态分配方法
    会导致饥饿
  4. 破坏循环等待条件
    采用顺序资源分配算法
    限制了新设备的增加
    造成资源浪费
    给用户编程带来麻烦

死锁避免

  1. 系统安全状态
  2. 银行家算法

死锁的检测和排除

  1. 资源分配图
  2. 死锁定理
  3. 死锁解除
  • 资源剥夺法
  • 撤销进程法
  • 进程回退法

线程

线程是调度的基本单位
线程控制块TCB
用户级线程只可在用户空间中进行,所以在不支持内核级线程的系统中也可以实现管理。
用户级线程的切换效率更高。

典型应用

  1. 服务器中的文件管理或通信控制
  2. 前后台处理
  3. 异步处理

多线程模型

多对一

多个用户映射到一个内核级线程,用户线程对操作系统不可见
多个线程不能并行运行在多处理机上

一对一

每个用户级线程映射到一个内核级线程
线程开销大

多对多

n个用户级映射到m个内核级线程上,要求m<=n

中断技术

在程序执行过程中遇到急需处理的事件时,暂时中止现行程序在CPU上的执行,转而执行相应的事件处理程序,待处理完成后返回中断点或调用其他程序。

外中断(中断或者异步中断)

来自处理器之外的中断
分为可屏蔽中断和不可屏蔽中断
既发生在用户态又发生在内核态

  1. 时钟中断
  2. 键盘中断
  3. 它机中断
  4. 外部设备中断

内中断(异常或同步中断)

  1. 访管中断->执行系统调用引起
  2. 硬件故障中断->电源失效、奇偶校验错误、总线超时
  3. 程序性异常->非法操作、地址越界、页面故障、调试指令、除数为零、浮点溢出
    大部分异常都发生在用户态,只有“缺页异常“发生在内核态

中断的执行过程

  1. 关中断 此时不能响应更高级的中断请求
  2. 保存断点 即PC
  3. 引出中断服务程序 将地址送入PC
  4. 保存现场和屏蔽字
  5. 开中断 此时允许更高级的的中断
  6. 执行中断服务程序
  7. 关中断
  8. 恢复现场和屏蔽字
  9. 开中断、中断返回
    PC由硬件保存,通用寄存器由操作系统保存
    1~3由硬件(中断隐指令)完成,4~9 软件完成

中断事件处理

硬件故障中断

硬件故障导致

处理过程
  1. 中断处理程序 保护现场
  2. 停止设备工作
  3. 停止处理及运行
  4. 向操作员报告

程序性中断

语法错误、逻辑错误、运行中异常

处理过程
  1. 因人而异
  2. 借助于信号机制
  3. 操作系统将中断事件捕获交给应用程序

I/O中断

处理原则
  1. I/O正常结束 待传输的下一个进程设置为就绪态
  2. I/O发生故障 向设备发命令索取状态字、分析故障的确切原因、复执或转人工
  3. I/O异常 报告操作员
  4. 设备报到或设备结束 操作系统修改系统数据结构中相应设备的状态

访管中断

表示当前运行程序对操作系统功能的调用

处理过程
  1. 程序执行访管指令,并通过适当方式指明系统调用号。
  2. 通过中断机制进入访管中断处理程序,现场信息被保护到核心栈,按功能号实现跳转。
  3. 通过系统调用人口地址表找到相应中断服务例程的入口地址。
  4. 执行中断服务例程,正常情况下在结束后返回系统调用的下一条指令继续
    执行。

时钟中断

处理和时间有关的信息及决定是否程序调度
和时间有关的信息:系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
时钟分绝对时钟和间隔时钟

间隔定时器:
  1. real 永远在计时(包括进程挂起时)
  2. virtual 只在用户态计时
  3. profile 在用户态和内核态都计时

系统调用

分类

  • 设备管理
  • 文件管理
  • 进程管理
  • 进程通信
  • 内存管理

要运行在核心态

由内核程序负责完成
用户通过trap 来发起系统调用请求

用户态转向核心态

  1. 用户程序要求操作系统的服务,如系统调用
  2. 发生一次中断
  3. 用户程序产生了一次错误状态
  4. 用户程序企图执行一条特权指令
    用中断返回指令返回用户态

主要过程

  1. 传递系统调用参数
  2. 执行trap指令
  3. 执行相应的服务程序
  4. 返回用户态

大内核与微内核

大内核的好处

可充分利用模块之间有效特性,无可比拟的性能优势

微内核的特点

  1. 添加系统服务时,不必修改内核
  2. 有效分离接口
  3. 微内核结构没有单一内核稳定

处理机调度

分级调度

  1. 作业调度 又称宏观调度或者高级调度
  2. 交换调度 又称中级调度或者内存调度
  3. 进程调度 又称微观调度或者低级调度
  4. 线程调度
    作业调度次数少,中级次数略多,进程调度频率最高
    进程调度和切换程序是操作系统内核程序

现代操作系统中,不能进行进程的调度与切换的情况有以下几种:1. 在处理中断的过程中,中断处理过程复杂,在实现上很难做到进程程切换,而且中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源。
2. 进程在操作系统内核程序临界区中。进入临界区后,需要独占式地访问共享数据,理论上必须加锁,以防止其他并行程序进入,在解锁前不应切换到其他进程运行,以加快该共享数据的释放。
3. 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断现场保护、恢复等原子操作。在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换。

进程调度方式

  • 非抢占(剥夺)式
  • 抢占(剥夺)式

调度的基本准则

  1. CPU利用率
  2. 系统吞吐量 单位时间内CPU完成作业的数量 作业数量/时间
  3. 周转时间
    周转时间=作业完成时间-作业提交时间
    平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n
    带权周转时间=作业周转时间/作业实际运行时间
    平均带权周转时间=n个带权周转时间/n
  4. 等待时间 进程处于等处理机状态的时间之和
  5. 响应时间 用户提交到系统首次响应的时间

进程调度

功能

  1. 记录系统中所有进程执行的的情况
  2. 选择占有处理机的过程
  3. 进行进程上下文的切换

进程调度的时机

  1. 正在执行的进程执行完毕,或者进程被创建时
  2. 执行中进程自己调用阻塞原语将自己阻塞起来,进入睡眠等待状态
  3. 执行中进程提出IO请求后被阻塞
  4. 在分时系统中时间片已经用完
  5. 在执行完系统调用,系统程序返回用户程序时
  6. 进程处于临界区时也可以调度
    以上是不可剥夺方式下的原因
  7. 就绪队列中的某进程的优先级变得高于当前执行进程的优先级
UNIX中
  1. 进程自己调用sleep和wait进入睡眠
  2. 由于系统调用结束返回用户态,调度标志被置位
  3. 完成中断或trap
  4. 时间片用完
  5. 调用exit自我终止

调度算法

先来先服务算法FIFS

算法简单效率低
对长作业有利对短作业不利
有利于CPU繁忙型作业,不利于IO繁忙型

短作业优先调度算法SJF

对于长作业不利
未考虑作业的紧迫程度
作业的长短根据用户的估计而定(不准)
SJF的平均等待时间、平均周转时间最少

优先级调度算法

  1. 非剥夺式
  2. 剥夺式
  3. 静态优先级 创建进程时决定的
  4. 动态优先级 进程运行过程中调整

优先级的设置参照原则

  1. 系统进程>用户进程

  2. 交互型进程 >非交互型进程

  3. IO型进程 >计算型进程

高响应比优先调度算法

响应比Rp=(等待时间+要求服务时间)/要求服务时间
因此

  1. 作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业
  2. 要求时间相同时,作业的响应比由其等待时间决定,(FCFS)
  3. 对长作业,等待时间足够长时,其响应比便可升的很高

时间片轮转调度算法

适用于分时系统
剥夺式
当一个处于运行态的进程用完一个时间片后它的状态处于就绪

多级反馈队列调度算法

  1. 设置多个就绪队列,每个队列优先级不同
  2. 每个队列中进程执行的时间片的大小各不相同
  3. 队列中FCFS,队列间时间片轮转
  4. 允许抢占
优势
  1. 终端型作业用户:短作业优先
  2. 短批处理作业用户:周转时间较短
  3. 长批处理作业用户:不会长期得不到处理

实时调度

分为软实时调度和硬实时调度
实时操作系统的特点:

  1. 有限等待时间(决定性)
  2. 有限响应时长
  3. 用户控制
  4. 可靠性高
  5. 系统出错处理能力强

要求:

  1. 很快的进程或线程切换速度
  2. 快速的外部中断响应能力
  3. 基于优先级的随时抢占式调度策略:
  • 优先级+时间片轮转调度
  • 基于优先级的非抢占式调度
  • 基于优先级的固定抢占式调度
  • 基于优先级的随时抢占式调度

分类:

  1. 静态表格法
    静态分析——直接产生调度结果
    多用于处理周期性任务
  2. 静态优先级驱动抢占式调度算法
    也进行静态分析——不直接产生调度结果——只用来指定优先级
  3. 动态计划调度算法
    在执行调度任务前排调度计划
  4. 尽力而为调度算法
    不进行可能性分析

实现调度算法

所包涵的内容信息:

  1. 任务就绪时间或事件到达时间
    周期性事件可预知,但非周期性事件大部分时间不可预知
  2. 开始时限
  3. 完成时限
  4. 处理时间
  5. 资源要求
  6. 优先级

算法思想:按用户的时限要求顺序设置处理机
抢占式的
可用于非周期性任务调度

频率单调调度算法

广泛应用于多周期性实时处理
原理:
频率越低优先级越低

内存管理基本原理

功能

1. 虚拟存储器

进程中的目标代码、数据等的虚存地址组成的虚拟空间称为虚拟存储器

2. 地址变换

内存地址(物理单元)的集合成为内存空间或物理地址空间
物理地址空间是地址转换的最终地址

  • 静态地址重定位
    要求执行前完成链接
    必须占用连续的内存空间
  • 动态地址重定位
    依靠硬件地址变换机构
    该机构需要一个或多个基地址寄存器BR和一个或多个程序虚拟地址寄存器VR
    内存地址MA=BR+VR
    优点:
  1. 可以对内存进行非连续分配
  2. 提供了实现虚拟存储器的基础
  3. 有利于程序段的共享

3. 内外存数据传输的控制

用户控制:覆盖
系统控制:交换、请求调入+预调入
一个进程正在IO时,不能交换出内存

4. 内存的分配与回收

连续分配方式
  • 单一连续分配
    无外部碎片、可采用覆盖技术
    只能用于单用户、有内部碎片
  • 固定分区分配
    多道
    分区大小相等。用于一台计算机控制多个相同对象
    分区大小不等。多个较小,适量中分区,少量大分区
    程序太大就放不进任何分区了
    内存利用率低,会产生内部碎片
    无外部碎片
    有关管理通过分区说明表进行
  • 动态分区分配
    旗下的几种算法:
  1. 首次适应算法
    空闲地址递增的顺序链接
    具有最佳性能
  2. 最佳适应算法
    容量递增方式链接
  3. 最坏适应算法
    容量递减方式链接
  4. 邻近适应算法
    首次适应的演变,在上次查找的位置开始查找

5. 内存信息的共享与保护

常用的内存信息保护方法:
  1. 上下界保护法(硬件)
  2. 保护键法
  3. 界限寄存器与CPU的用户态或核心态工作方式相结合

源程序转换为在内存中执行的程序步骤:

  1. 编译
  2. 链接 逻辑地址——>物理地址
  3. 装入
程序链接的三种方式:
  1. 静态链接
  2. 装入时动态链接
  3. 运行时动态链接
装入的的三种方法:
  1. 绝对装入
  2. 可重定位装入
  3. 动态运行时装入

页式管理

为了减少碎片以及为了只在内存存放那些反复利用的或即将执行的程序段与数据部分,而把那些不经常执行的程序段和数据存储在外存。
不会产生外部碎片

名词

每个进程平均产生半个块大小的内部碎片(页内碎片)
进程的虚拟空间被划分为若干个等长的页(Page)
每个页1~4K(旧)
内存空间按页的大小分为片或页面/帧/框(Page framework)
外存也以同样的单位划分,成为块(block)

地址结构

分为两部分
页号P——页内偏移量W

页表

记录页面在内存中对应的物理块号
一般存于内存中
页表由页表项
页表项的结构:页号——物理内存中的块号
页表项的第二部分与地址的第二部分共同组成物理地址
加入中断处理后的页表

页号 页面号 中断位 外存始址

| 页号 | 页面号 | 中断位 | 外存始址 |
加入改变位后的页表
| 页号 | 页面号 | 中断位 | 外存始址 | 改变位 |

计算过程

页号P=逻辑地址A/页面大小L
页内偏移量W=A%L
如果页号P>=页表长度M,产生越界中断
页表项地址=页表始址F+页号P页表项长度
页表长度一般指有多少页
页表项长度一般指页地址占多大的存储空间
物理地址E=块内内容b
页面大小L+页内偏移量W
注:
页表项的确定:
n位逻辑地址空间对应的2^nB除以一页的大小mB
得到的u=2^n/m页,页表项以字节编址,因此页表项大于等于log(u)/8

快表

在地址转换机构中添加一个具有并行查找能力的高速缓冲存储器。

段式管理

分段

按进程中的自然段划分逻辑空间
其逻辑地址由段号s——段内偏移量w组成
段内连续,段间不要求连续

段表

| 段号 | 段长 | 本段在主存中的地址 |
| 段号 | 始址 | 长度 | 存取方式 | 内外 | 访问位 |

地址变换结构

  • 逻辑地址A中前几位为段号S,后几位为段内偏移量W
  • 比较段号S和段表长度M,if(S>=M)越界中断
  • 段号S对应的段表项地址=段表始址F+段号S*段表项长度
  • 取出段表中该段的始址b,计算物理地址E=b+W

段的共享与保护

都指向被共享的段的同一个物理副本。不能修改的代码成为纯代码或可重入代码(不属于临界资源)
保护方法一般有两种:

  1. 存取控制
  2. 地址越界保护

段业式管理

| 段号 | 页号 | 页内相对地址(偏移量) |
在一个进程中,段表只有一个,而页表可能有多个

虚拟内存管理

需要的支持

  1. 页表机制(或段表机制),作为主要的数据结构
  2. 中断机制,当用户程序要访问的部分尚未调入内存时,产生中断
  3. 地址变换机构,逻辑地址到物理地址

请求页表机制

页表项
| 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |

  • 状态位P:用于指示是否调入内存
  • 访问字段A:用于页面置换
  • 修改位M:标识调入内存后是否被修改过
  • 外存地址:支持该页在外存上的地址,通常是物理块号

缺页中断机构

缺页中断后,进程进入阻塞。
属于内部中断

页面置换算法

最佳置换算法(OPT)

淘汰一个最长时间内不再被访问的页
无法实现

先进先出页面置换算法(FIFO)

会产生所分配的物理块数增大而故障数不减反增的异常现象(Belady异常)
基于队列实现

最近最久未使用置换算法

堆栈类算法

时钟(clock)置换算法

每帧关联一个附加位(使用位)

改进的clock算法:

增加一个修改位
每帧有四种情况:

  1. 最近未被访问,也未被修改(u=0,m=0)
  2. 最近被访问,但未被修改(u=1,m=0)
  3. 最近位被访问,但被修改 (u=0,m=1)
  4. 最近被访问,被修改 (u=1,m=1)
    按以上顺序进行淘汰

页面分配策略

驻留集大小

三种策略

  1. 固定分配局部置换
  2. 可变分配全局置换
  3. 可变分配局部置换

调入的时机

  1. 预调页策略
  2. 请求调页策略

从何处调页

请求分页系统的外存分为

  • 存放文件的文件区(连续分配方式)
  • 存放对换页面的对换区 (离散分配方式) IO更快

调入时机

  1. 系统拥有足够的对换区空间:全部从对换区调入
  2. 系统缺少足够的对换区空间:凡不会被修改的文件直接从文件区调入,可能被修改的文件在换出时调入对换区,以后需要的时候直接从对换区调入
  3. UNXI方式:与进程有关的放入文件区。运行过被换出的页面放在对换区。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入

抖动

频繁发生缺页中断(抖动)的原因:某个进程频繁访问的页面数目高于可用的物理页帧数。
虚拟内存技术可以在内存中保留更多的进程以提高系统效率。

工作集

某段时间间隔内,进程要访问的页面集合。
工作集大小一般比工作集窗口小很多
分配给进程的物理块数(驻留集大小)大小要大于工作集大小

文件的一些概念

定义

以计算机硬盘为载体的储存在计算机上的信息的集合。
计算机进行资源的调度和分配:进程
用户进行的输入、输出中的基本单位:文件

文件的属性

  • 名称
  • 标识符
  • 类型
  • 位置
  • 大小
  • 保护
  • 时间

文件的基本操作

  • 创建文件
  • 写文件
  • 读文件
  • 文件重定位(文件寻址)
  • 删除文件
  • 截断文件

文件的分类

按性质和用途

  • 系统文件
  • 库文件
  • 用户文件

按组织形式

  • 普通文件
  • 目录文件
  • 特殊文件

文件的打开与关闭

打开文件相关联的信息:

  • 文件指针 系统跟踪上次读写位置,作为当前文件位置的指针
  • 文件打开计数 计数为零时,系统关闭文件,删除该条目
  • 文件磁盘位置
  • 访问权限

文件的逻辑结构

无文件结构(流式文件)

以字节Byte为单位

访问通过穷举搜索方式

源程序文件、目标代码文件等采用这种方式

有文件结构(记录式文件)

顺序文件

记录定长

顺序存储或链表形式存储

顺序搜索

两种结构:

  • 串结构 记录之间的顺序与关键字无关 按时间先后排序
  • 顺序结构 按关键字排序

索引文件

第i条记录相对于第一条记录的地址 A=i*L

索引表

索引号 长度m 指针ptr
0 m

索引顺序文件

将每组中的第一个文件放在索引表中

直接文件或散列文件

没有顺序的特性

存取方法

线性搜索法

散列法

二分搜索法

文件的物理结构和存储设备

连续文件(连续分配)

一旦知道文件在文件存储设备上的起始地址和文件长度就能很快的进行物理存取。
反复增删后会产生外部碎片

串联文件(链接分配)

搜索效率低。

隐式链接分配

显式链接分配

创建文件分配表(FAT),用于存放链接文件各物理块的指针。

索引文件(索引分配)

把每个文件的所有盘块号都集中放到一起构成索引块(表)

处理索引块的问题

  1. 链接方案 将多个索引块链接
  2. 多层索引
  3. 混合索引

文件存储设备

顺序存储设备

磁带 磁带的两个相邻物理块之间有间隙让他提前加速和不停止

存取速度的的因素
  1. 信息密度(字符数/英寸)
  2. 磁带带速(英寸/秒)
  3. 块间间隙
    信息密度大、块间间隙小、带速高,存取快。

直接存储设备

磁盘

文件存储空间管理

一般一个问价存储在一个文件卷中,文件卷可以是磁盘的一部分,也可以是整个物理盘。

空闲文件目录(空闲表)

空闲盘块表

序号 第一个空闲盘块号 空闲盘块数
1 2 4
2 9 3
适用于连续文件结构的文件存储区的分配与回收

空闲块链

分类

  • 空闲盘块链
  • 空闲盘区链

常用的链接方法

  • 按空闲区大小顺序链接
  • 按释放先后循序链接
  • 成组链法

位示图

盘块的分配

  1. 顺序扫描位示图,找到一个或一组“0”
  2. 若“0”位于第i行,第j列,对应的盘块b=n(i -1)+j
  3. 修改位示图“0”变“1”

盘块回收

i=(b-1)/n +1
j=(b-1)%n +1

目录结构

文件控制块FCB

FCB必须连续存放

FCB的有序集合称为文件目录

FCB包含的信息:

  1. 基本信息
  2. 存取控制信息 文件存取权限等
  3. 使用信息 文件建立时间、修改时间

索引结点

UNXI中的磁盘索引结点包含信息:

  1. 文件主标识符 个人或小组
  2. 文件类型 普通文件、目录文件、特别文件
  3. 文件存取权限
  4. 文件物理地址 13个地址项iaddr(0)~iaddr(12)
  5. 文件长度 以字节为单位
  6. 文件链接计数
  7. 文件存取时间

文件被打开时有增加了以下内容:

  • 索引结点编号 标识内存索引结点
  • 状态 指示是否上锁或被修改
  • 访问计数
  • 逻辑设备号
  • 链接指针

目录结构

所要执行的操作

  • 搜索
  • 创建文件
  • 删除文件
  • 显示目录
  • 修改目录

单级目录结构

一个文件占一个目录

两级目录结构

主文件目录MFD

记录用户文件目录所在位置和用户名

用户文件目录UFD

用户文件的FCB

多级目录结构

树形目录结构

从根目录出发的路径是绝对路径

当前目录 :基于当前工作目录(相对路径)

方便对文件分类

无环图目录结构

树形目录结构的基础上增加了一些指向同一结点的有向边

实现文件共享

目录实现

线性列表

最简单的方法:使用存储文件名和数据指针的线性表

哈希表

根据文件名,得到一个值,并返回一个指向线性列表中元素的指针。

文件共享

从系统管理的角度,三种方法实现文件共享

  1. 绕道法
  2. 链接法
  3. 基本文件目录表

现代常用的两种共享方法

基于索引结点的共享方式(硬链接)

树形结构中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中。

利用符号链实现文件共享(软链接)

创建一个LINK类型的新文件,B用户借助该文件实现对A用户的F文件的共享,新文件也取名F,其中存放F的路径名,视为符号链。

硬链接和软链接都是静态共享方法。

文件保护

文件的保护方式有口令保护、加密保护、访问控制等。

存取控制

存取控制分三个步骤

  1. 审定用户的存取权限
  2. 比较用户权限与用户的本次存取要求是否一致
  3. 将存取要求和被访问文件的保密性比较,看是否有冲突

四种方式来验证用户的存取

1. 存取控制矩阵

二维矩阵,一维是所有的用户,一维是所有的文件。
对应的矩阵元素是用户对文件的存取权限,包括读R,写W,执行E。

2. 存取控制表

(访问控制表)
规定每个用户名和其所允许的访问类型
精简的表分三种用户类型

  • 拥有者
  • 其他
3. 口令

分两种

  • 一种是当用户进入系统时,为建立终端进程时获得操作系统使用权的口令
  • 另一种是每一个用户创建文件夹时,为每一个创建的文件设置一个口令,并将其置于文件说明中。
4. 密码术

比口令方式保密性好

文件系统的结构层次模型

用户接口(系统调用)——符号文件系统SFD(文件名—>文件标识符fd)——基本文件系统BFD(由fd—>获得控制信息)——存取控制验证(合法性检查)——逻辑文件系统(逻辑块号—>相对块号)——物理文件系统(相对块号—>物理块号)——存储设备分配 或 设备策略模块(物理块号—>设备要求的地址格式)——启动IO

磁盘调度算法

一次磁盘读写操作的时间由寻道时间、旋转延迟和传输时间决定。

  • 寻道时间Ts=与磁盘转速有关的常数m*n条磁道+启动磁臂的时间s,其中m约等于0.2ms,s约等于2ms
  • 旋转延迟时间Tr=1/2*磁盘旋转速度r 5400转的磁盘一周11.1ms,Tr为5.55ms
  • 传输时间Tt=每次所读写的字节数b/(磁盘每秒转速r*一个磁道上的字节数N)
  • 总平均存取时间Ta=Ts+Tr+Tt

磁盘调度算法

先来先服务FCFS

寻找先来的

最短寻找时间优先SSTF

寻找离最近的

扫描算法SCAN

(电梯调度)
走到头(磁盘的最远端)再回头

循环扫描C-SCAN

走到头再回头+只沿一个方向走

LOOK C-LOOK

与SCAN和C-SCAN类似
但是走到最远端的请求就回头

设文件索引结点中有7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均为256B,则可表示单个文件的最大长度为()
4个直接地址索引指向的数据块大小为4256B。
每个磁盘索引块有256/4=64个地址项。
2个一级间接索引包含2
64个地址项,所指向的数据块大小为264256B
1个二级索引指向的数据块大小为16464256B
最大长度为(4+2
64+26464)*256B

簇大小相当于磁盘索引块大小
4KB的簇可放4K/4=1024个4B的地址项
可表示的文件的总个数受限于文件索引结点的总个数
所以在计算最多存多少文件的时候除了考虑簇大小,还应考虑文件索引结点的总个数。
如每个文件索引结点占64B,文件系统用1M个簇存放文件索引结点,512M个簇存放文件数据,文件大小为5600B,则索引总个数为1M*4KB/64B=65M,簇占4KB一个文件占2个簇,512M个簇可存放256M个文件。则最后最多存放64M个文件。

IO设备

按使用特性分

  • 人机交互类外部设备
  • 存储设备
  • 网络通信设备

按传输速率分

  • 低速设备 每秒几字节到几百字节
  • 中速设备 每秒数千字节到上万字节
  • 高速设备 每秒数百千字节到千兆字节

按信息交换单位分

  • 块设备
  • 字符设备

IO控制方式

程序直接控制方式

CPU与IO只能串行工作

中断驱动方式

允许IO设备主动打断CPU的运行并请求服务

DMA

在IO设备和内存之间开辟直接的数据交换通路 ,彻底解放CPU。

特点

  • 基本单位是数据块
  • 数据从设备直接送入内存
  • 整块数据的传送都是在DMA控制器下控制的

必须的寄存器

  • 命令/状态寄存器(CR)存放控制信息,或设备状态
  • 内存地址寄存器(MAR)设备到内存的起始目标地址和内存到设备的内存源地址
  • 数据寄存器(DR) 暂存数据
  • 数据寄存器(DC) 存放本次要传送的字节数

通道控制方式

专门负责IO的处理机。
可实现CPU、通道、IO设备的并行工作。

IO子系统的层次结构

用户层IO软件

实现与用户交互的接口 提供与IO有关的库函数。

设备独立性软件

实现用户程序与设备驱动器的统一接口、设备命令、设备保护以及设备分配与释放等。
将逻辑设备名映射为物理设备名(通过LUT)

好处

  • 增加设备分配灵活性
  • 易于实现IO重定向

其主要功能

  • 指向所有设备的公有操作
  • 向用户层提供统一接口

设备驱动程序

具体实现系统对设备发出的操作指令,驱动IO设备工作的驱动程序

中断处理程序

用于保存被中断进程的CPU环境。切换上下文、中断信号源测试、读取设备状态、修改进程状态。

硬件

机械部件

设备本身

电子部件

设备控制器(适配器)

主要功能
  • 接受和识别CPU指令
  • 实现数据交换
  • 发现和记录设备及自身的状态信息
  • 设备地址识别
组成
  • 设备控制器与CPU的接口:数据线、地址线、控制线
  • 设备控制器与设备的接口
  • IO控制逻辑

缓冲

目的

  1. 减少CPU与IO设备间速度不匹配矛盾
  2. 减少CPU中断频率
  3. 解决基本数据单元大小不匹配问题
  4. 提高CPU与IO之间的并行行

实现方法

  • 采用硬件缓冲器
  • 采用缓冲区(位于内存)

缓冲种类

单缓冲

设备和处理机之间设置一个缓冲区。

双缓冲

因为CPU在传送中存在空闲状态,引入双缓冲。

循环缓冲

最后一个缓冲区指针指向第一个缓冲区

缓冲池

多个系统公用的缓冲区组成,形成 空缓冲队列装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)
缓冲首部:设备号——数据块号——缓冲器号——互斥标识符——链接指针

设备的分配与回收

按设备的分配特性分类

独占式使用设备
分时式共享使用设备
以SPOOLing方式使用外部设备

设备分配的数据结构

设备控制表DCT

内容
  • 设备标识符
  • 设备类型
  • 设备地址或设备号
  • 设备状态
  • 等待队列指针
  • IO控制器指针

通道控制表CHCT

内容
  • 通道标识符
  • 通道忙/闲标识
  • 等待队列的首/尾指针

控制器控制表COCT

反映IO控制器的使用状态及与通道的连接情况等

系统设备表SDT

内容
  • DCT指针
  • 正在使用进程标识符
  • 设备类型和设备标识符

设备分配的策略

设备分配原则

又要效率又减少死锁还要独立

分配方式

静态分配
动态分配

设备分配算法

先请求先分配
优先级高者分配

安全性

安全分配方式

每当有IO请求时进入阻塞,直到IO结束被唤醒

不安全分配方式

进程在IO请求后继续运行

逻辑设备名到物理设备名的映射

通过逻辑设备表LUT

SPOOLing

(假脱机技术)

输入输出井

输入缓冲区和输出缓冲区

输入进程和输出进程

特点

提高了IO速度,将独占设备改造成共享设备,实现了虚拟设备功能。