优先队列

时间:2011-10-07 15:08:03

标签: data-structures priority-queue

在阅读Data Structures And Algorithms中关于优先级队列的主题时,我遇到了以下段落......

  

一种可能的方式来支持短流程而不是锁定长流程   是给进程P优先100 t(used)-t(init)其中t(used)   是一个过程所花费的时间,而t(init)是一个过程所用的时间   从一些time 0开始测量的过程。请注意,100是一个   选择的魔数比稍大一些   我们希望一次活跃的流程数量。读者可以   如果我们总是选择具有最小优先级的进程,请注意   数字和混合中没有太多的短流程,然后在   从长远来看,一个没有快速完成的过程将获得1%   处理器的时间。

任何人都可以解释这个过程如何占用1%?如果你能用数学方法得出结果会很好。

1 个答案:

答案 0 :(得分:1)

当然,所以最初的流程都有负优先级值。它并不重要,只是它是负面的并且基于当前时间,但是表示了它。为简单起见,我们假设它只是一个整数值。

进程A以优先级0开始(假设我们在t = 0)。它执行10个时间单位,但尚未完成,因此需要排队等待以后继续处理。因此,优先级将基于公式

priority = priority + 100*(endtime - starttime)

priorityA = 0 + 100*(10-0)
priorityA = 1000

进程B的初始优先级在t = 5时初始化,因此为-5。它拥有队列中两个优先级中最低的一个,所以它也会得到一些时间。假设它也运行10个时间单位。完成后,B的优先级为:

priorityB = -5 + 100*(20-10)
priorityB = 995

所以它会再次排队等候。让我们假设它再次运行10个单位。按照它的时间片,它的新优先级将是:

priorityB = 995 + 100*(30-20)
priorityB = 1995

这样就可以在优先级队列中的A之后重新定位B. A然后运行,但这次只运行5个时间单位。它的新优先事项是:

priorityA = 1000 + 100*(35-30)
priorityA = 1500

进程A将再次位于队列的顶部并获得关注。假设它再次运行5个时间单位,它的新优先级是:

priorityA = 1500 + 100(40-35)
priorityA = 2000

将在进程B之后定位它,因此B将获得一些处理器时间。我们假设这次使用了5个时间单位。

priorityB = 1995 + 100(45-40)
priorityB = 2495

现在又来了。看看这两个过程如何有效地获得50%的处理器注意力?如果我们添加第三个长时间运行的过程("长时间运行"像A和B一样是"长时间运行"从某种意义上说他们没有运行10个单位然后完成,但更确切地说是重新排列),这些过程每个可能会占用处理器的大约33%的时间,因为每次运行并且没有完成,它的优先级调整为基础它运行了多长时间。在这种情况下,新进程始终首先运行,因为它们具有负优先级值,并且它们实际上最终具有更高(更低数值)的优先级 一阵子。然而,这不会永远持续下去 - 新流程将开始获得越来越大的优先级值。

但是,既然我们已经得到了,根据本书的例子所做的假设,任何时候都有大约100个进程在等待一些处理时间,而且假设也没有许多短暂运行的进程,通常会有大约100个进程争夺处理器注意力,因此每个进程将获得大约相同的时间,很快它们的相对数值优先级值将全部聚集在一起(意味着那里)与具有最高优先级的那个和具有最低优先级的那个在数字上没有太大差别)因此在" top"之后进程运行时,它会获得足够的优先级以将其推到底部(或靠近底部)。冲洗并重复,你基本上得到一个循环的事情,假设他们都使用大约相同的时间周围。在任何时候都有大约100个,所以再次假设存在很少的短暂运行过程,每个过程得到处理器注意力的1/100。