操作系统和并发线程

时间:2013-11-01 23:18:06

标签: operating-system

我参加了考试,我在考试中遇到了这个问题:

对于下面的每个陈述,用一句话表明陈述是否是 是真还是假,为什么。 •在提供非抢占式调度线程的并发编程环境中(即, 没有非自愿的上下文切换),不需要互斥同步。

考试结束后我得到了答案:

[假。在多处理器上仍然需要互斥同步(1),以及(2)在单处理器上 对于包含阻塞操作的关键部分。]

但我不能忍受它。任何人都可以清楚地解释清楚吗?

1 个答案:

答案 0 :(得分:2)

如果是多处理器系统,您可以同时运行2个任务并共享变量s:

s = 1;
T1 reads s1 = 1;
T2 reads s2 = 1;
T1 increments s1: s1 = 2;
T2 increments s2: s2 = 2;
T1 writes s: s = s1 = 2;
T2 writes s: s = s2 = 2;

但是现在s应该是3,因为两个任务增加了一个。为了防止这种情况,您必须确保在另一个任务读取变量之前读取,操作和写入变量。

在单处理器系统上,可能会发生同样的情况:

T1 reads s;
T1 blocks on an operation;
T2 runs and reads s;
T2 blocks on an operation;
T1 manipulates and writes;
T2 manipulates and writes;

被操纵了两次,但结果只显示了对T2的操纵。

如果只更改单个变量,则可以使用原子操作。但是,如果您的关键部分较大,则必须使用互斥锁来保护它。