【问题标题】:operating system and concurrent threads操作系统和并发线程
【发布时间】:2013-11-01 23:18:06
【问题描述】:

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

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

考试后我得到的答案是:

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

但我无法理解。谁能解释清楚?

【问题讨论】:

    标签: operating-system


    【解决方案1】:

    在多处理器系统的情况下,例如,您有 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;
    

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

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

    【讨论】:

    • 谢谢,但是当我们使用非抢占式调度线程时,如何阻塞 T1 呢?
    • 非抢占意味着调度程序不能停止线程并让另一个线程工作。所以线程只能自愿阻塞。但是一个操作,比如从硬盘读取,也会阻塞线程。在等待请求完成时,另一个线程将起作用。
    最近更新 更多