计算机操作系统
第三章 进程的同步与互斥
会基本概念的直接跳到例子。三:如何解决线程互斥
前言
为了剥削和压榨计算机的性能,同时又让用户执行多个程序,不出现卡顿和死锁,引入PV信号控制进程。
一、信号量与pv控制是什么?
最初1965年,荷兰学者Dijkstra定义的信号量包括整型(数据类型如1,0),和队列s.queue。
今天表示:用来保证两个或多个关键代码段不被并发调用的数据和结构。
pv是两个原语操作(如0,1就规定死的最小两种操作结果)
二、如何控制和操作
我们使用Dijkstra的例子java编程来实现
1.定义信号量和pv
代码如下(示例):定义信号量value 与linkedLink类型的queue
public class SemaPhone {
public int value;
public LinkedList<PCB> queue;//Data Structure of Linked List,it type is PCB
public Queue<LinkedList<PCB>>blockQueue;
public Queue<LinkedList<PCB>>wakeQueue;
2.原语定义
代码如下(示例):p原语
//we set wait to p()
public void wait(SemaPhone s){
s.value = s.value-1;//状态值s中的value-1
if(s.value<0){//信号量小于0则把s线程对象
block(s.queue);//放入阻塞队列取排队
}
}
代码如下(示例):v原语
//we set signal to v()
public void signal(SemaPhone s){
s.value = s.value+1;//value值+1
if(s.value<=0){//value<=0则把s对象对应线程
wakeUp(s.queue);//放入就绪队列准备运行
}
}
对立的一组原语定义完毕。
三:如何解决线程互斥
例子:p1和p2方法并行,且读写count全局变量,初始count=5
注意要同步看p1,p2
public void setValue(){
semaPhone.value=1;//给信号量赋值1
}
public void p1(){
semaPhone.wait(semaPhone);//进入区value=1-1
{ R1=count;//临近区{}R1=5
R1=R1+1;//R1=5+1
count= R1;//count=6,时间片用完执行p2
System.out.println(count);}//6
semaPhone.signal(semaPhone);//退出区value=-1+1,唤醒p2
}
p2程序
public void p2(){
semaPhone.wait(semaPhone);//进入区value=0-1,阻塞p2,跳p1
//p2被唤醒后value=0
R2=count;//R2=6
R2=R2+1;//R2=6+1
count= R2;//count=7//时间片用完,运行p1
System.out.println(count);//7
semaPhone.signal(semaPhone);//退出区value=0+1
}
总结
例如:利用控制信号原语操作,实现了同步控制的互斥性。
体现了:让权等待,当无法运行时,让别的程序来运行。
特点:宏观上多线程的并发同步运行,微观上单核CUP顺序执行。
分析:根据程序调用的顺序,p1,p2运算的值count符合逻辑