当前位置:   article > 正文

操作系统实验一:处理器调度算法的实现

处理机调度算法实现 实验报告道客巴巴

操作系统实验一:处理器管理

实验报告

一、实验目的

1)加深对处理机调度的作用和工作原理的理解。

2)进一步认识并发执行的实质。

 

二、实验要求:

本实验要求用高级语言,模拟在单处理器情况下,采用多个调度算法,对N个进程进行进程调度。语言自选。

并完成实验报告。

  

三、实验内容:

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪状态进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

  1. 进程及进程队列的表示。
  2. 处理器调度算法:FCFS,SJF,RR
  3. 跟踪进程状态的转化
  4. 输出:系统中进程的调度次序,计算CPU利用率,平均周转时间和平均带权周转时间

四、实验过程与结果

  1. 算法思想与设计
  2. 算法实现代码
  3. 运行结果

 

  1. FCFS:

1.1算法思想:先到达系统的作业拥有优先执行的权利,无论此作业的执行时间长短,执行完成后输出它的相关信息。

1.2算法设计:

 

2.算法实现代码

  1. import psutil
  2. import os
  3. #先来先服务
  4. class Process:
  5. def __init__(self,name,arrive_time,serve_time):
  6. self.name=name
  7. self.arrive_time=arrive_time
  8. self.serve_time=serve_time
  9. self.left_serve_time=serve_time
  10. self.finish_time=0
  11. self.cycling_time=0
  12. self.w_cycling_time=0
  13. process_list=[]
  14. processA=Process('A',0,4)
  15. processB=Process('B',2,4)
  16. processC=Process('C',5,4)
  17. processD=Process('D',9,4)
  18. process_list.append(processA)
  19. process_list.append(processB)
  20. process_list.append(processC)
  21. process_list.append(processD)
  22. for p in process_list:
  23. print(p.name,p.arrive_time,p.serve_time)
  24. process_list.sort(key=lambda x:x.arrive_time)
  25. for p in process_list:
  26. print(p.name,p.arrive_time,p.serve_time,p.left_serve_time,\
  27. p.finish_time,p.cycling_time,p.w_cycling_time)
  28. index = int(0)
  29. running_time=int(0)
  30. pf =[]
  31. while len(process_list)>0:
  32. p = process_list[index]
  33. if p.arrive_time>running_time:
  34. running_time=p.arrive_time
  35. running_time +=p.serve_time
  36. else:
  37. print(p.name,p.left_serve_time)
  38. running_time +=p.left_serve_time
  39. p.left_serve_time=0
  40. p.finish_time=running_time
  41. p.cycling_time=p.finish_time-p.arrive_time
  42. p.w_cycling_time=p.cycling_time/p.serve_time
  43. print('--',p.name,p.arrive_time,p.serve_time,p.left_serve_time,\
  44. p.finish_time,p.cycling_time,p.w_cycling_time)
  45. pf.append(p)
  46. process_list.remove(p)
  47. index-=1
  48. index+=1
  49. if index>=len(process_list):
  50. index=0

3.运行结果

 

2.JSF:

  1. 算法思想与设计 1.1算法思想:当作业的到达时间大于或者等于系统的运行时间时,比较出所需执行时间最短的作业,优先执行它;当只有一个作业到达系统时,其他作业还未来到,则不管此作业的长短都先执行它。
  1. 1.2算法设计:

2.算法实现代码

 

3.运行结果

 

3.RR:

1.算法思想及设计:

    1.1算法思想:

  • CPU时间划分为时间片,例如100ms
  • 时间片调度:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度

     1.2算法设计:

Ø进程排序

Ø队列不为空时循环:

Ø到达?

Ø剩余服务时间>时间片

Ø运行时间

Ø剩余服务时间

Ø剩余服务时间<=时间片

Ø运行时间

Ø剩余服务时间、完成时间、周转时间、加权周转时间

Ø保存

Ø从队列删除进程

 

2.算法实现代码:

  1. import psutil
  2. import os
  3. #RR
  4. class Process:
  5. def __init__(self,name,arrive_time,serve_time):
  6. self.name=name
  7. self.arrive_time=arrive_time
  8. self.serve_time=serve_time
  9. self.left_serve_time=serve_time
  10. self.finish_time=0
  11. self.cycling_time=0
  12. self.w_cycling_time=0
  13. process_list=[]
  14. processA=Process('A',0,4)
  15. processB=Process('B',2,4)
  16. processC=Process('C',5,4)
  17. processD=Process('D',9,4)
  18. process_list.append(processA)
  19. process_list.append(processB)
  20. process_list.append(processC)
  21. process_list.append(processD)
  22. for p in process_list:
  23. print(p.name,p.arrive_time,p.serve_time)
  24. process_list.sort(key=lambda x:x.arrive_time)
  25. for p in process_list:
  26. print(p.name,p.arrive_time,p.serve_time,p.left_serve_time,\
  27. p.finish_time,p.cycling_time,p.w_cycling_time)
  28. index = int(0)
  29. running_time=int(0)
  30. q =2
  31. pf =[]
  32. while len(process_list)>0:
  33. p = process_list[index]
  34. if p.arrive_time>running_time:
  35. running_time=p.arrive_time
  36. if p.left_serve_time>q:
  37. print(p.name,q)
  38. running_time +=q
  39. p.left_serve_time-=q
  40. else:
  41. print(p.name,p.left_serve_time)
  42. running_time +=p.left_serve_time
  43. p.left_serve_time=0
  44. p.finish_time=running_time
  45. p.cycling_time=p.finish_time-p.arrive_time
  46. p.w_cycling_time=p.cycling_time/p.serve_time
  47. print('--',p.name,p.arrive_time,p.serve_time,p.left_serve_time,\
  48. p.finish_time,p.cycling_time,p.w_cycling_time)
  49. pf.append(p)
  50. process_list.remove(p)
  51. index-=1
  52. index+=1
  53. if index>=len(process_list):
  54. index=0

  3.运行结果:

 

4.MLFQ

  1. class Process:
  2. def __init__(self, name, arrive_time, serve_time):
  3. self.name = name # 进程名
  4. self.arrive_time = arrive_time # 到达时间
  5. self.serve_time = serve_time # 需要服务时间
  6. self.left_serve_time = serve_time # 剩余需要服务时间
  7. self.finish_time = 0 # 完成时间
  8. self.cycling_time = 0 # 周转时间
  9. self.w_cycling_time = 0 # 带权周转时间
  10. class RR:
  11. def __init__(self, process_list, q):
  12. self.process_list = process_list
  13. self.q = q
  14. def scheduling(self):
  15. process_list = self.process_list
  16. process_list.sort(key=lambda x: x.arrive_time)
  17. pf = []
  18. q = self.q
  19. index = int(0)
  20. running_time = int(0)
  21. while len(process_list) > 0:
  22. p = process_list[index]
  23. if p.arrive_time > running_time:
  24. running_time = p.arrive_time
  25. if p.left_serve_time > q:
  26. print(p.name, q)
  27. running_time += q
  28. p.left_serve_time -= q
  29. else:
  30. print(p.name, p.left_serve_time)
  31. running_time += p.left_serve_time
  32. p.left_serve_time = 0
  33. p.finish_time = running_time
  34. p.cycling_time = p.finish_time - p.arrive_time
  35. p.w_cycling_time = p.cycling_time / p.serve_time
  36. print('--', p.name, p.arrive_time, p.serve_time, p.left_serve_time, p.finish_time, p.cycling_time,
  37. p.w_cycling_time)
  38. pf.append(p)
  39. process_list.remove(p)
  40. index -= 1
  41. index += 1
  42. if index >= len(process_list):
  43. index = 0
  44. return pf
  45. # 定义队列类
  46. class Queue:
  47. def __init__(self, level, process_list, q):
  48. self.level = level
  49. self.process_list = process_list
  50. self.q = q
  51. def size(self):
  52. return len(self.process_list)
  53. def get(self, index):
  54. return self.process_list[index]
  55. def add(self, process):
  56. self.process_list.append(process)
  57. def delete(self, index):
  58. self.process_list.remove(self.process_list[index])
  59. class MulitlevedFeesbackQueue():
  60. def __init__(self, queue_list):
  61. self.queue_list=queue_list
  62. def scheduling(self):
  63. q_list = self.queue_list
  64. for i in range(len(q_list)):
  65. if i==len(q_list)-1:
  66. print("=======对最后一个队列执行RR算法=====")
  67. #最后一个队列重新设置到达时间
  68. for t in range(len(q_list[i].process_list)):
  69. q_list[i].process_list[t].arrive_time = t
  70. rr_last_queue = RR(q_list[i].process_list, q_list[i].q)
  71. rr_last_queue.scheduling()
  72. else:
  73. currentQueue = q_list[i]
  74. index=int(0)
  75. while(True):
  76. if currentQueue.get(index).left_serve_time>q_list[i].q:
  77. currentQueue.get(index).left_serve_time-=q_list[i].q
  78. print("第%d队列时间片:%d"%(i,q_list[i].q))
  79. print("进程没有执行完毕,需要添加至下一队列末尾:进程名称:%s" % (currentQueue.get(index).name))
  80. q_list[i+1].add(currentQueue.get(index))
  81. index+=1
  82. else:
  83. print('服务时间并弹出:',currentQueue.get(index).name)
  84. currentQueue.get(index).left_serve_time=0
  85. currentQueue.delete(index)
  86. if index==currentQueue.size():
  87. break
  88. processA=Process('A',0,16)
  89. processB=Process('B',1,3)
  90. processC=Process('C',2,4)
  91. processD=Process('D',3,2)
  92. processE=Process('E',4,4)
  93. process_list0,process_list1,process_list2=[],[],[]
  94. process_list0.append(processA)
  95. process_list0.append(processB)
  96. process_list1.append(processC)
  97. process_list1.append(processD)
  98. process_list2.append(processE)
  99. queue0=Queue(0,process_list0,2)
  100. queue1=Queue(1,process_list1,4)
  101. queue2=Queue(2,process_list2,8)
  102. queue_list=[]
  103. queue_list.append(queue0)
  104. queue_list.append(queue1)
  105. queue_list.append(queue2)
  106. for i in range(3):
  107. print(queue_list[i].level,queue_list[i].process_list,queue_list[i].q)
  108. mlfq=MulitlevedFeesbackQueue(queue_list)
  109. mlfq.scheduling()

  

转载于:https://www.cnblogs.com/CKZ201706110006/p/10703025.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/151194
推荐阅读
相关标签
  

闽ICP备14008679号