《操作系统导论》第九章 调度:比例份额 课后习题

本章又介绍了不同于前面章节的两种调度算法:彩票调度步长调度(用于解决彩票调度不确性的问题)

本章作业需要下载书中提到的 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.你可以制作类似本章中的图表吗?

产生随机数进行模拟即可,这里不贴代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值