操作系统
Ctrl+F搜索关键字
1.计算机系统概述
1.1计算机基本构成
Processor (处理器):只有一个时指cpu
Main memory (内存):有易失性,计算机关机,内容丢失
I/O modules (输入/输出模块):包括硬盘等
System bus (系统总线):在处理器,内存,输入/输出模块间提供通信
1.2寄存器
Registers:Memory inside CPU(处理内部的存储单元)
Registers function:Enable CPU to minimize main-memory references(减少 CPU 读取内存的次数)
分类为:
1.User-Visible Register(用户程序可见寄存器)
2.Control and Status Register(控制和状态寄存器)
寄存器相关考点:(参考的原文链接)
User-Visible Register
How to use: May be referenced (访问/存取) by machine/assemble language (机器或汇编指令).
User-visible registers are typically accessible to system programs but are not typically available to all programs.
Registers that are used by system programs to minimize main memory references by optimizing register use are called user-visible registers.
Control and Status Register
Function: are used to control the operation of the processor.
Some may be accessibly by machine instruction in control or system mode.
A Control/Status register that contains the address of the next instruction to be fetched is called the Program Counter (PC).
Instruction Register(IR,指令寄存器)
Contains the instruction most recently fetched. (包含最近获取的指令)
A fetched instruction is normally loaded into the Instruction Register (IR).
The Instruction Register (IR) contains the most recently fetched instruction.
A fetched instruction is normally loaded into the instruction register (IR).
Program Status Word(PSW,程序状态字)
Condition codes
The Program Status Word contains status information in the form of condition codes, which are bits typically set by the processor hardware as a result of program operation.
Data Register
Data registers are general purpose (通用) in nature, but may be restricted to specific tasks such as performing floating-point operations.
Address Register
Address registers may contain Memory addresses of data, Memory addresses of instructions, Partial memory addresses.
A special type of address register, required by a system that implements user-visible stack addressing, is called a stack pointer.
1.3指令的执行
指令格式及整数格式
取指阶段及执行阶段为一个指令周期(理想机器)
执行阶段PC会自动加一,最后AC的内容储存到地址为941的储存单元中。
1.4中断处理
计算机使用中断来提供处理器效率。
处理器中断程序前,需要保存从中断点恢复当前程序所需的信息,包括PSW(程序状态字)和PC(程序计数器)中的指令地址等。
处理多个中断时,需要判断它们的优先级来决定用顺序中断或嵌套中断。
1.5高速缓存
Cache Memory原理:当处理器试图读取存储器的一个字节时,先检查该字是否在高速缓存中,若在,则传递给处理器;若不在,则将包含该字的固定数量的字节组成的内存数据读入高速缓存,再从高速缓存传给处理器。
1.可编程 I/O:I/O设备直接更改寄存器的状态
2.中断驱动 I/O:发出中断信号给予CPU
3.DMA直接内存访问:在CPU之外多出了DMA控制器,CPU将拷贝数据的工作交给DMA,让DMA直接从内存读取
1.6重要术语
PC:program counter程序计数器(保存下一次取的指令地址)
IR:instruction register指令寄存器(储存cpu里的指令)
MAR:内存地址寄存器
MBR:内存缓存寄存器
I/O AR:输入/输出地址寄存器
I/O BR:输入/输出缓存寄存器
AC:累加器(cpu临时存储地址)
PSW:程序状态字(反应处理器状态)
ISR:中断服务例程(符合中断要求的程序)
DMA:直接内存存取(需要移动大量数据时使用)
单词:instruction指令 execution执行 buffer缓存 stage阶段 cache memory高速缓存 module模块
2.操作系统概述
2.1操作系统目标
Convenience 方便
Efficiency 有效
Ability to evolve 易扩展
2.2操作系统的发展
操作系统不断发展因为:
硬件升级:Hardware upgrades plus new types of hardware
新的服务:New services
纠正错误:Fixes
操作系统提供的服务:
<程序开发 Program development <程序运行 Program excutions
<I/O设备访问 Access to I/O <文件访问 Access to files <系统访问
<错误检测和响应 Error detection and response <记账 Accounting
<指令系统体系结构ISA
<应用程序二进制接口ABI
<应用程序编程接口API
2.2.1串行处理
serial processing
用户顺序访问计算器,且需要大量前期准备时间。
早期问题:
调度 Scheduling:完成分配的工作后计算机闲置,或没完成的工作被强制停止
准备时间 Setup time:程序运行前需要大量准备时间
2.2.2简单批处理
simple batch systems
将作业按顺序组织成批,每个程序处理完后监控程序自动加载下一个程序。
硬件功能包括:
内存保护Memory protecetions,定时器Timer,
特权指令Privileged instructions,中断Interrupts
2.2.3多道批处理
multiprogramming batch systems
当一个作业需要等待I/O时,处理器可以切换到另一个不在等待I/O的作业。
对多道批处理有用的硬件:
I/O中断和直接内存访问DMA
2.2.4分时系统
time sharing systems
多个用户可以同时访问系统,操作系统控制每个用户程序在很短的时间内交替执行。
2.3主要成就
The Processes 进程
Memory Management 内存管理
Information Protection and Security 信息保护和安全
Scheduling and Resource Management 调度和资源管理
System Structure 系统结构
2.4概念区分:线程,进程,多线程,并发,并行
Thread 线程:可分派的工作单元,包括处理器环境,自身数据,顺序执行且可以中断。
Process 进程:一个或多个线程和相关资源的集合,是一个可执行的程序。
multithreading 多线程:把一个应用程序的进程划分为可以同时运行(并发)的线程。(逻辑上的同时发生)
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位,可以将进程看作程序,线程是其中的函数。
concurrency 并发:一个处理器同时处理多个任务。
parallel 并行:多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
3.进程
3.1进程的表征
Identifier 标识符
State 状态
Priority 优先级
PC 程序计数器
Memory pointers 内存指针
Context data 上下文数据
I/O status information 输入/输出状态信息
Accounting information 记账信息
上述内容存放在PCB: process control block 进程控制块中,由操作系统创建和管理。
3.2进程的状态
进程轨迹 trace可描述单个进程的行为
各个进程轨迹交替方式可描述处理器行为
3.2.1两状态进程模型
运行态和非运行态
3.2.2进程的创建和终止
Process Creation进程创建
原因:(1)新的批处理作业 (2)交互登录 (3)提供服务 (4)现有进程派生spawn
操作系统创建步骤:
(1)为新进程分配唯一的进程标识符
(2)为进程分配空间
(3)初始化进程控制块
(4)设置正确的链接
(5)创建或扩充其他数据结构(如记账文件)
Process Termination进程终止
原因:(1)正常完成 (2)超过时限 (3)无可用内存 (4)进程进行错误行动 (5)父进程终止或请求
3.2.3五状态进程模型
Running 运行态
Ready 就绪态
Blocked 阻塞/等待态
New 新建态
Exit 退出态
在大型操作系统中,可以一个事件对应一个队列,或是每个优先级一个队列以提高效率。
3.2.4添加挂起状态的模型
当内存中所有进程都处于阻塞态时,操作系统可把其中的进程置为Suspended Processes挂起态,并且将它转移到磁盘,释放内存空间。
挂起态包括:Blocked/Suspend Ready/Suspend(都在外存中)
挂起进程的特点:
(1)进程不能立即执行
(2)为阻止进程发生,可通过代理使其挂起,代理包括进程本身,父进程或操作系统
(3)需要代理显式地命令系统进行状态转换才能取消挂起
3.3进程描述
操作系统构造并维护4种表:
(1)Memory Tables 内存表
包含分配给进程的内存,外存,进程访问权限,管理虚存的信息(第三部分)
(2)I/O Tables I/O表
包含I/O状态,I/O传送的源与目标等(第11章)
(3)File Tables 文件表
包含文件是否存在,文件位置等(第12章)
(4)Process Tables 进程表
进程表描述了一个Process image 进程映像
进程映像是程序,数据,栈和属性的集合。
其中包括元素:
user data 用户数据:用户空间的可修改部分
user program 用户程序:待执行程序
system stack 栈:LIFO栈
process control block 进程控制块
PCB 进程控制块为属性集,其中的元素有:
进程标识信息,进程状态信息,进程控制信息
3.4进程控制
3.4.1执行模式
执行模式分为 user mode 用户模式 (非特权模式) 和 system mode 系统模式,control mode 控制模式 或 kernel mode 内核模式(特权模式)
级别0是最高特权级别,3是最低特权级别
内核模式的功能包括:
(1)进程管理:进程的创建和终止,进程的分派,切换等
(2)内存管理:为进程分配空间,交换
(3)I/O管理:为进程分配I/O通道和设备
(4)功能:中断,记账等
3.4.2进程切换
Interrupt 中断:对外部事件的反应
Trap 陷阱:处理错误或异常
Supervisor call 系统调用:调用系统函数
4.线程
4.1进程和线程
单线程和多线程进程模型
独立进程间的通信需要内核介入,提供保护和机制,但同一进程中的多个线程共享内存和文件。
相比进程,线程的优点:1.创建快 2.结束快 3.切换快 4.通信快
4.2线程的状态
和进程一样,线程的主要状态有运行态,就绪态,阻塞态,有一些操作可以改变线程状态:
1.Spawn派生:在派生一个新进程时,会为该进程派生一个线程,线程可在同一进程中继续派生线程
2.Block阻塞:线程需要等待一个事件时会被阻塞
3.Unblock解除阻塞
4.Finish结束:线程完成,释放寄存器上下文和栈
当进程被挂起时,其所有线程都被挂起;进程终止时,其所有线程也都终止。
4.3线程的分类
线程分为User-Level Thead用户级线程 和 Kernel-Level Thead内核级线程。
User-Level Thead用户级线程 :线程由应用程序管理;内核透明,调度基于进程。
优点:线程切换开销小,可进行对应用程序的量身定做的调度,可用在任何操作系统
缺点:不能有效利用多处理器(并行),一个进程中只有一个线程可以执行
Kernel-Level Thead内核级线程:内核维护进程和线程的上下文信息,调度基于线程。
优点:线程能同时在多处理器上运行;内核自身也是多线程的
缺点:把控制权从线程传到同进程的另一个线程时,需要切换内核模式
Combined Approaches混合方法:克服两种方法的缺点
5.并发:互斥和同步
5.1并发相关术语
atomic operation 原子操作:一个函数或动作不能被中断
critical section 临界区:一段访问共享资源的代码,只允许一个进程在其中运行
coroutine 协同程序:能够实现程序之间控制权的传递
deadlock 死锁:多个进程都在等待其它进程而不能继续执行(互相等待)
livelock 活锁:多个进程为响应其它进程而持续改变自己的状态却不做有用工作(互相改变而抵消)
mutual exclusion 互斥:一个进程访问临界区而其它进程不能进入
race condition 竞争条件:多个进程在读写一个共享数据 (私有变量不会产生竞争)
starvation 饥饿:一个进程可以执行但没有被调度执行
5.2并发的原理
5.2.1进程交互
1.Processes unaware of each other 进程之间互相不知道对方的存在
2.Processess indirectly aware of each other 进程间接知道对方的存在
3.Processes directly aware of each other 进程直接知道对方的存在
5.2.2互斥的要求
1.一次只允许一个进程进入临界区,忙则等待
2.阻塞于临界区外的进程不能干扰其它进程
3.不会发生饥饿或死锁
3.闲则让进
4.对进程的执行速度和处理器数目无要求
5.进程在临界区内占用时间有限
5.2.3互斥常用机制(本章内)
1.信号量 1.5.二元信号量 2.管程 3.信息传递
5.3机器指令实现互斥
实现互斥的硬件方法:中断禁用,机器指令
机器指令方法示例
/* program mutualexclusion */
const int n=/*进程个数*/;
int bolt;
void p(int i)
{
while (true){
while (compare_and_swap(bolt,0,1) == 1);/* bolt=0时,把1赋给bolt,返回原bolt的值,该循环没有循环语句,能不让其它进程干扰临界区 */
/*临界区*/
bolt = 0;/* 只有在前一个进程执行完临界区的程序,使bolt=0后,后面的进程才能结束上面的while循环 */
}
}
void main(){
bolt = 0;
parbegin(p(1),p(2),'''',p(n));
}
机器指令方法
优点:适用于任意数量的进程;简单易证;支持多个临界区
缺点:进程等待时会消耗处理器时间;可能发生饥饿;可能发生死锁
5.4信号量实现互斥
将信号量视为值为整数的变量,定义以下操作:
1.信号量初始化为非负数
2.semWait (P ):操作使信号量减一,若值变为负数,则阻塞执行它的进程。
3.semSignal (V):操作使信号量加一,若值为负数,则被semWait阻塞的进程解除阻塞。
代码如下:
struct semaphore{
int count;
queueType queue;
};
void semWait(semaphore s) //semWait和semSignal都不允许中断,可以使用上述机器指令实现
{
s.count--;
if(s.count < 0){
/* 把当前进程插入队列,且阻塞该进程 */
}
}
void semSignal(semaphore s)
{
s.count++;
if(s.count <= 0){
/* 把进程P移出队列,解除阻塞 */
}
}
5.4.1信号量术语
binary semaphore 二元信号量:值只能是0或1,进程等待时为0,执行时为1。
counting semaphore 计数信号量/general semaphore 一般信号量:非二元信号量。
mutex 互斥锁:与二元信号量区别于必须是同一个进程为互斥锁加锁或减锁。
strong semaphore:采用先进先出,等待最久的最先释放。你
weak semaphore:没有采用先进先出。
5.4.2信号量解决互斥
信号初始化为1,第一个执行semwait的进程可立即进入临界区,并把信号量变为0,其它试图进入临界区的进程被阻塞,每个不成功的尝试使信号量-1;每个从临界区离开的的进程使信号量+1,并使一个被阻塞的进程置于就绪态。
信号量解决互斥代码:
const int n=/* 进程数 */;
semaphore s=1; //s为信号量
void p(int i)
{
while (true){
semWait(s);
/*临界区*/
semSignal(s);
}
}
void main()
{
parbegin(p(1),p(2),'''',p(n));
}
5.5管程实现互斥
Monitors 管程是软件模块,只能有一个进程在管程中执行,且局部变量只能被管程中的进程访问,其它进程不能访问
5.5.1管程操作
condition variable 条件变量:支持同步
cwait(c ):调用进程在条件c上阻塞,管程可被另一个进程使用
csignal(c ):恢复一个被cwait因条件c阻塞的进程,若没有这样的进程,则不做
(用条件控制进程的进出)
有界缓冲区管程示例
void append(char x) //向缓冲区增加字符
{
while(count == N) cwait(notfull); //缓冲区满,防止溢出
buffer[nextin] = x; //字符存入
nextin = (nextin + 1) % N;
count++; //缓冲区中的数据项个数加1
cnotify(notempty); //通知等待的进程
}
void take(char x) //向缓冲区减少字符
{
while(count == 0) cwait(notempty); //缓冲区空,防止下溢
x = buffer[nextout];
nextout = (nextout + 1) % N;
count--; //缓冲区中的数据项个数减1
cnotify(notfull); //通知等待的进程
}
5.6消息传递实现互斥
5.6.1同步
receive(source,message) 接收
send(destination,message) 发送
信息的发送者和接收者都可阻塞或不阻塞:通常有3种组合
阻塞send,阻塞receive
无阻塞send,阻塞receive
无阻塞send,无阻塞receive
用消息传递实现互斥代码
const int n=/* 进程数 */
void P(int i)
{
message msg;
while(true)
{
receive (box,msg);
/* 临界区 */
send(box,msg);
}
}
void main()
{
create mailbox (box);
send (box,null);
parbegin(P(1),P(2),''',P(n));
}
5.6.2寻址
直接寻址:
send:包含目标进程的标识号
receive:
1.显式:进程必须显式地指定源进程
2.隐式:不能指定源进程
间接寻址:消息发送到一个共享的数据结构,该结构由保存消息的队列组成,称为mailbox 信箱,发送者和接收者的关系可以为一对一,多对一(信箱也称为端口),一对多或多对多。
进程与信箱的关联可以是静态的(一对一),也可以是动态的(多个发送者)。
5.6.3消息格式
消息格式包括:1.定长的短消息 2.数据放入文件 3.变长消息(包括消息头和消息体)
5.6.4排队规则
1.先进先出
2.按优先级排队
5.7并发设计问题
读者/写者问题定义:存在一个多个进程共享的数据区,有些进程(reader)只读取数据,有些进程(writer)只写入数据,并且满足
1.任意数量的读进程可同时读这个文件
2.一次只有一个写进程可以写文件
3.写进程写文件时禁止读进程读文件
生产者/消费者问题描述:有一个或多个生产者生产数据,并放置在缓存区中,有一个消费者从缓存区取数据,每次取一项,并且满足
1.任何时候只有一个主体(生产者或消费者)可访问缓存区
2.缓存满时生产者停止添加数据;缓存空时消费者不会取走数据
3.缓存区有无限或有限两种情况
tip:生产者/消费者问题不能视为只有一个写进程和一个读进程的特殊读者/写者问题,因为生产者需要读取队列指针,以确定向哪里生产,并确定缓存区是否已满,消费者类似。
(即生产与消费要关注对方,而读和写不用)
6.并发:死锁和饥饿
6.1死锁原理
死锁:一组相互竞争系统资源或进行通信的进程间的“永久”阻塞。
用joint progress diagram 联合进程图显示两个进程竞争两个资源的情况
灰色区域为fatal region 敏感区域,路径进入这个区域不可避免发生死锁
该图给出了6种不同的执行路径:
1.Q获得B,然后获得A,再释放B和A,当P执行时获得全部资源,不会死锁。
2.Q获得B,然后获得A,;P执行并阻塞在对A的请求上;Q释放B和A;当P恢复执行时获得全部资源,不会死锁。
4.P获得A,然后Q获得B,Q阻塞在A而P阻塞在B上,因而死锁。
其余同理
6.1.1可重用资源 Reusable Resources
可重用资源包括处理器,内存和外存,数据结构(例如文件,数据库),是不因使用而耗尽的资源。
当两个进程都要独占两个可重用资源,且现在每个进程都占用了一个资源并请求另一个资源时,就会发生死锁。
6.1.2可消耗资源 Consumable Resource
可消耗资源包括中断,信号,消息,进程得到该资源时,资源消失。
每个进程试图从另一个进程接收消息,然后再向其发送一条消息时,就会发生死锁。
6.1.3资源分布图
资源分布图:资源和进程用节点表示,方形为资源库,方形中的圆点为资源的一个实例。
P
1
→
R
a
P1\rightarrow Ra
P1→Ra:P1请求Ra
P
1
←
R
a
P1\leftarrow Ra
P1←Ra:P1占有Ra
c死锁,d不会发生死锁
6.1.4死锁的条件
互斥+占用且等待+不可抢占+循环等待
6.2死锁预防 deadlock prevention
死锁预防及预防死锁条件的发生
1-3防止任意一个发生:间接死锁预防
防止4发生:直接死锁预防
1.互斥:不能禁止
2.占有且等待:可以要求进程一次性请求所有需要的资源
问题:分配给该进程的资源可能长时间不被使用;进程可能被阻塞很久;进程可能事先不知道所需的所有资源。
3.不可抢占:当一个进程被另一个进程占有资源时,操作系统可以抢占进程,要求其释放资源
问题:资源状态容易保存和恢复时才能使用;两个进程优先级需有区别。
4.循环等待:定义资源类型的线性数据,进程资源的分配顺序要严格按照排序
问题:执行速度变慢;减少并发性。
6.3死锁避免 deadlock avoidance
(死锁避免与死锁预防有区别,但不大)
设:
矩阵Claim=C为每个进程对每种资源的最大需求,矩阵Allocation=A为每个进程当前的资源分配情况,Resource=R为每种资源总量,Available=V为每种资源剩余量,
C
i
j
C_{ij}
Cij为进程 i 对资源 j 的需求,
A
i
j
A_{ij}
Aij为进程 i 对资源 j 的占有量。
死锁避免的限制:
1.事先声明每个进程的最大资源
2.所有进程相互无关
3.分配的资源数量是固定的
4.占有资源的进程不能退出
6.3.1进程启动拒绝
仅当
R
j
⩾
C
(
n
+
1
)
j
+
∑
i
=
1
n
C
i
j
R_j \geqslant C_{(n+1)j}+\sum_{i=1}^n{C_{ij}}
Rj⩾C(n+1)j+i=1∑nCij
时才启动一个新进程(总量大于所有需求量才启动进程
P
n
+
1
P_{n+1}
Pn+1)
这个策略不是最优的,它假设了所有进程同时发出它们的所有请求。
6.3.2资源分配拒绝 (banker algorithm)
安全状态 safe state:至少有一个资源分配序列不会导致死锁
不安全状态 unsafe state:所有资源分配都会导致死锁
分配资源使进程和资源总是处于安全状态
6.4死锁检测 deadlock detection
操作系统周期性执行算法来检测是否死锁,检测到后再恢复死锁。
6.4.1死锁检测算法
执行示例:
1.标记Allocation矩阵中一行全为零的进程(未分配资源,不考虑死锁)
2.初始化一个临时向量
W
W
W,令
W
i
W_i
Wi等于
A
i
j
A_{ij}
Aij(行向量),定义一个请求矩阵
Q
Q
Q,
Q
i
j
Q_{ij}
Qij为进程
i
i
i 请求
j
j
j 类资源的数量
3.查找下标
i
i
i,使进程
i
i
i 当前未标记且
Q
Q
Q的第
i
i
i 行小于等于
W
W
W,对向量的所有的元素都要成立,直到找不到后,终止算法
4.若找到这样的行,标记进程
i
i
i,并把Allocation矩阵中的相应行加到
W
W
W中,返回步骤3
当这个算法的最终结果有未标记的进程时,存在死锁。
6.4.2死锁恢复
恢复死锁的方法:
1.取消所有死锁的进程
2.把每个死锁进程回滚到前面定义的某些检查点,并重新启动所有进程
3.一个个地取消死锁进程直到死锁消失
4.一个个地抢占资源直到死锁消失
(3)(4)选择原则包括:优先消耗处理器时间最少的进程,产生输出最少的进程等。
7.内存管理
内存管理:由操作系统动态完成内存分配以满足多个进程的要求。
7.1内存管理需求
1.重定位
进程进行重定位以在内存的不同区域移动。
(1)操作系统负责将进程放入内存时,可访问其进程映像(参考3.3进程描述)获得相关信息。
(2)处理器硬件和操作系统软件能以某种方式把程序代码中的内存访问转换为实际的物理内存地址,物理内存地址能反映程序在内存中的当前位置。
2.保护
在实现重定位的基础上保护进程不受干扰,需要处理器(硬件)在指令访问内存时判断该指令是否违法(需要访问内存的指令包括存取数据,跳转等)。
3.共享
在重定位与保护的基础上允许多个进程访问相同的共享区域。
4.逻辑组织
不同于内存被组织成线性的地址空间,可以为程序或数据划分模块,或提供不同的级别,或模块级提供共享。这需要内存管理技术。
5.物理组织
内存与外存间的移动信息的任务由存储管理负责。
7.2内存分区
(以下技术已经不再使用,用来明确概念,现在使用虚拟内存技术)
7.2.1固定分区 fixed Partitioning
对内存空间进行分区,形成若干边界固定的区域,每个分区能放一个进程。
1.使用大小相等的固定分区
缺点:
(1)进程太大而放不进一个分区
(2)内存利用率非常低,当装入的数据块小于分区大小,剩下的内存被浪费,产生内部碎片
2.使用大小不等的分区
缺点可缓解但没解决
进程分配方法:
(1)每个进程分配到能容纳它的最小分区
优点:内部碎片最小;缺点:没有大的程序时,内存空间会被空闲
(2)为所有进程提供一个队列,依次分配,优先分配到能容纳它的最小分区,所有分区被占据后则进行交换,换出被阻塞的进程或其它优先级下的进程。
7.2.2动态分区 Dynamic Partitioning
对内存空间进行分区,分区的长度和数量可变,可为进程分配与其所需内存相等大小的内存空间。
缺点:动态分区会产生越来越多的空洞,即外部碎片
(虽然可以进行内存压缩去掉空洞,但非常费时)
进程分配方法:巧妙分配内存以盖住空洞
取一个进程
(1)最佳适配:选择与要求大小最接近的空洞
(2)首次适配:从头扫描,选择大小足够的第一个可用空洞
(3)下次适配:从上一次放置的位置开始扫描,选择下一个大小足够的可用空洞
通常性能:首次>下次>最佳
7.2.3伙伴系统 Buddy System
伙伴系统是介于固定分区与动态分区的一种方法
例子:
二分内存直到是能容纳需求的最小内存,两个相同大小且相邻的内存进行合并。
7.2.4重定位
逻辑地址 logical address:与实际地址无关的访问地址
相对地址 relative address:逻辑地址的特例,是相对于已知点(如程序开始点)的存储单元
物理地址 physical address/绝对地址 absolute address:数据的实际位置
一种重定位的方法:利用基址寄存器和界限寄存器完成相对地址于物理地址的转换。
7.3分页
将内存分为大小固定,相等的块,每个进程也被分为同样大小的的块,则进程中称为页的块可以分配到内存中称为页框的可用块中,并且每个进程存在一个页表存储了该进程每页对应的页框位置。
会产生少量内部碎片
进程A的4页装入4个页框,并在页表中记录页号,进程B、C、D类似,如下图:
逻辑地址由页号和该页中的偏移量组成:
7.4分段
使用分段将程序及数据划分到几个段segment中,段的长度不要求相等
会产生少量外部碎片
逻辑地址同样由页号和该页中的偏移量组成:
逻辑地址转换成物理地址:
8.虚拟内存
8.1硬件和控制结构
常驻集 resident set:进程执行的任何时候都在内存的部分
实存 real memory
虚存 virual memory
系统抖动 thrashing:处理器的大部时间用于交换块而非执行指令
局部性原理 principle of locality(用来预测进程对下一个数据的引用)
8.1.1 分页
页表
虚拟内存中,页表项 PTE包含
1.页框号
2.P:表示当前页是否在内存中
3.修改位M:表示相应页的内容从上次装入到现在是否改变
4.其他控制位
虚拟地址(或逻辑地址)为页号+偏移量
物理地址为页框号+偏移量
分页系统中地址转换:
进程的页表也和其他页一样服从分页管理
两级页表
页表大小于虚拟地址空间大小成正比
例子:页尺寸为4KB(
2
12
2^{12}
212),则4GB(
2
32
2^{32}
232)虚拟内存空间由
2
20
2^{20}
220页组成,且每页由一个4B的页表项映射,则可创建由
2
20
2^{20}
220个页表项组成的页表,需要4MB(
2
22
2^{22}
222)的内存空间,该空间又由
2
10
2^{10}
210页组成,所以可以创建由
2
10
2^{10}
210个页表项组成的根页表,需要4KB(
2
12
2^{12}
212)空间。
两级分页系统中的地址转换:
倒排页表
虚拟地址的页号部分使用散列函数映射到散列表中,且每个进程没有单独的页表。
页表项包含
1.页号:虚拟地址的页号
2.进程标志符:表示使用该页的进程
3.控制位
4.链指针:包含链中下一项的索引值
例子:对于大小为
2
m
2^m
2m个页框的物理内存,倒排页表包含
2
m
2^m
2m项,即倒排页表与实际页框一一对应。
转换检测缓冲区TLB
TLB的使用:CPU先检查页是否在TLB中,如果不在则检查内存,若页也不在内存中,则产生缺页中断,把该页读入内存。
关联映射 associative mapping:在页表中查找所用的直接映射或索引。
页尺寸
页越小
优点:内部碎片总量越少。
缺点:每个进程的页的数量越多,产生缺页概率越大。
8.1.2分段
分段:把内存视为多个地址空间或段组成,段的大小不等
优点:
1.简化了对数据结构的处理
2.允许程序独立地改变或重新编译
3.有助于进程间共享
4.有助于保护
8.1.3段页式
段页式:地址空间被分为许多段,每段依次划分为许多固定大小的页。
8.2操作系统软件
8.2.1读取策略
1.请求分页:只有当访问到某页的一个单元时才将该页取入内存
2.预先分页:利用一个进程的页连续储存在铺存中,一次读取许多连续的页
8.2.2放置策略
可能比较无关紧要…
8.2.3置换策略
一个页框被锁定时,保存在该页框的页不能被置换
基本算法:
1.最佳(OPTimal,OPT):置换下次访问距当前时间最长的页(理想化的标准)
2.最近最少使用(Least Recently Used,LRU):置换内存中最长时间未被引用的页(开销较大)
3.先进先出:置换驻留在内存中时间最长的页(可增加页缓冲(充当高速缓存),把被置换的页留在内存中,根据是否被修改分别存入空闲页链表和修改页链表)
4.时钟(Clock):页框关联一个使用位。页装入内存和被访问后,页框使用位重置为1,置换时,指针先指向上次被置换的下一页,然后依次向下扫描,遇到使用位为1的页框时重置为0,遇到使用位为0的页框时将第一个为0的页框置换,如果所有页框使用位都为1,指针循环一周,将所有使用位重置为0,然后置换最初位置的页。(增加使用的位数或增加修改位,可使时钟算法更有效)
4种页面置换算法行为:
8.2.4驻留集管理
驻留集:任何时刻进程实际在内存中的部分
驻留集大小
1.固定分配策略 fixed-allocation:为进程在内存中分配固定数量的页框
2.可变分配策略 variable-allocation:分配给进程的页框在生命周期中不断发生变化
置换范围:没有空闲页框时由缺页中断激活
局部置换策略 local:仅在产生这次缺页的进程的驻留页中选择
全局置换策略 global:把内存中所有未被锁定的页都作为置换页的候选页
选取不同的驻留集大小策略和置换策略形成3种组合
8.2.5清除策略 Cleaning Policy
1.请求式清除:当一页被置换时才写回辅存(产生中断来写回,降低处理器利用率)
2.预约式清除:已修改的页在需要使用它们的页框之前成批写入辅存(页可能再次被修改)
结合页缓冲技术:只清除可用于置换的页,并去除了清除与置换之间的成对关系。
8.2.6加载控制 Load Control
系统并发度:驻留集在内存中的进程数量
驻留集进程太少,所有进程都处于阻塞的概率较大,在交换进程上花费较大。
驻留集进程太多,平均每个进程的驻留集大小不够,会发生频繁的缺页中断,导致系统抖动。
系统并发度减小时,一些驻留进程被挂起
1.最低优先级进程
2.缺页中断进程
3.最后一个被激活的进程
4.驻留集最小的进程
5.最大空间的进程
6.具有最大剩余执行窗口的进程
9.单处理器的调度
9.1调度的类型
长程调度 Long-term scheduling:决定哪个程序加入待执行进程池,基于FCFS 先来先服务原则。
中程调度 Medium-term scheduling:决定进程加入部分或全部位于内存中的进程集合,进行换入 swapping-in 和 换出 swapped-out,换入取决于系统并发度。
短程调度 Short-term scheduling:决定处理器执行哪个可运行进程,执行最频繁,也称分派器 dispatcher。如在当前进程阻塞或被抢占时(时钟中断,I/O中断,操作系统调用,信号),进行短程调度。
I/O调度:决定I/O设备响应哪个进程挂起的I/O请求
调度的层次:
9.2调度算法
9.2.1短程调度规则
短程调度目标:按照一定方式,来分配处理器时间
维度1:面向用户和面向系统:注重用户的感知;处理器的效率
维度2:与性能相关和无关:定量的如响应时间;定性或不易测量的如可预测性
9.2.2选择调度策略
选择函数 selection function:决定下次执行哪个进程
决策模式 decision mode:包括非抢占和抢占,区别在于前者进程不可中断,后者进程可被中断后转为就绪态
周转时间 turnaround time为在系统花费的总时间:等待时间+服务时间
归一化周转时间 normalized turnaround time:周转时间/服务时间
调度策略
FCFS:先来先服务,适用长进程,不利短进程
轮转:可选用不同的轮转周期
虚拟轮转法:改进于轮转法,所有解除I/O阻塞的进程都会转移到一个FCFS队列中,该队列进程优先于就绪队列的进程,且运行时间为基本时间段减去其上次在队列中被选择运行的总时间。
SPN:最短进程优先,非抢占策略
SRT:最短剩余时间优先,抢占策略
HRRN:最高响应比优先,
R
=
w
+
s
s
R=\frac{w+s}{s}
R=sw+s
~~
(R:响应比;w:等待处理器的时间;s:预计的服务时间)
反馈:不需要知道预计剩余时间,每次执行一个时间段,若没执行完,则优先级下降。
反映调度性能:
T
r
T
s
\frac{T_r}{T_s}
TsTr:完成时间(即服务时间+等待时间)/服务时间
11.I/O管理和磁盘调度
11.1 I/O设备
设备分类:
1.人可读 human readable:如打印机,显示器,键盘,鼠标等
2.机器可读 machine readable:磁盘驱动器,传感器等
3.通信 communication:适用于与远程设备通信
设备差别:
1.数据传输速率 data rate:不同设备数据传输速率(bps)不同
2.应用 application:设备应用不同,对操作系统的软件和策略有影响
3.控制的复杂性 complexity of control:不同设备需要的控制接口不同
4.传送单位 unit of transfer:字节流或块等
5.数据表示 data representation
6.错误条件 error condition
11.2 I/O功能
执行I/O的技术:
程序控制I/O programmed I/O:
优点:实现简单。在读/写指令之后,加上实现循环检查的一系列指令即可(因此才称为“程序直接控制方式”)
缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。
中断驱动I/O interrupt-driven I/O:
优点:与“程序控制方式”相比,在“中断驱动方式”中,I/O控制器会通过中断信号主动报告I/O已完成,CPU不再需要不停地轮询。CPU和I/O设备可并行工作,CPU利用率得到明显提升。
缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会消耗较多的CPU时间。
直接内存访问 DMA direct memory access用DMA控制内存与I/O模块的数据交换,解放cpu。
优点:数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU和I/O设备的并行性得到提升。
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。
如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要分别发出多条I/O指令,进行多次中断处理才能完成。
工作流程:
1.处理器对DMA发出命令,包括请求读/写操作信号,I/O地址,存储器起始地址,读/写字数
2.DMA直接从存储器传送整块数据,结束后给处理器发中断信号
11.3设计目标
目标:效率和通用性
I/O功能的逻辑结构:
逻辑I/O:不关心实际控制细节,允许用户使用打开,关闭,读,写等命令
设备I/O:请求的操作和数据被转换为I/O指令
调度和控制I/O:I/O模块与设备硬件交互的软件层,处理中断,报告I/O状态
文件系统的逻辑结构中包含目录管理,文件系统,物理组织(12章)
11.4 I/O缓冲
缓冲:在发出输入请求前开始执行输入,在输出请求发出一段时间后再执行输出,防止进程和I/O操作产生死锁,可以提高系统性能。
I/O设备:面向块的I/O设备 block-oriented(包括磁盘,USB卡),面向流的I/O设备 stream-oriented(包括终端,打印机,鼠标等)
11.4.1 单缓冲
最简单的缓冲类型,当用户进程发出I/O请求时,操作系统为该操作分配一个内存中的系统部分的缓冲区。
预读/预先输入:将需要传递的数据放到系统缓冲区中,并期望这个数据会被使用。因为数据通常是被顺序访问,所以是合理的。进程可以在读取之后数据的同时处理已读入的数据,提高系统速度。
11.4.2 双缓冲
操作系统分配两个缓冲区,在一个进程向一个缓冲区存取数据的同时,操作系统清空或填充另一个缓冲区,提升性能。
11.4.3 循环缓冲
操作系统分配多个缓冲区,并循环使用,即有界缓冲区的生产者/消费者问题。
11.5磁盘调度
11.5.1 磁盘参数
磁盘I/O操作:进程发出I/O请求后,进程需先等待设备可用,然后设备被分配给该进程,若设备与其他磁盘共享一个I/O通道,可能需要等待通道可用,接着磁盘开始传送数据:首先磁头定位于指定的磁道(寻道时间 seek time),再到该磁道指定扇区开始处(旋转延迟 rotational delay),然后开始读/写操作(传输时间 transfer time)。
存取时间 access time为寻道时间与旋转时间的总和
T
=
b
r
N
T
a
=
T
s
+
1
2
r
+
T
T=\frac{b}{rN}\\ ~\\ T_a=T_s+\frac{1}{2r}+T
T=rNb Ta=Ts+2r1+T
其中
T
T
T 表示传输时间,单位为转/秒。
T
s
T_s
Ts 为平均寻道时间,
T
a
T_a
Ta 为读取文件总时间,
r
r
r为旋转速度,
N
N
N为一个磁道中的字节数,
b
b
b为要传送的字节数。
旋转定位感知 RPS:一种额外的延迟,通道被占用,设备必须旋转一周才能尝试重新连接。
11.5.2 磁盘调度策略
在操作系统处理多个进程的多个I/O请求时,通过比较不同的调度方式以求达到最好的I/O性能。
0.随机调度 random scheduling (作为对照组)
1.先进先出 FIFO:最公平
2.优先级 PRI
3.后进先出 LIFO:局部性最好,资源利用率最高
4.最短服务时间优先 SSTF:利用率高
5.SCAN:磁头仅沿一个方向移动到达最后再反方向扫描:服务分布好
6.C-SCAN:磁头仅沿一个方向移动到达最后再快速回到原处重新扫描
7.N步 SCAN:把磁盘请求队列分为长度为N的几个子队列,每次用SCAN处理一个子队列,新请求加入未满的队列中
8.FSCAN:使用两个队列,扫描过程中,所有新到的进程都放入另一个队列,延迟到处理完老进程之后
11.6 RAID (Redundant Array of Independent disks 独立冗余磁盘阵列)
RAID方案是关于多磁盘数据库设计的标准方案,包括0到6的7个级别,都是通过增加冗余度来提高可靠性。
11.7磁盘高速缓存
页面置换算法:
LRU 最近最少使用算法:最常用的算法
LFU 最不经常使用算法:换出使用频率最低的块
12.文件管理
12.1文件概述
12.1.1 文件属性
长期存在:存储在硬盘或辅存中,退出系统时不会丢失
可在进程间共享
结构:文件可以有层次结构等
创建/删除/打开/关闭/读/写
12.1.2 文件结构
域 field:基本数据单元(如一个人的姓名)
记录 record:域的集合(如一个人的姓名,学号,学院等信息)
文件 file:记录的集合(如许多人的姓名,学号,学院等信息)
数据库 database:由文件组成,独立于操作系统
12.1.3 文件系统架构
设备驱动device drivers 程序:直接与外围设备通信,设备通常为磁盘和磁带设备
基本文件系统,或叫物理I/O层:处理交换的数据块,关注块在辅存或内存缓冲区的位置
基本I/O管理程序 basic I/O supervisor:负责文件I/O的初始化和终止
(上面3项是操作系统的一部分)
逻辑I/O:使用户和应用程序能访问记录
访问方法 access method:与用户最接近的一层,提供接口
文件系统与操作系统的关系
12.2文件组织和访问
文件组织的原则:
快速访问,易于修改,节约存储空间,维护简单,可靠性
基于上述原则,有5种基本组织:
1.堆pile:想查找某个域或记录则必须查找整个文件
2.顺序文件:最常用的文件组织形式,记录按关键域key field进行存储,关键域唯一的标识了每个记录
3.索引顺序文件:记录仍然按照关键域的顺序组织,并增加了支持随机访问的文件索引和溢出文件overflow,减少了访问单条记录的时间。
4.索引文件:只能通过索引查找记录,记录放置位置无限制。
5.直接或散列文件:可以直接访问任何地址已知的块,每个记录也有关键域。
需求快速访问时使用,通常一次访问一条记录,且记录固定长度
12.3文件目录
目录内容:
1.基本信息:文件名,文件类型,文件组织
2.地址信息:卷,起始地址,使用大小
3.访问控制信息:所有者,访问信息,许可行为
4.使用信息
目录上执行的操作:查找,创建/删除文件,显示目录,修改目录
目录的结构:
两级方案:主目录有用户目录的目录项,用户目录有文件的列表
层次或树状结构:主目录下有多个子目录,子目录下又有子目录
路径名 pathname:一系列目录名和最后的文件名组成
工作目录 working directory:当前所在位置目录名
12.4文件共享
访问权限:构成一个层次结构,每个权限隐含了前面所有权限
无 none:用户不知道文件是否存在
知道 knowledge:用户确定文件存在
执行 execution:用户可加载并执行程序,不能复制
读 reading:用户可读文件,包括复制和执行
追加 appending:用户可给文件在末尾添加数据,不能修改和删除内容
更新 updating:用户可修改,删除,增加文件中的数据
改变保护 changing protection:用户可改变其他用户的访问权限
删除 deletion:用户可从系统删除该文件
所有者onwer可将访问提供给不同类型的用户:
特定用户 specific user:由用户ID指定
用户组 user groups
全部 all:公共文件
12.5记录组块
记录组织成块的方法:(组织成块进行I/O传输)
定长组块 fixed blocking:最常用方式
变长跨越式组块 variable-length spanned blocking
变长非跨越式组块 variable-length unspanned blocking
12.6文件分配
连续分配 contiguous allocation:一种大小可变分区的预分配策略,每个文件记录起始块和文件长度
优点:可同时读入多个块,检索也很容易。
缺点:创建文件时需声明文件大小,会产生外部碎片。
链式分配 chained allocation:每一块都包含指向下一块的指针,每个文件记录起始块和文件长度
优点:没有外部碎片
缺点:局部性原理不再适用
索引分配 indexed allocation:每个文件在文件分配表中有一个一级索引,是最普遍的文件分配形式
优点:没有外部碎片,支持顺序访问文件和直接访问文件