《操作系统》的实验代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.9 KiB

  1. #lec10 进程/线程控制spoc练习
  2. ## SPOC小组思考题
  3. (1) (spoc)设计一个简化的进程管理子系统,可以管理并调度如下简化进程.给出了[参考代码](https://github.com/chyyuu/ucore_lab/blob/master/related_info/lab5/process-cpuio-homework.py),请理解代码,并完成"YOUR CODE"部分的内容. 可2个人一组
  4. ### 进程的状态
  5. ```
  6. - RUNNING - 进程正在使用CPU
  7. - READY - 进程可使用CPU
  8. - WAIT - 进程等待I/O完成
  9. - DONE - 进程结束
  10. ```
  11. ### 进程的行为
  12. ```
  13. - 使用CPU,
  14. - 发出YIELD请求,放弃使用CPU
  15. - 发出I/O操作请求,放弃使用CPU
  16. ```
  17. ### 进程调度
  18. - 使用FIFO/FCFS:先来先服务,
  19. - 先查找位于proc_info队列的curr_proc元素(当前进程)之后的进程(curr_proc+1..end)是否处于READY态,
  20. - 再查找位于proc_info队列的curr_proc元素(当前进程)之前的进程(begin..curr_proc-1)是否处于READY态
  21. - 如都没有,继续执行curr_proc直到结束
  22. ### 关键模拟变量
  23. - 进程控制块
  24. ```
  25. PROC_CODE = 'code_'
  26. PROC_PC = 'pc_'
  27. PROC_ID = 'pid_'
  28. PROC_STATE = 'proc_state_'
  29. ```
  30. - 当前进程 curr_proc
  31. - 进程列表:proc_info是就绪进程的队列(list),
  32. - 在命令行(如下所示)需要说明每进程的行为特征:(1)使用CPU ;(2)等待I/O
  33. ```
  34. -l PROCESS_LIST, --processlist= X1:Y1,X2:Y2,...
  35. X 是进程的执行指令数;
  36. Y是执行yield指令(进程放弃CPU,进入READY状态)的比例(0..100)
  37. Z是执行I/O请求指令(进程放弃CPU,进入WAIT状态)的比例(0..100)
  38. ```
  39. - 进程切换行为:系统决定何时(when)切换进程:进程结束或进程发出yield请求
  40. ### 进程执行
  41. ```
  42. instruction_to_execute = self.proc_info[self.curr_proc][PROC_CODE].pop(0)
  43. ```
  44. ### 关键函数
  45. - 系统执行过程:run
  46. - 执行状态切换函数: move_to_ready/running/done 
  47. - 调度函数:next_proc
  48. ### 执行实例
  49. #### 例1
  50. ```
  51. $./process-simulation.py -l 5:30:30,5:40:30 -c
  52. Produce a trace of what would happen when you run these processes:
  53. Process 0
  54. io
  55. io
  56. yld
  57. cpu
  58. yld
  59. Process 1
  60. yld
  61. io
  62. yld
  63. yld
  64. yld
  65. Important behaviors:
  66. System will switch when the current process is FINISHED or ISSUES AN YIELD or IO
  67. Time PID: 0 PID: 1 CPU IOs
  68. 1 RUN:io READY 1
  69. 2 WAITING RUN:yld 1 1
  70. 3 WAITING RUN:io 1 1
  71. 4 WAITING WAITING 2
  72. 5 WAITING WAITING 2
  73. 6* RUN:io WAITING 1 1
  74. 7 WAITING WAITING 2
  75. 8* WAITING RUN:yld 1 1
  76. 9 WAITING RUN:yld 1 1
  77. 10 WAITING RUN:yld 1 1
  78. 11* RUN:yld DONE 1
  79. 12 RUN:cpu DONE 1
  80. 13 RUN:yld DONE 1
  81. ```