在同时执行多个进程的过程中,临界区中语句的执行顺序可能会影响临界区中值的最终状态。这只不过是一种竞争条件,会导致代码中的不一致。这些在互斥的帮助下被删除,但可能仍然有其他进程因此而饥饿的机会。当这种饥饿无限延伸时,就会导致僵局。
因此,单独的互斥不能保证进程的同时执行没有任何问题——需要称为进度的第二个条件来确保在此类执行期间不会发生死锁。
Galvin 对进步的正式定义如下:
“If no process is executing in its critical section and some processes wish to enter their critical sections, then only those processes that are not executing in their remainder section can participate in deciding which will enter its critical section next, and this selection cannot be postponed indefinitely.”
这是一次需要考虑的很多东西,所以让我们用一个例子来看看我们的陈述有多有效。假设在百货公司的服装区,男孩 A 和女孩 B 想使用更衣室。
男孩A决定先使用更衣室,但无法决定带多少衣服进去。结果,即使更衣室是空的,女孩B(决定试穿多少衣服)也无法进入更衣室,因为她被男孩A挡住了。
换句话说,男孩 A 阻止女孩 B 使用更衣室,即使他不需要使用它。这就是进步的概念是为了防止。
根据进度的主要定义,唯一可以参与决定谁可以进入临界区的进程是那些即将进入临界区或在进入临界区之前正在执行某些代码的进程。处于其提醒部分(临界区之后的部分)中的进程不允许参与此决策过程。
进度的主要工作是确保一个进程在任何时间点都在临界区执行(以便处理器始终执行某些工作)。这个决定不能“无限期推迟”——换句话说,应该花有限的时间来选择应该允许哪个进程进入临界区。如果不能在有限的时间内做出这个决定,就会导致死锁。