为什么单处理器系统中的同步是必要的?我想知道一个具体案例,说明为什么有必要。如果一次只有一个进程/线程可以访问CPU,那么何时需要进行同步?
答案 0 :(得分:1)
单处理器系统中的同步是确保资源(例如,控制链接列表的互斥锁)被锁定到特定的执行线程,即使其他线程可能正在运行。
虽然你是正确的,一次只有一个线程可以使用 CPU ,但先发制人的线程意味着线程本身无法控制它何时暂停以便另一个线程可以运行,操作系统。如果你允许线程控制他们的调度,那就是所谓的合作线程,它带来了一系列问题。
因此,由于线程无法知道何时将在先发制人的竞技场中切换,因此它将希望锁定资源并确保在释放锁之前没有其他执行线程可以使用该资源。这可能是在此期间可能发生的数千次上下文切换之后。
答案 1 :(得分:0)
让我举个例子来说明这一点:
说我们有这个伪代码:
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,这是错误的。因此,我们应该确保在上下文切换之前执行完整的功能。