现代系统架构?

时间:2019-10-09 01:33:14

标签: c operating-system mutex semaphore

如果我们在现代计算机上使用Peterson的解决关键部分问题的解决方案,会发生什么?我的理解是,由于内存读取和写入相对于内存中其他读取和写入的顺序,具有多个CPU的系统可能会遇到困难,但这是大多数现代系统的问题吗?使用信号量VS互斥锁有什么好处?

2 个答案:

答案 0 :(得分:4)

嘿,有趣的问题!因此,基本上为了理解您的要求,必须确保您知道自己的要求。 关键部分只是该程序的一部分,一次不应由该程序的进程或线程中的一个以上并发执行。不允许进行多个并发访问,因此,这意味着一次只能有一个进程与系统进行交互。通常,此“ 关键部分”访问诸如数据结构或网络连接之类的资源。

互斥互斥体仅描述了一次仅在关键部分中存在一个并发进程的要求,因此对共享数据的并发访问必须确保该“相互”排除”。

因此这引入了问题!我们如何确保进程完全独立于其他进程运行,换句话说,如何确保线程对各个关键部分的“ 原子访问”?

“临界区问题”有一些解决方案,但您提到的是 Peterson的解决方案,因此我们将对此进行讨论。

Peterson的算法是为互斥而设计的,它允许两个任务共享一次使用的资源。他们使用共享内存进行通信。

在算法中,两个任务将争夺关键部分;您需要更多地研究互斥体,绑定等待和其他属性以进行全面了解,但这只是在彼得森的方法中,一个过程需要等待1转1转才能进入临界区,如果它优先处理其他任务或流程,则该流程将运行到最后,从而允许其他流程进入关键部分。

这是最初提出的解决方案。

但是,这不能保证可以在当今的多处理现代体系结构上工作,并且只能用于两个并发任务。在现代计算机上进行读写操作时比较麻烦,因为它具有乱序的执行类型,因此有时顺序操作会以不正确的顺序发生,因此存在局限性。我建议您也看看。希望能有所帮助:)

还有谁能想到我可能错过的补充内容?

答案 1 :(得分:3)

  

我的理解是,由于内存读取和写入相对于内存中其他读取和写入的顺序,具有多个CPU的系统可能会遇到困难,但这是大多数现代系统的问题吗?

不。任何具有“不太严格”的内存排序的现代系统都将有办法使内存排序在重要的地方(例如栅栏)变得更加严格。

  

使用信号量VS互斥锁有什么优势吗?

互斥对象通常更简单,更快速(就像布尔值比计数器简单一样);但忽略开销,互斥锁等同于“资源计数= 1”的信号灯。

  

如果我们在现代计算机上使用Peterson的解决关键部分问题的方法,会发生什么?

这里的最大问题是,大多数现代操作系统都支持某种多任务处理(例如,多个进程,其中每个进程可以具有多个线程),通常还有100个其他进程(仅用于OS)和现代硬件具有电源管理功能(在这种情况下,您可以通过在CPU无法执行有用的工作时使其进入睡眠状态来避免功耗)。这意味着(无限制)旋转/忙碌等待是一个可怕的主意(例如,当调度程序确定当前拥有该锁的任务未在任何CPU上运行时,您可能浪费了N个CPU进行旋转/尝试获取锁1234个其他任务每个应该获得10毫秒的CPU时间。

相反;为了避免(过度)旋转,您想要让调度程序阻塞您的任务,直到/除非可以真正获得锁为止;并且(尤其是对于竞争激烈的锁),您可能想要“公平”(避免出现计时问题的风险,导致某些任务反复出现运气而其他任务却挨饿而没有进展)。

这最终是“不旋转”或“简短旋转”(以避免在持有锁的任务实际上可以/确实迅速释放它的情况下避免调度程序开销);随后将任务放入FIFO队列中,并通过调度程序将CPU交给其他任务或使CPU进入睡眠状态;如果释放了锁,则调度程序将唤醒FIFO队列上的第一个任务。当然,它从未如此简单(例如,为了提高性能,您想要在用户空间中尽力而为;并且您需要特别注意并在用户空间和内核之间进行协作以避免竞争条件-在执行任务之前释放锁放在等待队列中。

幸运的是,现代系统还提供了更简单的方法来实现锁(例如,“原子比较和交换”),因此无需诉诸Peterson的算法(即使该算法仅用于从实锁的FIFO队列中插入/删除任务)