现代系统架构?
Modern System Architecture?
如果我们在现代计算机上使用彼得森的临界区问题解决方案会发生什么?据我了解,具有多个 CPU 的系统可能 运行 由于内存读写相对于内存中其他读写的顺序而变得困难,但这是大多数现代系统的问题吗?使用信号量 VS 互斥锁有什么优势吗?
嘿,有趣的问题!所以基本上,为了理解您要问的内容,您必须确保您知道您要问的是什么。 临界区 只是程序的一部分,一次不应由该程序的一个以上进程或线程同时执行。不允许多个并发访问,所以这意味着一次只有一个进程与系统交互。通常这个“临界区”访问数据结构或网络连接等资源。
Mutual Exclusion或mutex只是描述了一次只有一个并发进程在临界区的需求,所以并发访问共享数据必须保证这个"mutual exclusion".
所以这就引入了问题!我们如何确保进程 运行 完全独立于其他进程,换句话说,我们如何确保线程对各个临界区的“原子访问”?
"critical-section problem" 有一些解决方案,但您提到的是 Peterson 的解决方案,因此我们将讨论它。
Peterson 算法专为互斥而设计,允许两个任务共享一次性资源。他们使用共享内存进行通信。
算法中,两个任务会竞争临界区;您将不得不更多地研究互斥锁、绑定等待和其他属性以全面了解,但只是在彼得森的方法中,进程等待 1 轮和 1 轮才进入临界区,如果它给予其他任务或进程优先权,那么该进程将 运行 完成并因此允许其他进程进入临界区。
这是最初提出的解决方案。
然而,这并不能保证在当今的多处理现代架构上工作,它只适用于两个并发任务。在现代计算机上,当涉及到读写时,它有点混乱,因为它具有乱序执行类型,因此有时顺序操作会以错误的顺序发生,因此存在局限性。我建议你也看看 locks。希望有所帮助:)
还有谁能想到我可能遗漏的任何补充内容吗?
It is my understanding that systems with multiple CPUs can run into difficulty because of the ordering of memory reads and writes with respect to other reads and writes in memory, but is this the problem with most modern systems?
没有。任何具有 "less strict" 内存排序的现代系统都将有办法在重要的地方(例如围栏)使内存排序更加严格。
Are there any advantages to using semaphores VS mutex locks?
互斥体通常更简单、更快(就像布尔值比计数器更简单一样);但是忽略开销,互斥量相当于 "resource count = 1".
的信号量
What could happen if we used Peterson's solution to the critical section problem on a modern computer?
这里的大问题是大多数现代操作系统都支持某种多任务处理(例如,多进程,其中每个进程可以有多个线程),通常有 100 个其他进程(仅用于 OS单独),现代硬件有电源管理(当 CPUs 不能做有用的工作时,你试图通过让它们进入睡眠状态来避免功耗)。这意味着(无限)spinning/busy 等待是一个可怕的想法(例如,您可以浪费 N CPU 来获取锁,而当前持有锁的任务不是运行 在任何 CPU 上,因为调度程序决定 1234 个其他任务每个应该获得 10 毫秒的 CPU 时间)。
相反;为避免(过度)旋转,您希望调度程序阻止您的任务 until/unless 实际上可以获得锁;并且(特别是对于竞争激烈的锁)您可能需要 "fairness"(以避免导致某些任务反复幸运而其他任务饥饿且没有进展的时间问题的风险)。
这最终是 "no spinning",或 "brief spinning"(以避免在持有锁的任务实际上 can/does 快速释放它的情况下调度程序开销);随后任务被放入 FIFO 队列,调度程序将 CPU 分配给另一个任务或将 CPU 置于休眠状态;如果锁被释放,调度程序会唤醒 FIFO 队列中的第一个任务。当然,它从来没有那么简单(例如,为了性能,你想在 user-space 中尽可能多地做;并且你需要特别注意并在 user-space 和内核之间进行合作以避免竞争条件 -在将任务放入等待队列之前释放锁。
幸运的是,现代系统还提供了更简单的方法来实现锁(例如 "atomic compare and swap"),因此无需求助于 Peterson 的算法(即使它只是针对真正锁的 insertion/removal 个任务先进先出队列)。
如果我们在现代计算机上使用彼得森的临界区问题解决方案会发生什么?据我了解,具有多个 CPU 的系统可能 运行 由于内存读写相对于内存中其他读写的顺序而变得困难,但这是大多数现代系统的问题吗?使用信号量 VS 互斥锁有什么优势吗?
嘿,有趣的问题!所以基本上,为了理解您要问的内容,您必须确保您知道您要问的是什么。 临界区 只是程序的一部分,一次不应由该程序的一个以上进程或线程同时执行。不允许多个并发访问,所以这意味着一次只有一个进程与系统交互。通常这个“临界区”访问数据结构或网络连接等资源。
Mutual Exclusion或mutex只是描述了一次只有一个并发进程在临界区的需求,所以并发访问共享数据必须保证这个"mutual exclusion".
所以这就引入了问题!我们如何确保进程 运行 完全独立于其他进程,换句话说,我们如何确保线程对各个临界区的“原子访问”?
"critical-section problem" 有一些解决方案,但您提到的是 Peterson 的解决方案,因此我们将讨论它。
Peterson 算法专为互斥而设计,允许两个任务共享一次性资源。他们使用共享内存进行通信。
算法中,两个任务会竞争临界区;您将不得不更多地研究互斥锁、绑定等待和其他属性以全面了解,但只是在彼得森的方法中,进程等待 1 轮和 1 轮才进入临界区,如果它给予其他任务或进程优先权,那么该进程将 运行 完成并因此允许其他进程进入临界区。
这是最初提出的解决方案。
然而,这并不能保证在当今的多处理现代架构上工作,它只适用于两个并发任务。在现代计算机上,当涉及到读写时,它有点混乱,因为它具有乱序执行类型,因此有时顺序操作会以错误的顺序发生,因此存在局限性。我建议你也看看 locks。希望有所帮助:)
还有谁能想到我可能遗漏的任何补充内容吗?
It is my understanding that systems with multiple CPUs can run into difficulty because of the ordering of memory reads and writes with respect to other reads and writes in memory, but is this the problem with most modern systems?
没有。任何具有 "less strict" 内存排序的现代系统都将有办法在重要的地方(例如围栏)使内存排序更加严格。
Are there any advantages to using semaphores VS mutex locks?
互斥体通常更简单、更快(就像布尔值比计数器更简单一样);但是忽略开销,互斥量相当于 "resource count = 1".
的信号量What could happen if we used Peterson's solution to the critical section problem on a modern computer?
这里的大问题是大多数现代操作系统都支持某种多任务处理(例如,多进程,其中每个进程可以有多个线程),通常有 100 个其他进程(仅用于 OS单独),现代硬件有电源管理(当 CPUs 不能做有用的工作时,你试图通过让它们进入睡眠状态来避免功耗)。这意味着(无限)spinning/busy 等待是一个可怕的想法(例如,您可以浪费 N CPU 来获取锁,而当前持有锁的任务不是运行 在任何 CPU 上,因为调度程序决定 1234 个其他任务每个应该获得 10 毫秒的 CPU 时间)。
相反;为避免(过度)旋转,您希望调度程序阻止您的任务 until/unless 实际上可以获得锁;并且(特别是对于竞争激烈的锁)您可能需要 "fairness"(以避免导致某些任务反复幸运而其他任务饥饿且没有进展的时间问题的风险)。
这最终是 "no spinning",或 "brief spinning"(以避免在持有锁的任务实际上 can/does 快速释放它的情况下调度程序开销);随后任务被放入 FIFO 队列,调度程序将 CPU 分配给另一个任务或将 CPU 置于休眠状态;如果锁被释放,调度程序会唤醒 FIFO 队列中的第一个任务。当然,它从来没有那么简单(例如,为了性能,你想在 user-space 中尽可能多地做;并且你需要特别注意并在 user-space 和内核之间进行合作以避免竞争条件 -在将任务放入等待队列之前释放锁。
幸运的是,现代系统还提供了更简单的方法来实现锁(例如 "atomic compare and swap"),因此无需求助于 Peterson 的算法(即使它只是针对真正锁的 insertion/removal 个任务先进先出队列)。