【问题标题】:Why is synchronization in a uniprocessor system necessary?为什么在单处理器系统中需要同步?
【发布时间】:2014-06-04 06:41:26
【问题描述】:

为什么在单处理器系统中需要同步?我想知道为什么有必要的具体案例。如果一次只有一个进程/线程可以访问 CPU,那么什么时候需要同步?

【问题讨论】:

  • 你永远不知道线程什么时候会被抢占。如果您希望操作是原子的,则必须确保其他线程不会介入其中。假设您的应用程序只能在单 CPU 系统上运行,这不是错误的吗?
  • 是的,有道理,谢谢。

标签: operating-system synchronization system processor


【解决方案1】:

单处理器系统中的同步是为了确保资源(例如,控制链表的互斥锁)被锁定到特定的执行线程,即使其他线程可能正在运行。

虽然您是正确的,一次只有一个线程可以使用 CPU,但抢占式线程意味着一个线程本身无法控制它何时暂停以便另一个可以运行,操作系统可以。如果您允许线程控制它们的调度,这就是所谓的协作线程,它会带来一系列问题。

因此,由于线程无法知道它何时会在抢占式竞技场中被切换出去,它会想要锁定资源并确保在释放锁定之前没有其他执行线程可以使用该资源。这可能是在同时发生数千次上下文切换之后。

【讨论】:

  • 谢谢,这是有道理的。
【解决方案2】:

让我举个例子来解释一下:

假设我们有这个伪代码:

function() {
 a = readVariable() // a is a shared resource / global variable say
 ++a
 writeVariable(a) // store a resource
}

假设 a = 10;

假设有 2 个进程:P1 和 P2。假设 P1 先开始执行:

function() {
     a = readVariable() // a = 10
     ++a // a = 11. Say P1 run only upto this statement and context switched to P2 right at this moment
     writeVariable(a)
    }

现在,在上下文切换后执行 P2:

function() {
         a = readVariable() // a = 10. This will still be 10, since we didnt run the last statement before context switching.
         ++a // a = 11
         writeVariable(a) // store 11 to global variable a. Then context switch back to P1

恢复 P1:

function() {
             a = readVariable()
             ++a // a = 11
             writeVariable(a) // P1 will continue executing from this line. Since current value of a is 11. It will store that value to global variable a.
        }

现在,我们从中了解到了什么? 我们的函数应该在每次运行时将全局变量 a 的值增加 1。但是由于我们在执行所有指令之前将 P1 上下文切换到 P2,因此从未存储 a 的值,因此这会导致模棱两可的结果。全局变量 a 的最终值应该是 12,但在我们的例子中结果是 11,这是错误的。因此,我们应该确保在上下文切换之前执行完整的函数。

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2021-12-31
    • 2019-06-06
    • 2016-10-03
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多