程序顺序执行
程序需要按先后次序被顺序运行,仅当前一程序段运行完成后,才会运行后一程序段
特征:顺序性、封闭性、可再现性
程序并发执行
只有不存在前驱关系的程序才有可能并发执行,否则无法并发执行
特征:间断性、失去封闭性、不可再现性
:使多个程序能并发执行,以提高资源利用率和系统吞吐量
进程是程序的执行过程(是程序的一次执行),是系统进行资源分配和调度的一个独立单位。
动态性(最基本的特征)
并发性
独立性:进程是一个能够独立运行、独立获得资源、独立接受调度的基本单位(①进程是一个可拥有资源的独立单位②进程又是一个可独立调度和分派的基本单位)
异步性
进程是程序的执行过程,是动态的;而程序是一组有序指令的集合,是静态的
进程能够与其他进程并发执行,而程序(未建立PCB)不能参与并发执行
进程标识符PID:用于唯一标志一个进程
处理机状态
处理机处于执行状态时,正在处理的许多信息都放在寄存器中。当进程被切换时,处理机状态信息都必须保存在相应的PCB中,以便在该进程被重新调度时,能再从断点处继续执行
进程调度信息
①进程状态。作为进程调度和对换时的依据
②进程优先级
③进程调度所需要的其他信息,与调度算法有关
④事件。指进程由执行状态转换为阻塞状态所等待发生的事件,即阻塞原因
进程控制信息
①程序和数据的地址
②进程同步和通信机制
③资源清单,列出进程在运行期间所需的全部资源(除CPU外)
④链接指针,给出本进程所在队列中的下一个进程的PCB的始址
(1)作为独立运行基本单位的标志:PCB是进程存在于系统中的唯一标志
(2)实现间断性运行方式:系统将CPU现场信息保存在被中断进程的PCB中,供该进程再次被调度运行而须回复CPU现场信息时使用
(3)提供进程管理所需要的信息
(4)提供进程调度所需要的信息
(5)实现于其他进程的同步与通信
:减少程序在并发执行时所付出的时空开销,以使OS具有更好的并发性
线程作为调度和分派的基本单位
线程是调度和分派的基本单位,因而线程是能独立运行的基本单位。当线程切换时,仅需保存和设置少量寄存器的内容,切换代价远小于进程。
在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,必然会引起进程的切换
并发性
进程之间可以并发执行
一个进程中的多个线程之间也可以并发执行
不同进程的线程也可以并发执行
拥有资源
进程是拥有资源的基本单位;而线程几乎不拥有资源
线程可以共享它们共属的进程所拥有的资源
独立性
同一进程中的不同线程之间的独立性要比不同进程之间的独立性低很多。
原因:每个进程都有独立的地址空间和其他资源,除共享全局变量外,不允许自身以外的进程访问自己地址空间中的地址;而同一进程中的不同线程可以共享进程的内存地址空间和资源。
系统开销
线程的切换代价远低于进程
支持多处理机系统
可以将一个进程中的多个线程分配到多个处理机上
高级调度
调度对象:作业
位置:外存→内存
状态:无→创建态→就绪态
功能:根据某种算法决定将外存上处于后备队列中的那几个作业调入内存,为它们创建进程、分配必要的资源,并将它们放入就绪队列。
用于:多道批处理系统
中级调度
位置:外存→内存
状态:挂起态→就绪态
功能:决定将外存上已具备运行条件的就绪进程再重新调入内存,并修改它们的状态为就绪态,并将它们放入就绪队列
实际上是存储器管理中的对换功能
低级调度
调度对象:进程
位置:内存→CPU
状态:就绪态→运行态
功能:根据某种算法决定就绪队列中的哪个进程应获得处理机,并由分派程序将处理机分配给被选中的进程。
最基本的一种调度,多道批处理系统、分时和实时系统都必须配置这种调度。
缺点:
①必须预先知道作业的运行时间。
②对长作业非常不利,可能会使长作业等待时间过长,出现饥饿现象。
③无法实现人机交互。
④没有考虑作业的紧迫程度
类型:非抢占式、抢占式
优先级类型:静态优先级、动态优先级(先赋予一个优先级,然后随进程的推进或等待时间的增加而改变)
特点:
①如果作业的等待时间相同,则要求服务时间越短,优先级越高,此时类似于SJF调度算法,有利于短作业。
②当作业的要求服务时间相同时,其优先级又取决于等待时间,此时类似于FCFS调度算法。
③对于长作业的优先级,其可随等待时间的增加而提高,当作业的等待时间足够长时,也可以获得处理机。
系统将所有就绪进程按FCFS策略排成一个就绪队列。把处理机分配给队首的进程,并令其执行一个时间片
进程切换时机:
①一个时间片尚未用完而正在运行的进程已经完成;
②时间片用完,如果进程尚未运行完毕,调度程序就把它送往就绪队列的末尾。
时间片大小的确定:若选择很小的时间片,则将有利于短作业,但意味着系统会频繁地执行进程调度和进程上下文的切换,无疑会增加系统的开销;若选择太大的时间片,则会退化为FCFS调度算法。一个较为可取的时间片大小是略大于一次典型交互所需要的时间。
将进程就绪队列拆分成若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法。
起因:
定义:如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的。
必要条件:
产生死必须同时具备以下4个必要条件:
处理方法
临界资源:进程在使用的时候需要采用互斥的方式的资源
进入区:检查是否可进入临界区,若可进入,需要“上锁”
临界区:访问临界资源的那段代码
退出区:“解锁”
...
关中断;
临界区;
开中断;
...
缺点:
①滥用关中断权力可能导致严重后果;
②关中断时间过长会影响系统效率,进而限制CPU交叉执行程序的能力;
③关中断方法不适用于多CPU系统
wait(S){
while(S <= 0);
S--;
}
signal(S){
S++;
}
typedef struct {
int value;
struct process_control_block *list;
}semaphore;
wait(semaphore *S){
S->value--;
if(S->value<0)
block(S->list);
}
signal(semaphore *S){
S->value++;
if(S->value<=0)
wakeup(S->list);
}
wait—P、signal—V
semaphore mutex=1;
PA(){
while(1){
wait(mutex);
临界区;
signal(mutex);
剩余区;
}
}
PB(){
while(1){
wait(mutex);
临界区;
signal(mutex);
剩余区;
}
}
wait(mutex)和signal(mutex)必须成对出现
2. 实现进程同步
设置同步型信号量S,并设初值为0,取值范围为(-1,0,1)
semaphore S=0;
P1(){
while(1){
C1;
signal(S);
...
}
}
P2(){
while(1){
wait(S);
C2;
...
}
}
semaphore a1, a2, b, c, d = 0;
S1(){
...;
V(a1);V(a2);
}
S2(){
P(a1);
...;
V(b);
}
S3(){
P(a2);
...;
V(c);
}
S4(){
P(b);P(c);
...;
V(d);
}
S5(){
P(d);
...;
}
管程是一种特殊的软件模块,有这些部分组成:(有点类似于面向对象的类)
管程的基本特征:
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。
问题分析:
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程必须互斥地访问。互斥关系
semaphore mutex = 1; //互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n; //同步信号量,表示空闲缓冲区的数量
semaphore full = 0; //同步信号量,表示产品的数量,也即非空缓冲区的数量
producer (){
while(1){
生产一个产品;
P(empty); //检查是否有空闲缓冲区
P(mutex); //互斥地使用临界区资源
把产品放入缓冲区;
V(mutex);
V(full);(增加一个产品)
}
}
consumer (){
while(1){
P(full); //消耗一个产品(非空缓冲区)
P(mutex);
从缓冲区取出一个产品;
V(mutex);
V(empty); //增加一个空闲缓冲区
使用产品;
}
}
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。
问题分析:
互斥关系(mutex = 1):
对缓冲区(盘子)的访问要互斥地进行
同步关系(一前一后):
1. 父亲将苹果放入盘子后,女儿才能取苹果
2. 母亲将橘子放入盘子后,儿子才能取橘子
3. 只有盘子为空时,父亲或母亲才能放入水果
semaphore mutex = 1; //实现互斥访问盘子(缓冲区)
semaphore apple = 0; //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 1; //盘子中还可以放多少个水果
dad (){
while(1){
准备一个苹果;
P(plate);
P(mutex);
把苹果放入盘子;
V(mutex);
V(apple);
}
}
mom (){
while(1){
准备一个橘子;
P(plate);
P(mutex);
把橘子放入盘子;
V(mutex);
V(orange);
}
}
daughter (){
while(1){
P(apple);
P(mutex);
从盘中取出苹果;
V(mutex);
V(plate);
吃掉苹果;
}
}
son (){
while(1){
P(orange);
P(mutex);
从盘中取出橘子;
V(mutex);
V(plate);
吃掉橘子;
}
}
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
问题分析:
①关系分析。系统中有5个哲学家进程,5位哲学家与左右邻居对其中间筷子的访问是互斥关系。
② 整理思路。每个哲学家进程需要同时持有两个临界资源才能开始吃饭。
③ 信号量设置。定义互斥信号量数组chopstick[5]={1,1,1,1,1} 用于实现对5个筷子的互斥访问。并对哲学家按0~4编号,哲学家 i 左边的筷子编号为 i,右边的筷子编号为 (i+1)%5。
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex = 1; //互斥地取筷子
Pi (){ //i号哲学家的进程
while(1){
P(mutex);
P(chopstick[i]); //拿左
P(chopstick[(i+1)%5]); //拿右
V(mutex);
吃饭…
V(chopstick[i]); //放左
V(chopstick[(i+1)%5]); //放右
思考…
}
}
有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④写者执行写操作前,应让已有的读者和写者全部退出。
问题分析:
两类进程:写进程、读进程
互斥关系:写进程—写进程、写进程—读进程。读进程与读进程不存在互斥问题。
semaphore rw=1; //用于实现对共享文件的互斥访问
int count = 0; //记录当前有几个读进程在访问文件
semaphore mutex = 1; //用于保证对count变量的互斥访问
semaphore w = 1; //用于实现“写优先”,防止写者饿死
writer (){
while(1){
P(w);
P(rw);
写文件…
V(rw);
V(w);
}
}
reader (){
while(1){
P(w);
P(mutex);
if(count==0)
P(rw);
count++;
V(mutex);
V(w);
读文件…
P(mutex);
count--;
if(count==0)
V(rw);
V(mutex);
}
}
存储器的层次结构
通用计算机存储层次至少应具有3层:CPU寄存器、主存储器、辅助存储器
细分可分为:寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质
逻辑地址和物理地址
逻辑地址(相对地址):CPU生成的地址
物理地址(绝对地址):装入内存地址寄存器的地址
内存保护
通过基址寄存器、界限寄存器进行保护
基地址:最小合法物理地址
界限地址:合法范围的大小
判断:基地址≤物理地址<(基地址+界限地址)
1. 绝对装入方式
2. 可重定位装入方式
3. 动态运行时装入
1. 静态链接
2. 装入时动态链接
3. 运行时动态链接
对换(不同进程或作业间)
:把处于等待状态(或在CPU调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来(换出);把准备好竞争CPU运行的程序从辅存移到内存(换入)
换出的进程的PCB仍留在内存
==>改善内存利用率
类型:
1. 整体对换 :以整个进程为单位
2. 页面(分段)对换 :以一个页面或分段为单位
对换区管理的主要目标
文件区管理的主要目标:提高文件存储空间的利用率,提高对文件的访问速度。
==>采用**离散分配**的存储管理方式
对换区管理的主要目标:提高进程换入和患处的速度,提高文件存储空间的利用率
==>采用**连续分配**存储管理方式
覆盖(一个程序或进程内)
:将用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。将即将要访问的段放入覆盖区,其余放在外存,有需要调用前,系统将其调入覆盖区,覆盖原有的段。
:在用户区内存仅装有一道用户程序
:将用户空间划分成若干个固定大小的区域,并在每个分区中只装入一道作业
数据结构:①空闲分区表;②空闲分区链
要求:
空闲分区链以地址递增的次序链接
从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止
特点:
保留了高址部分的大空闲分区,为以后到达的大作业分配大的内存空间创造了条件
低址部分不断被划分,进而留下许多难以利用的很小的空闲分区(碎片)
每次从链首开始查找,增加查找时的开销
要求:
从上次找到的空闲分区的下一个空闲分区开始查找
特点:
使内存中的空闲分区分布更均匀,从而减少查找空闲分区的开销
大的空闲分区缺乏
要求:
所有空闲分区按容量从小到大的顺序,排成一个空闲分区链
把能满足要求的最小的空闲分区分配给作业
特点:
每次分配后割下来的剩余部分总是最小,留下许多难以利用的碎片
要求:
将所有分区按容量从大到小排成一个空闲分区链
挑选最大的空闲区进行分配
特点:
缺乏大的空闲分区
查找效率高
可能出现的四种情况:
1. 回收区与插入点的前一个空闲分区F1相邻,则将其与前一空闲分区合并,修改前一空闲分区F1的大小即可
2. 回收区与插入点的后一个空闲分区F1相邻,则将其与后一空闲分区合并,以回收区的起始地址作为新空闲区的起始地址
3. 回收区同时与插入点的前一个和后一个空闲分区相邻,则取消后一空闲分区的表项,将前一空闲分区的大小改为三者之和
4. 回收区与前后空闲区域均不相邻,则新增一个表项,以回收区低址为起始地址,并插入空闲分区链表中的适当位置
把原来分散的多个小分区拼接成一个大分区
缺点:每紧凑一次,需要对移动了的程序或数据的地址进行修改,大大影响系统的效率
内存地址=相对地址+重定位寄存器中的地址
基本概念:
①进程中的块——页/页面(Page)
②内存中的块——页框/页帧(Page Frame)
③外存——块/盘块(Block)
④页表:实现从页号到块号的地址映射
⑤地址结构
若给定一个逻辑地址空间的地址为A,页面大小为L,则页号P和页内地址d可按下式求得:
页表存放于内存中,CPU每次存取一个 数据时都要访问内存两次。第一次是访问内存中的页表,第二次是访问获得的物理地址中的数据
==>快表:采用小但专用且快速的硬件缓冲
未使用快表的内存有效访问时间
使用快表的内存有效访问时间EAT=a+(1-a)
引入目的:为了满足用户(程序员)在编程和使用上多方面的要求
满足多方面的需求:
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
每个段都有自己的名字,通常用一个段号来代替段名,每个段都从0开始编址,并存储在一段连续的地址空间内
段的长度由相应的逻辑信息组的长度决定,因此各段长度不等。
段表:用于实现从逻辑段到物理内存区的映射
每个段在表中占有一个表项,记录了该段在内存中的起始地址(基址)和段的长度。
分段和分页原理的结合,即先将用户程序分成若干段,再把每个段分成若干个页,并为每个段赋予一个段名。
优点:
前面的存储器管理方式都有两个共同特点:
局部性原理:
时间局部性(循环操作):一条指令被执行了,则在不久的将来它可能再被执行
空间局部性(顺序执行):若某一存储单元被使用,则不久后与之相邻的单元可能被使用。
定义:具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种寄存器系统
特征:
多次性:作业中的程序和数据允许被分成多次调入内存允许
对换性:作业运行时无须常驻内存
虚拟性:从逻辑上扩充了内存容量,使用户看到的内存容量远大于实际内存容量
状态位P:指示该页是否在内存
访问字段A:记录该页在一段时间内被访问的次数
修改位M:也称脏位,标志该页是否被修改过
外存地址:指示该页在外存中的地址(物理块号)
请求分页中的内存分配
固定分配局部置换
可变分配全局置换:只要缺页就给分配新物理块
可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块
:淘汰未来最长时间不会被访问的页面
:一个进程的页面经常换入换出(刚被换出的页面很快又被调入)
原因:同时在系统中运行的进程太多,因此分配给每一个进程的物理块太少,不能满足进程运行的基本要求,致使进程在运行时,频繁缺页,必须请求系统将所缺页面调入内存。
:指在某段时间间隔Δ里进程实际要访问页面的集合。
能够隐藏物理设备的细节
能够保证OS与设备无关
提高处理机和I/O设备的利用率
能够对I/O设备进行控制
控制方式:
①轮询的可编程I/O方式
②中断的可编程I/O方式:打印机、键盘等低速设备
③直接存储器访问(DMA)方式:磁盘、光盘等高速设备
④I/O通道方式
能够确保对设备的正确共享
能够处理错误
按使用特性分类:
存储设备:外存、辅存
I/O设备:输入设备、输出设备和交互式设备
按传输速率分类:
低速设备:键盘、鼠标
中速设备:行式打印机、激光打印机
高速设备:磁带机、磁盘机、光盘机
按信息交换单位分类:
块设备
字设备
按设备的共享属性分类:
独占设备
共享设备
数据信号线
控制信号线
状态信号线
主要功能:控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换
基本功能:
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲区
- 差错控制
设备控制器的组成: