本章又介绍了不同于前面章节的两种调度算法:彩票调度、步长调度(用于解决彩票调度不确性的问题)
本章作业需要下载书中提到的 lottery.py 文件,请移HomeWork
限于篇幅,只粘贴出了源程序的核心部分
理解源程序:
输入参数
parser.add_option('-s', '--seed', default=0, help='the random seed', action='store', type='int', dest='seed')
parser.add_option('-j', '--jobs', default=3, help='number of jobs in the system', action='store', type='int', dest='jobs')
parser.add_option('-l', '--jlist', default='', help='instead of random jobs, provide a comma-separated list of run times and ticket values (e.g., 10:100,20:100 would have two jobs with run-times of 10 and 20, each with 100 tickets)', action='store', type='string', dest='jlist')
parser.add_option('-m', '--maxlen', default=10, help='max length of job', action='store', type='int', dest='maxlen')
parser.add_option('-T', '--maxticket', default=100, help='maximum ticket value, if randomly assigned', action='store', type='int', dest='maxticket')
parser.add_option('-q', '--quantum', default=1, help='length of time slice', action='store', type='int', dest='quantum')
parser.add_option('-c', '--compute', help='compute answers for me', action='store_true', default=False, dest='solve')
- -s 是用于指定产生随机数的种子,默认为 0
- -j 指定任务的数量,默认为 3
- -l 代表一个任务列表(任务的运行时间:任务携带的票数),默认为空
- -m 指定任务的最大长度,默认为 10
- -T 指定每个任务最大携带的彩票数量,默认为 100
- -q 时间片的长度,默认为 1
- -c 指定是否计算彩票调度模拟解,默认为False
产生随机彩票数
r = int(random.random() * 1000001)
winner = int(r % tickTotal)
调度模拟
for (job, runtime, tickets) in joblist:
current += tickets
if current > winner:
(wjob, wrun, wtix) = (job, runtime, tickets)
break
遍历任务列表,查找当前随机数产生的彩票数量位于哪个区间,进而决定调度哪个任务执行
第一题
1.计算3个工作在随机种子为1、2和3时的模拟解。
执行 lottery.py -j 3 -s 1 -c True
>lottery.py -j 3 -s 1 -c True
ARG jlist
ARG jobs 3
ARG maxlen 10
ARG maxticket 100
ARG quantum 1
ARG seed 1
Here is the job list, with the run time of each job:
Job 0 ( length = 1, tickets = 84 )
Job 1 ( length = 7, tickets = 25 )
Job 2 ( length = 4, tickets = 44 )
** Solutions **
Random 651593 -> Winning ticket 119 (of 153) -> Run 2
Jobs:
( job:0 timeleft:1 tix:84 )
( job:1 timeleft:7 tix:25 )
(* job:2 timeleft:4 tix:44 )
Random 788724 -> Winning ticket 9 (of 153) -> Run 0
Jobs:
(* job:0 timeleft:1 tix:84 )
( job:1 timeleft:7 tix:25 )
( job:2 timeleft:3 tix:44 )
--> JOB 0 DONE at time 2
Random 93859 -> Winning ticket 19 (of 69) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:7 tix:25 )
( job:2 timeleft:3 tix:44 )
Random 28347 -> Winning ticket 57 (of 69) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:6 tix:25 )
(* job:2 timeleft:3 tix:44 )
Random 835765 -> Winning ticket 37 (of 69) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:6 tix:25 )
(* job:2 timeleft:2 tix:44 )
Random 432767 -> Winning ticket 68 (of 69) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:6 tix:25 )
(* job:2 timeleft:1 tix:44 )
--> JOB 2 DONE at time 6
Random 762280 -> Winning ticket 5 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:6 tix:25 )
( job:2 timeleft:0 tix:--- )
Random 2106 -> Winning ticket 6 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:5 tix:25 )
( job:2 timeleft:0 tix:--- )
Random 445387 -> Winning ticket 12 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:4 tix:25 )
( job:2 timeleft:0 tix:--- )
Random 721540 -> Winning ticket 15 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:3 tix:25 )
( job:2 timeleft:0 tix:--- )
Random 228762 -> Winning ticket 12 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:2 tix:25 )
( job:2 timeleft:0 tix:--- )
Random 945271 -> Winning ticket 21 (of 25) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:1 tix:25 )
( job:2 timeleft:0 tix:--- )
--> JOB 1 DONE at time 12
执行 lottery.py -j 3 -s 2 -c True
ARG jlist
ARG jobs 3
ARG maxlen 10
ARG maxticket 100
ARG quantum 1
ARG seed 2
Here is the job list, with the run time of each job:
Job 0 ( length = 9, tickets = 94 )
Job 1 ( length = 8, tickets = 73 )
Job 2 ( length = 6, tickets = 30 )
** Solutions **
Random 605944 -> Winning ticket 169 (of 197) -> Run 2
Jobs:
( job:0 timeleft:9 tix:94 )
( job:1 timeleft:8 tix:73 )
(* job:2 timeleft:6 tix:30 )
Random 606802 -> Winning ticket 42 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:9 tix:94 )
( job:1 timeleft:8 tix:73 )
( job:2 timeleft:5 tix:30 )
Random 581204 -> Winning ticket 54 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:8 tix:94 )
( job:1 timeleft:8 tix:73 )
( job:2 timeleft:5 tix:30 )
Random 158383 -> Winning ticket 192 (of 197) -> Run 2
Jobs:
( job:0 timeleft:7 tix:94 )
( job:1 timeleft:8 tix:73 )
(* job:2 timeleft:5 tix:30 )
Random 430670 -> Winning ticket 28 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:7 tix:94 )
( job:1 timeleft:8 tix:73 )
( job:2 timeleft:4 tix:30 )
Random 393532 -> Winning ticket 123 (of 197) -> Run 1
Jobs:
( job:0 timeleft:6 tix:94 )
(* job:1 timeleft:8 tix:73 )
( job:2 timeleft:4 tix:30 )
Random 723012 -> Winning ticket 22 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:6 tix:94 )
( job:1 timeleft:7 tix:73 )
( job:2 timeleft:4 tix:30 )
Random 994820 -> Winning ticket 167 (of 197) -> Run 2
Jobs:
( job:0 timeleft:5 tix:94 )
( job:1 timeleft:7 tix:73 )
(* job:2 timeleft:4 tix:30 )
Random 949396 -> Winning ticket 53 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:5 tix:94 )
( job:1 timeleft:7 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 544177 -> Winning ticket 63 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:4 tix:94 )
( job:1 timeleft:7 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 444854 -> Winning ticket 28 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:3 tix:94 )
( job:1 timeleft:7 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 268241 -> Winning ticket 124 (of 197) -> Run 1
Jobs:
( job:0 timeleft:2 tix:94 )
(* job:1 timeleft:7 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 35924 -> Winning ticket 70 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:2 tix:94 )
( job:1 timeleft:6 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 27444 -> Winning ticket 61 (of 197) -> Run 0
Jobs:
(* job:0 timeleft:1 tix:94 )
( job:1 timeleft:6 tix:73 )
( job:2 timeleft:3 tix:30 )
--> JOB 0 DONE at time 14
Random 464894 -> Winning ticket 55 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:6 tix:73 )
( job:2 timeleft:3 tix:30 )
Random 318465 -> Winning ticket 92 (of 103) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:5 tix:73 )
(* job:2 timeleft:3 tix:30 )
Random 380015 -> Winning ticket 48 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:5 tix:73 )
( job:2 timeleft:2 tix:30 )
Random 891790 -> Winning ticket 16 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:4 tix:73 )
( job:2 timeleft:2 tix:30 )
Random 525753 -> Winning ticket 41 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:3 tix:73 )
( job:2 timeleft:2 tix:30 )
Random 560510 -> Winning ticket 87 (of 103) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:2 tix:73 )
(* job:2 timeleft:2 tix:30 )
Random 236123 -> Winning ticket 47 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:2 tix:73 )
( job:2 timeleft:1 tix:30 )
Random 23858 -> Winning ticket 65 (of 103) -> Run 1
Jobs:
( job:0 timeleft:0 tix:--- )
(* job:1 timeleft:1 tix:73 )
( job:2 timeleft:1 tix:30 )
--> JOB 1 DONE at time 22
Random 325143 -> Winning ticket 3 (of 30) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:1 tix:30 )
--> JOB 2 DONE at time 23
执行 lottery.py -j 3 -s 3 -c True
ARG jlist
ARG jobs 3
ARG maxlen 10
ARG maxticket 100
ARG quantum 1
ARG seed 3
Here is the job list, with the run time of each job:
Job 0 ( length = 2, tickets = 54 )
Job 1 ( length = 3, tickets = 60 )
Job 2 ( length = 6, tickets = 6 )
** Solutions **
Random 13168 -> Winning ticket 88 (of 120) -> Run 1
Jobs:
( job:0 timeleft:2 tix:54 )
(* job:1 timeleft:3 tix:60 )
( job:2 timeleft:6 tix:6 )
Random 837469 -> Winning ticket 109 (of 120) -> Run 1
Jobs:
( job:0 timeleft:2 tix:54 )
(* job:1 timeleft:2 tix:60 )
( job:2 timeleft:6 tix:6 )
Random 259354 -> Winning ticket 34 (of 120) -> Run 0
Jobs:
(* job:0 timeleft:2 tix:54 )
( job:1 timeleft:1 tix:60 )
( job:2 timeleft:6 tix:6 )
Random 234331 -> Winning ticket 91 (of 120) -> Run 1
Jobs:
( job:0 timeleft:1 tix:54 )
(* job:1 timeleft:1 tix:60 )
( job:2 timeleft:6 tix:6 )
--> JOB 1 DONE at time 4
Random 995645 -> Winning ticket 5 (of 60) -> Run 0
Jobs:
(* job:0 timeleft:1 tix:54 )
( job:1 timeleft:0 tix:--- )
( job:2 timeleft:6 tix:6 )
--> JOB 0 DONE at time 5
Random 470263 -> Winning ticket 1 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:6 tix:6 )
Random 836462 -> Winning ticket 2 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:5 tix:6 )
Random 476353 -> Winning ticket 1 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:4 tix:6 )
Random 639068 -> Winning ticket 2 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:3 tix:6 )
Random 150616 -> Winning ticket 4 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:2 tix:6 )
Random 634861 -> Winning ticket 1 (of 6) -> Run 2
Jobs:
( job:0 timeleft:0 tix:--- )
( job:1 timeleft:0 tix:--- )
(* job:2 timeleft:1 tix:6 )
--> JOB 2 DONE at time 11
第二题
2.现在运行两个具体的工作:每个长度为10,但是一个(工作0)只有一张彩票,另一个(工作1)有100张(−l 10∶1,10∶100)。
运行lottery.py -j 2 -s 1 -l 10:1,10:100
ARG jlist 10:1,10:100
ARG jobs 2
ARG maxlen 10
ARG maxticket 100
ARG quantum 1
ARG seed 1
Here is the job list, with the run time of each job:
Job 0 ( length = 10, tickets = 1 )
Job 1 ( length = 10, tickets = 100 )
** Solutions **
Random 134364 -> Winning ticket 34 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:10 tix:100 )
Random 847434 -> Winning ticket 44 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:9 tix:100 )
Random 763775 -> Winning ticket 13 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:8 tix:100 )
Random 255069 -> Winning ticket 44 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:7 tix:100 )
Random 495435 -> Winning ticket 30 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:6 tix:100 )
Random 449491 -> Winning ticket 41 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:5 tix:100 )
Random 651593 -> Winning ticket 42 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:4 tix:100 )
Random 788724 -> Winning ticket 15 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:3 tix:100 )
Random 93859 -> Winning ticket 30 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:2 tix:100 )
Random 28347 -> Winning ticket 67 (of 101) -> Run 1
Jobs:
( job:0 timeleft:10 tix:1 )
(* job:1 timeleft:1 tix:100 )
--> JOB 1 DONE at time 10
Random 835765 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:10 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 432767 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:9 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 762280 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:8 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 2106 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:7 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 445387 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:6 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 721540 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:5 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 228762 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:4 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 945271 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:3 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 901428 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:2 tix:1 )
( job:1 timeleft:0 tix:--- )
Random 30590 -> Winning ticket 0 (of 1) -> Run 0
Jobs:
(* job:0 timeleft:1 tix:1 )
( job:1 timeleft:0 tix:--- )
--> JOB 0 DONE at time 20
彩票数量如此不平衡时会发生什么?在工作1完成之前,工作0是否会运行?多久?一般来说,这种彩票不平衡对彩票调度的行为有什么影响?
拥有彩票少的进程运行的概率很低,几乎在另一个进程结束之前都没有机会运行。
在工作1完成之前,工作0会运行,不过几率很低。
这种彩票不平衡的行为会使某些任务长期占用CPU,而只拿少数彩票的任务很难有机会运行。
第三题
3.如果运行两个长度为100的工作,都有100张彩票(−l 100∶100,100∶100),调度程序有多不公平?运行一些不同的随机种子来确定(概率上的)答案。不公平性取决于一项工作比另一项工作早完成多少。
这里我修改了一下程序,让种子从 0 到 1000递增,重复运行程序并记录每一次运行获得的不公平性,即两个任务的完成时间的差值的绝对值。
最终获得的平均值为 11.118
第四题
4.随着量子规模(-q)变大,你对上一个问题的答案如何改变?
随着q的增大,不公平性会增大,针对随机种子3,得到的平均值为 72.01
这个程序还有点小问题,当时间片为大于任务的执行长度时,即使该任务已经结束,时间片没有运行完也不会执行其他任务。
第五题
5.你可以制作类似本章中的图表吗?
产生随机数进行模拟即可,这里不贴代码了