目录.
一、进程
前言
进程定义
进程组成
进程状态
进程控制
二、线程
线程定义
线程类型
线程状态
线程控制
2、线程终止
3、线程的唤醒与阻塞
三、进程和线程的区别
进程和线程的区别
四、进程同步
同步概念
同步准则
信号量机制
整型信号量机制
演示
(使用整型信号量互斥访问临界资源)
int num; //定义一个整型信号量用于记录互斥资源的使用状态。
num = 1; //初始化整型信号量 num>0 表示有资源可用 num<=0表示没有资源可以用。
void P1(){ //P1进程。
wait(num); //申请一个资源。num-1
CS; //申请到资源后进行作业
signal(num);//释放一个资源。num+1
}
void P2(){ //P2进程。
wait(num); //申请一个资源。num-1
CS; //申请到资源后进行作业
signal(num);//释放一个资源。num+1
}
(我们把两个方法看做是两个进程,P1和P2进程,当P1进程wait(num)申请完一个资源后,num的数量就-1,num的数量此时等于0。
此时其它进程再来访问资源就必须等待,等待当前占有资源的进程使用完资源并进行signal(num)操作的时候num+1才可以有机会访问到资源)
(使用整型信号量实现进程的协调)
num = 0; //要求p2必须在p1结束后才能运行,
void P1(){ //P1进程。
CS; //申请到资源后进行作业
signal(num);//释放一个资源。num+1
}
void P2(){ //P2进程。
wait(num); //申请一个资源。num-1
CS; //申请到资源后进行作业
signal(num);//释放一个资源。num+1
}
(上述代码是要求进程协调执行进程p2必须在p1结束后才能申请资源。)
总结
(1).整型信号量的值只能由wait()和signal()操作改变。
(2).wait和signal操作都是原子操作,即在这两个操作中对信号量的访问是不能被中断的。
记录型信号量机制
演示
var num1: semaphore
num1.value=1;
void wait(){
wait(num1) //此时num1=num1.value-1;
if s.value <= 0 then block(s.L);
}
void signal(){
signal(num1) //此时num1=num1.value+1;
if s.value > 0 then wakeup(s.L);
}
总结
五、进程调度
功能
时机
准则
调度算法
先来先服务调度算法(FCFS)
FCFS算法性能:
进程名 | 进入系统时间 | 开始运行时间 | 服务时间 | 等待时间 | 周转时间 |
P1 | 0 | 0 | 24 | 0 | 24 |
P2 | 1 | 24 | 3 | 23 | 26 |
P3 | 2 | 27 | 3 | 25 | 28 |
系统平均周转时间T=(24+26+28)÷ 3=26
平均带全权周转时间 W=(24/24+26/3+28/3)÷3 ≈ 6.33
短进程优先调度算法(SPF)
优先权调度算法(PSL)
时间片轮转调度算法(RR)
多级队列调度
六、死锁
安全状态举例:假定系统有3个进程,共有12个某类资源R,进程P1总共要求10个R类资源,P2和P3分别要求4个和9个R类资源。设在T0时刻,系统分配资源情况如表
进程 | 最大需求 | 已分配 | 还需要 | 可用 |
---|---|---|---|---|
P1 | 10 | 5 | 5 | 3 |
P2 | 4 | 2 | 2 | |
P3 | 9 | 2 | 7 |
上表存在安全序列所以是安全状态表,
安全序列为:P2->P1->p3。
解读:p2还需要2个资源当前剩余资源还有3个满足分配,当分配给P2后,P2使用完成后释放4个资源,此时剩余资源还有5个正好满足P1所需的资源,分配给P1执行完毕后释放10个资源,接着就可以分配给P3使用。
总结:(通过资源的合理分配使系统处于安全状态)