信号量机制实现进程的互斥、同步、前驱

1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制

 

 

 

信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的变量),可以用信号量来表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

P、V操作:

P表示通过,V表示释放

 

 

 1.整型信号量:

整型信号量与普通的信号量的区别

对信号量的操作只有:初始化、P操作、V操作 

 

缺点:不满足“让权等待”原则,会发生“忙等”

 2.记录型信号量:

 

在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应该增加一个进程链表指针L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。

例题: 

 

 用P、V操作进行进程的通过和释放,再加入原语来实现进程的“上锁”和“解锁”,等资源使用完毕,再利用block原语进行阻塞(主动让出处理机),该机制遵循了“让权等待”的原则。

 

 

 

 

 

 3.AND型信号量:

AND型信号量在一些应用场合,是一个进程需要先获得两个或者更多的共享资源后方能执行其任务。

 

 AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部的分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配,采取原子操作方式要么把它所请求的资源全部分配给进程,要么一个也不分配。由死锁理论可知,这样就可以避免上述死锁情况发生。为此,在wait操作中,增加一个“AND”条件,故称为AND同步,或称为同时wait操作。

 

 缺点:AND型信号量满足了 “多种资源,数量为1”的使用情景,但是实际上还会有多种资源数量不固定的情景,AND型信号量显然处理不了这种情况的进程调度。

 

 死锁的概念:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去;此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

 

 

 4.信号量集:

信号量集由两部分组成:标识组和等待任务列表;

标识组由三部分组成:1.OSFlagType——识别是否为信号量集的标志

                                    2.OSFlagWaitList——指向等待任务列表的指针

                                    3.OSFlagFlags——信号量表

注意:信号量集的标识组只是保存了各输入信号量的值,而至于如何对这些任务进行处理则是等待任务的事情。

等待任务必须完成以下两个操作:1.在多个信号量输入中挑选等待任务感兴趣的输入。

                                                      2.把挑选出来的输入按照等待任务所期待的方式运算,以得到输出。

1. 信号量集的标志组

UCOS不是使用事件控制块的结构描述信号量集,而是使用一个标志组的机构来描述信号量集OS_FLG_GRP

2. 等待任务链表

与其他事件不同,信号量集采用一个双向链表来组织等待任务。标志组OS_FLG_GRP的成员OSFlagWaitList指向信号量集的这个等待任务链表。

等待任务链表中的节点OS_FLAG_NODE中的成员OSFlagNodeFlags相当于一个过滤器,它可以将请求任务需要的信号筛选出来,不需要的信号屏蔽掉。

对等待任务链表的操作:添加节点和删除节点。

“信号量集”的三种特殊情况:

​ (1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。

​ (2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。

​ (3) Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
 

信号量的应用:

  • 利用信号量实现进程互斥关系
  • 利用信号量实现进程同步关系
  • 利用信号量实现进程前趋关系

小结:

 

 

 

 

 

 5.信号量实现进程的互斥:

 

 

解释一下互斥原理:

           先设置一个互斥信号量mutex(可自己定义),再初始化信号量,使mutex=1,然后进行P操作(申请资源使用),这时候mutex-1,即mutex=0,对这个资源进行“加锁”,别人无法再使用这个资源,也就是相当于(C语言中for循环的条件判断,满足条件就进行,不满足就跳出),等程序使用资源完毕时,就会进行V操作(释放资源),对资源进行“解锁”,这时候mutex+1,重新使mutex=1,使资源解放出来,等待下一个程序的使用。

 6.信号量机制实现进程同步:

 

进程同步:要让各进程按要求有序地进行推进。

 

 

解释一下进程同步的原理:

         让各进程按要求有序地进行推进,先将初始化同步信号量的初始值设置为0。我们让代码4在代码2之后进行执行,这时候因为异步性,不知道是P1进程先进行还是P2进程先进行,我们先在代码2后面设置一个V(S)操作,在代码4后面设置一个P(S)操作。【可能有以下两种情况】

1.当先进行P1进程时,进程会按照代码1,代码2的顺序进行,当执行完代码2时,到达了V(S)操作,这时候将资源释放了出来,这时候初始值增加(S+1),接着进行P2进程,由于P2中进行了P(S)[申请资源]的操作,所以进程会按照代码4,代码5,代码6进行下去。

2.当先进行P2进程时,会遇到P(S),但这时候的初始值为0,无法提供资源,P2进程进入自我阻塞状态。然后就进行P1进程的执行。这样就实现了让各进程按要求有序地进行推进。也就是实现了进程同步。

 

 

 

 7.信号量机制实现前驱关系:

 

前驱关系本质上就是更复杂的同步问题。

在这一个进程实现之后执行V操作

在下一个进程实现之前执行P操作

 

 

 总结:

 

 

 

         这篇文章写了三个半小时,先进行看视频学习,两个视频反复看了两三遍,等自己理解之后,再写,进行整理和写上了自己对内容的理解,感觉虽然时间花费的比较多,但这些内容自己都理解了,还拓展了一部分,感觉自己棒棒,哈哈 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值