进程管理——进程同步与死锁

前言:上个博客写到完成进程同步任务需要三个信号量机制,接下来咱们一一阐述。牢记在计算机中越接近底层算术越简单,就是二进制0与1加减,二进制在计算机世界里可以表示任何数据,当然包括咱们的信号量,首先引入

整型信号量

接着拿那两个进程临界区代码举例

P1: counter = counter+1
P2: counter = counter+1

如何实现:
在counter= counter+1这段临界区代码前后加入整型信号量,并且加入两个操作也就是方法,我觉得有必要讲下代码,好像一有代码就不想看的感脚,其实很简单耐下性子,咱们一起看

Var s integer;//定义一个整型变量,初始值等于1,定义普通一个变量,如果是1就证明临界区代码无进程访问,反之是0
wait(s)//定义一个方法,就是说明那两个进程其中一个要进入临界区了,注意
{
    While s<=0 do no-op;//先判断是否小于等于0,如果是进入死循环,也就是说明临界区代码有进程运行,申请的进程进入等待
    s=s-1;//如果不是分配给当前进程,相应资源要减1证明临界区代码被占用
}
Single(s)//再定义一个方法,用于申请的进程运行完,不在占着临界区
{
    s=s+1;
}

在实际进程运行过程中,会调用上面两个封装的方法,变成如下代码

wait(s)
     counter = counter+1
singal(s)

设置s初始值为1即可实现互斥访问,但是整型信号量机制会违反同步机制的准则,首先看下它的准则有什么

进程管理——进程同步与死锁

可以看出整型信号量机制违反了让权等待准则(当进程申请不到共享资源访问权时,应立即释放CPU),在wait方法中申请不到CPU的进程,会让cpu进入死循环状态,因此便有了

记录型信号量机制,如下图所示:

进程管理——进程同步与死锁

现在有一个就绪队列有P1 P2 P3都要进入临界区s的value初始值为1(表示只有一个临界资源)首先要申请都要进行wait方法,s的value值都要减一,假如按照先来先服务原则先执行P1,则有了下图:

进程管理——进程同步与死锁

现在P1执行完毕,进行了single方法即执行s.value=s.value+1,则便有了下图:

进程管理——进程同步与死锁

然后检测s.value的值,如果<=0则唤醒阻塞队列下一个进程,现在就唤醒P2继续执行这三个步骤直到P3运行结束,至此便可实现互斥访问,但是当s.value=2时,即有两个临界区资源时,容易产生死锁,因此引入了

AND型信号量机制

这个信号量机制最简单,这个是将所需要的资源一次给运行进程,使用完之后一起释放。只要还有一个资源不能分配给该进程,所有可能为之分配也不分配给它,当然在设计操作系统的时候,设计人员已经界定了临界资源

至此解决进程同步的三个方法分享完成,感谢您的阅读,还请斧正!