(java)用PV信号解决进程互斥问题22年

计算机操作系统

第三章 进程的同步与互斥
会基本概念的直接跳到例子。三:如何解决线程互斥



前言

为了剥削和压榨计算机的性能,同时又让用户执行多个程序,不出现卡顿和死锁,引入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符合逻辑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值