操作系统
第一章 操作系统引论
第二章进程的描述与控制
1、进程的定义:
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
2、程序与进程
程序:
静态的:有序代码的集合,由代码集合组成,不支持并发,不能作为独立单位参与运行
一个程序可对应多个进程
进程:
动态的:是一个状态变化的过程,有程序、数据和PCB组成,支持并发,具有独立性
一个进程可包括多个程序
3、进程的三种基本状态:
(1)就绪状态
(2)执行状态
(3)阻塞状态
4、三种基本状态的转换
就绪----(进程调度)--->执行
执行----(时间片完)--->就绪
执行----(I/O请求)--->阻塞
阻塞----(I/O完成)--->就绪
5、进程控制块(PCB)
是进程实体的一部分,记录了系统所需的用于描述进程当前情况以及管理进程运行的全部信息,是操作系统最重要的记录型数据结构
6、进程控制块中的信息
(1)进程标识符
内部标识符
外部标识符
(2)处理机状态(主要由处理机的各种寄存器的内容组成)
通用寄存器
指令计数器
程序状态字PSW
用户栈指针
(3)进程调度信息
(4)进程控制信息
程序和数据地址
程序同步和通信机制
资源清单
链接指针
7、进程的阻塞与唤醒
所谓“阻塞别人、唤醒自己”
进程的阻塞是主动行为
进程的唤醒是被动行为
8、进程同步
著名的进程同步问题---生产者-消费者问题
【例】生产者-消费者问题--著名的进程同步问题
生产者 ---->1 2 3 4 5 ... n-1 --->消费者
int in=0,out=0,counter=0;
item buffer[n|;
生产者投放一个产品后,输入指针in加1:
in=(in+1)%n(n是缓冲区个数,整型常量),in初值为0;
消费者每取出一个产品,输出指针out加1:
out=(out+1)%n,out初值为0;
引入一个共享变量counter,初值为0:
生产者投放一个产品,counter加1,counter=n时不能再投放产品
消费者每取一个产品,counter减1,counter=0时不能再取出产品
void producer()
{
while(1)
{
produce an item in nextp;
...
while (counter==n)
;//空操作
buffer[in]= nextp;
in=(in +1)% n ;
counter ++;
}
};
Void consumer()
{
while(1)
{
while (counter==0)
;//空操作
nextc = buffer[out];
out =(out + 1)% n;
counter=counter-1;
consume the item in nextc;
...
}
};
9、临界区
进程中访问临届资源的那段代码称为临界区
10、同步机制应遵循的规则:
空闲让进
忙则等待
有限等待
让权等待
第三章 处理机的调度与死锁
1、高级调度
又称作业调度(分时系统和实时系统无作业调度)
2、低级调度
又称进程调度(所有系统都有进程调度)
3、中级调度
4、先来先服务算法FCFS
周转时间=完成时间-到达时间
带权周转时间=周转时间/运行时间(比值越大,等待越长)
利于长作业,不利于短作业
5、短作业(进程)优先调度算法:SJ(P)F
6、优先级调度算法
由外部赋予作业优先级,越紧迫的作业优先级越高
7、高响应比优先调度算法(动态优先权)
优先权=等待时间+要求服务时间/要求服务时间=响应时间/要求服务时间
8、产生死锁的必要条件
互斥条件
请求和保持条件
不可抢占条件
循环等待条件
9、预防死锁(互斥条件不能改变)
10、安全状态
系统按着某种进程推进顺序,为每个进程Pi分配其所需资源,满足所有进程的需求,则为安全,否则不安全
11、银行家算法中的数据结构
Available 可利用资源向量
Max 最大需求矩阵
Allocation 分配矩阵
Need 需求矩阵
Need[i,j] = Max[i,j] - Allocation[i,j]
12、银行家算法
设Request是进程P的请求向量,如果Request[j]=K,表示进程P;需要K个R类型的资源。当P发出资源请求后,系统按下述步骤进行检查:
(1)如果Request[j]<=Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request[j]<=Available[j],便转向步骤(3):否则,表示尚无足够资源,P须等待。
(3)系统试探着把资源分配给进程P,并修改下面数据结构中的数值
Available[j] = Available[j] - Request[j];
Allocation[i,jl = Allocation[i,j] + Request[j];
Need[i,j]=Need[i,j]-Request[j];
(4)系统执行安全性检测算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配:
若不安全,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
13、安全性算法
(1)设置两个向量:
①工作向量Work:表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available;
② Finish:表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=false;当有足够资源分配给进程时,再令 Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程
① Finish[i]=false;
② Need[i,j]<=Work[j];
若找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P;获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+A1location[i,j];
Finish[i]=true;
go to step 2;
(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。