Skip to content

Latest commit

 

History

History
229 lines (147 loc) · 5.69 KB

05-1-spoc-discussion.md

File metadata and controls

229 lines (147 loc) · 5.69 KB

#lec11: 进程/线程概念spoc练习

视频相关思考题

11.1 进程的概念

  1. 什么是程序?什么是进程?

  2. 进程有哪些组成部分?

  3. 请举例说明进程的独立性和制约性的含义。

  4. 程序和进程联系和区别是什么?

11.2 进程控制块

  1. 进程控制块的功能是什么?

  2. 进程控制块中包括什么信息?

  3. ucore的进展控制块数据结构定义中哪些字段?有什么作用?

11.3 进程状态

  1. 进程生命周期中的相关事件有些什么?它们对应的进程状态变化是什么?

11.4 三状态进程模型

  1. 运行、就绪和等待三种状态的含义?7个状态转换事件的触发条件是什么?

11.5 挂起进程模型

  1. 引入挂起状态的目的是什么?

  2. 引入挂起状态后,状态转换事件和触发条件有什么变化?

  3. 内存中的什么内容放到外存中,就算是挂起状态?

11.6 线程的概念

  1. 引入线程的目的是什么?

  2. 什么是线程?

  3. 进程与线程的联系和区别是什么?

11.7 用户线程

  1. 什么是用户线程?

  2. 用户线程的线程控制块保存在用户地址空间还是在内核地址空间?

11.8 内核线程

  1. 用户线程与内核线程的区别是什么?

  2. 同一进程内的不同线程可以共用一个相同的内核栈吗?

  3. 同一进程内的不同线程可以共用一个相同的用户栈吗?

选做题

  1. 请尝试描述用户线程堆栈的可能维护方法。

小组思考题

(1) 熟悉和理解下面的简化进程管理系统中的进程状态变化情况。

(2) (spoc)设计一个简化的进程管理子系统,可以管理并调度如下简化进程。在理解参考代码的基础上,完成"YOUR CODE"部分的内容。然后通过测试用例和比较自己的实现与往届同学的结果,评价自己的实现是否正确。可2个人一组。

进程的状态

  • RUNNING - 进程正在使用CPU
  • READY - 进程可使用CPU
  • DONE - 进程结束

进程的行为

  • 使用CPU,
  • 发出YIELD请求,放弃使用CPU

进程调度

  • 使用FIFO/FCFS:先来先服务,
    • 先查找位于proc_info队列的curr_proc元素(当前进程)之后的进程(curr_proc+1..end)是否处于READY态,
    • 再查找位于proc_info队列的curr_proc元素(当前进程)之前的进程(begin..curr_proc-1)是否处于READY态
    • 如都没有,继续执行curr_proc直到结束

关键模拟变量

  • 进程控制块
PROC_CODE = 'code_'
PROC_PC = 'pc_'
PROC_ID = 'pid_'
PROC_STATE = 'proc_state_'
  • 当前进程 curr_proc
  • 进程列表:proc_info是就绪进程的队列(list),
  • 在命令行(如下所示)需要说明每进程的行为特征:(1)使用CPU ;(2)等待I/O
   -l PROCESS_LIST, --processlist= X1:Y1,X2:Y2,...
   X 是进程的执行指令数; 
   Y是执行CPU的比例(0..100) ,如果是100,表示不会发出yield操作
  • 进程切换行为:系统决定何时(when)切换进程:进程结束或进程发出yield请求

进程执行

instruction_to_execute = self.proc_info[self.curr_proc][PROC_CODE].pop(0)

关键函数

  • 系统执行过程:run
  • 执行状态切换函数: move_to_ready/running/done 
  • 调度函数:next_proc

执行实例

例1

$./process-simulation.py -l 5:50
Process 0
  yld
  yld
  cpu
  cpu
  yld

Important behaviors:
  System will switch when the current process is FINISHED or ISSUES AN YIELD
Time     PID: 0 
  1     RUN:yld 
  2     RUN:yld 
  3     RUN:cpu 
  4     RUN:cpu 
  5     RUN:yld 

例2

$./process-simulation.py  -l 5:50,5:50
Produce a trace of what would happen when you run these processes:
Process 0
  yld
  yld
  cpu
  cpu
  yld

Process 1
  cpu
  yld
  cpu
  cpu
  yld

Important behaviors:
  System will switch when the current process is FINISHED or ISSUES AN YIELD
Time     PID: 0     PID: 1 
  1     RUN:yld      READY 
  2       READY    RUN:cpu 
  3       READY    RUN:yld 
  4     RUN:yld      READY 
  5       READY    RUN:cpu 
  6       READY    RUN:cpu 
  7       READY    RUN:yld 
  8     RUN:cpu      READY 
  9     RUN:cpu      READY 
 10     RUN:yld      READY 
 11     RUNNING       DONE 

问答题

Q1:[基础] 如何看到你正在使用的操作系统里的进程

A:

Q2:[基础] 简单描述一下进程地址空间都有哪些数据和代码

A:

Q3:[基础,开放] 进程控制块可能保存哪些内容

A:

Q4:[基础] 考虑三状态进程模型下,空闲的 Web 服务器、Sleep啥也不干型和计算密集型程序一般来说分别在什么阶段停留的时间长(不考虑退出后的时间)

A:

Q5:[进阶] 主流操作系统系统中用于存储处于挂起状态的进程镜像的地方是什么

A:

Q6:[进阶,开放] 操作系统怎么判断是否应该挂起一个程序

A:

Q7:[基础] 线程和进程的区别

A:

Q8:[基础,进阶] 用户线程和内核线程的关系和区别

A:

Q9:[开放] 你都了解哪些侧信道攻击和对应的解决方案

A:

Q10:在等待 I/O 的时候,从运行状态转换到等待状态,相比在程序中直接循环等待 I/O 结束有什么优缺点?

A:

Q11:不同的用户线程是否使用相同的内核栈?使用用户线程的效率是否更高?

A: