比较单处理器与多处理器的公平性

问题描述

保护命令循环结构

do
Condition ⇒ Command
...
Condition ⇒ Command
od

涉及非确定性选择,如文中所述。与潜在非终止非确定性计算相关的重要理论概念 是公平。如果一个循环无限重复,那么一个公平的非确定性选择必须 最终选择每个守卫为真的命令。例如在循环中

do
true ⇒ x := x+1
true ⇒ x := x-1
od

这两个命令都有始终为真的守卫。重复执行 x := x+1 而不执行 x := x-1 是不公平的。
大多数语言实现是 旨在提供公平性,通常通过提供有界形式。例如, 如果有 n 个受保护的命令,则实现可以保证 每个启用的命令将至少每 2n3n 次执行一次 通过循环。
因为数字 2n3n 取决于实现, 不过,程序员应该只假设每个带有 true 保护的命令 最终会被执行。

在单处理器语言实现上是否更容易提供公平性 还是在多处理器上?

解决方法

大多数语言都有一个串行执行模型,如机器代码,不是以任意执行比率并行执行每个语句。例如在 C 中,

  for (int i=0; i<10 ; i++){
     if (true) puts("hello");
     if (true) puts("world");
  }

你总是会得到类似的输出

hello
world
hello
world

按那个顺序。


公平(或至少非饥饿)线程级并行在单核或多核机器上非常容易,具有先发制人的多任务处理。大多数具有线程模型的语言都是围绕抢占式线程调度设计的,其中一个线程运行无限循环(即使没有系统调用)也不会饿死其他线程。

多核更难实现正确的操作系统(例如,您需要锁定,而不仅仅是禁用中断),但确实允许同时运行更多线程。