计算机操作系统--同步

前言

当两个或多个进程相互合作时,必须保留其执行顺序,否则可能会在执行过程中产生冲突,并产生不适当的输出。协同进程可以影响其它进程执行的协同进程,也可以受到其他进程执行的影响。这些进程需要同步,以保证其执行顺序。

当两个或多个线程尝试读取,写入并可能根据他们正在同时访问的内存做出决定时,通常会发生竞争状况。

一、临界区问题

<1>临界区是试图访问共享资源的程序一部分。该资源可以是计算机中的任何资源,如内存位置,数据结构,CPU或任何设备。

<2>临界区不能同时由多个进程执行;操作系统在允许和禁止进程进入临界区时面临着困难。

<3>临界区问题用于设计一组协议,可与确保进程间的竞争条件永远不会出现。

同步机制的要求

相互排斥

解决方案必须提供相互排斥。通过相互排斥,如果一个进程在临界区内执行,那么另一个进程不能进入临界区。

进程

进程意味着如果一个进程不需要执行到临界区,那么它不应该阻止其他进程进入临界区。

有界等待

应该预测每个流程进入临界区的等待时间,这个进程不能无休止的等待进入临界区。

架构中立

机制必须架构中立的。这意味着如果解决方案在一个架构上运行良好,那么它也应该在其他架构上运行。

二、锁定变量机制

这是最简单的同步机制。在一个用户下实现的软件机制。这是一个繁忙的等待解决方案,可用于两个以上的进程。在这个进程中,使用了锁变量lockis。两个锁定值是可能的,可以是0或1.锁定值表示临界区域是空的,而锁定值1表示它被占用。想要进入临时部分的进程首先检查锁定变量的值。如果它是0,那么它将锁的值设置为1并入临界区,否则等待。

每个同步机制是根据四个条件来判断的。
<1>相互排斥
<2>进程
<3>有界等待
<4>可移植性

TSL指令(测试锁定变量机制)

首先执行TSL的过程将进入临界区,之后不会进入其他进程,直到第一个进程出来。即使在抢先执行第一个过程的情况下,任何进程都不能执行临界区。
<1>相互排斥
在TSL机制中保证相互排斥,因为在设置锁变量之前,进程永远不会被抢占。只有一个进程可以在特定的时间将锁变量看作0,这就是为什么互斥可以保证执行。

<2>进程
不想进入临界区的进程不应该阻止其他的进程进入进程。在TSL机制中,进程只有在想要进入临界区时才会执行TSL指令。如果没有进程不想进入临界区,锁的值将始终为0,因此在TSL中始终保证进程。

<3>有界等待
TSL不保证有限等待。这些过程可能没有这么长时间。我们无法预测一个进程,在一段时间之后,它肯定会有机会进入临界区。

<4>架构中立
TSL不提供架构中立。这取决于硬件平台。TSL指令由操作系统提供。有些平台可能不会提供。因此它不是架构中立的。
在这里插入图片描述

三、开启可变或严格的交替方式

Turn Variable或Strict Alternation Approach是在用户模式下实现的软件机制。 这是一个繁忙的等待解决方案,只能为两个进程实施。 在这种方法中,使用实际上是锁的转弯变量。

相互排斥

严格的交替方法在每种情况下都提供相互排斥,此过程仅适用于两个进程。无论进程如何,进程都不能进入临界区。

进程

这一机制无法保证进展。

可移植性

这个解决方案提供了便携性,它是在用户模式下实现的纯粹的软件机制,不需要操作系统的任何特殊指令。

四、感兴趣变量机制

必须确保进度必须由我们的同步机制提供。在转向变量机制中,由于不想进入临界区的进程并没有考虑其他兴趣的进程,所以没有提供进展。另一个进程也将不得不等待,而不管临界区内部没有进程。如果操作系统可以利用额外的变量以及转向变量,那么这个问题就可以解决。感兴趣的变量机制利用额外的布尔变量来确保提供进度

相互排斥

在感兴趣变量机制中,如果一个进程有兴趣进入CPU,那么另一个进程将等待,直到它变得不感兴趣。因此,临界区不能同时存在多个进程,因此该机制保证互斥

进展

在这种机制中,如果一个进程不想进入临界区,那么它不会阻止另一进程进入临界区,所以,这种方法肯定会提供进展。

有界等待

感兴趣变量永远不能提供有界的等待,因此,感兴趣变量并不能保证死锁。

架构中立

该机制是在用户模式下执行的完整软件机制,因此它保证了可移植性或架构中立性。
在这里插入图片描述

五、帕特森(Peterson)解决方案

这是在用户模式下实现的软件机制。这是一个繁忙的等待解决方案,只能实施两个流程。他使用两个变量:回转变量和感兴趣变量。

相互排斥

该方法确实提供互斥。在入口部分,while条件涉及两个变量的标准,因此一个进程无法进入临界区,直到另一个进程感兴趣,并且进程最后一个更新转向变量。

进展

一个不感兴趣的进程永远不会阻止另一个感兴趣的进程进入临界区。如果另一个进程也有兴趣,那么这个进程将会等待。

有限的等待

感兴趣变量失败了,因为没有提供有限的等待。但是在Peterson解决方案中,死锁永远不会发生,因为首先设置转向变量的进程肯定进入临界区。所以,如果在执行入口部分的第四行之后进程被抢占,那么它在下一次机会中肯定会进入临界区。

可移植性

这是完整的方案,因此它在每个硬件上都是可移植的。

在这里插入图片描述

六、同步机制无需等待

迄今为止,我们所看到的所有解决方案都是为了在忙碌的等待中提供相互排斥。 然而,忙等待并不是资源的最佳分配,因为它始终在持续检查while循环条件时保持CPU繁忙,尽管进程正在等待临界区变为可用。

所有具有繁忙等待的同步机制也受到优先级反转问题的困扰,即每当存在具有较高优先级的进程必须在关键部分之外等待的进程时总会存在自旋锁的可能性,因为机制意图执行较低优先级 在关键部分进行处理。

七、睡眠和唤醒

假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。

睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。

八、信号量介绍

信号量是存储从生产者转移到消费者的整个唤醒调用变量。 它是在内核模式下自动进行读取,修改和更新的变量。

信号量不能在用户模式下实现,因为在两个或更多进程试图同时访问变量时总会出现竞争条件。 它始终需要操作系统的支持才能实施。

信号量可以分为两类:

<1>计算信号量

<2>二进制信号量或互斥量

猜你喜欢

转载自blog.csdn.net/qq_52269550/article/details/116850940