无期限调度
什么是调度?
调度是计算机科学领域的另一个流行问题。调度问题是针对给定请求有效调度资源的问题。在操作系统中,通常计算机系统的单个处理器可能会遇到许多作业或用户程序。人们可以将调度问题可视化为作业的最佳排序,从而使作业周转时间最小化。简而言之,目标是以最佳顺序安排作业,以便更快地执行作业。
Let’s visualize scenario of scheduling :
In a library there is only one librarian who is assigned the issues for that day and there are several students who are in a queue to register their issues for books, so the librarian thought of a problem to make it a bit reordering that might help satisfying all students and reduces the issue time. so in this case what would be optimal order?
Obviously, the student with less number of books in the queue will take less time to an issue than the student with a larger number of books. It makes sense to process the student with less number of books, so as to minimize the collective waiting time of students.
没有截止日期的工作安排:
那么,什么是作业调度 没有截止日期?
- 调度问题的目标是调度任务以获得最大的总利润。
- 考虑调度的作业没有截止日期,即没有任何执行时间上限的作业。
- 这种作业调度旨在盈利,但没有任务的最后期限。
为了理解这个概念,让我们举个例子。
让我们假设连接到调度的作业没有截止日期,即作业没有任何执行时间上限。试图用贪婪的方法解决它;
让我们假设服务时间与以下三个任务相关联:
- t 1 =2
- t 2 =7
- t 3 =4
为了安排这些任务,让我们首先通过列出下表中所有可能的排序来找到最佳排序。由于有3个任务,所以可以在3个任务中排序!方式,等于 6。一般来说,对于 N 个作业,将有 N!可能的订单。
- 为了说明这一点,让我们采用组合之一,例如 [1, 2, 3]。如果先安排作业 1,则根据给定的问题,作业 1 需要 2 个时间单位。因为这是第一份工作,所以没有浪费时间。
- 在此期间,作业 2 必须等待,因为只有一个处理器。因此,作业 2 需要 2(等待时间)+ 7(处理时间),等于 9。直到此时,作业 3 必须等待。
- 作业 3 的等待时间为 ( 2 + 7 ),需要 4 个时间单位才能完成。因此,作业 3 在系统中花费的总时间是 9(等待时间),4 是(处理时间)。
Schedule | Total time in system | Average time |
---|---|---|
[1, 2, 3] | 2 + (2 + 7 ) + ( 2 + 7 + 4 ) = 24 | 8 |
[1, 3, 2] | 2 + (2 + 4 ) + ( 2 + 4 + 7 ) = 21 | 7 |
[2, 1, 3] | 7 + (7 + 2 ) + ( 7 + 2 + 4 ) = 29 | 9.6 |
[2, 3, 1] | 7 + (7 + 4 ) + ( 7 + 4 + 2 ) = 31 | 10.3 |
[3, 1, 2] | 4 + (4 + 2 ) + ( 4 + 2 + 7 ) = 23 | 7.9 |
[3, 2, 1] | 4 + (4 + 7 ) + ( 4 + 7 + 2 ) = 28 | 9.3 |
一个作业的平均时间是系统总时间除以作业数,即24/3=8。
其余作业的计算如上表所示。
- 可以观察到,系统中的最小总时间为 21,周转时间为 7。
- 这对应于顺序 [1, 3, 2]。因此,这是最佳顺序。
- 还可以注意到,任务是按照服务时间的升序排列的,即{2,4,7},由此说明了“最短作业优先调度”的原则,即最短的作业先调度,再调度较长的作业.
- 一旦确定了这个原则,贪婪算法就可以有效地编写了。
非正式地解决这个问题的贪心算法可以写成如下:
步骤 1 –按服务时间以非递减顺序对作业进行排序。
步骤 2 –安排排序后的作业列表的下一个作业。将其包含在解决方案集中。
步骤 3 –如果已排序作业列表的所有实例都已解决,则返回解决方案集。
形式化算法如下:
输入 –一个数组 J,包含一组作业 1 到 n 以及服务时间
输出——最佳时间表
Begin
S = {sorted array of jobs in J based on service time }
i = 1
Schedule = ∅
while (i < = n ) do //for all jobs do
select the next job i from S //Selection procedure selects from sorted list
solution = schedule U jobs i
i = i+1
End while
return(Solution)
End
- 该算法首先对作业进行排序,然后逐个贪婪地选择作业并将它们调度到服务器。
- 可以看出,由于不涉及截止日期,因此可以为服务器安排所有作业。
复杂性分析:
可以看出,上述调度算法的核心原理就是任务的排序。
排序的复杂度是 O(n log n) 时间。该调度算法的所有剩余任务只需要 O(n) 时间。
因此,调度算法的最终复杂度为max{n log n, n } = n log n time 。