MIT 6.S081 Lecture 11: Scheduling 1
Reading
- Read “Scheduling” through Section 7.4
- read code
Thread
-
thread - one serial execution 一个串行执行代码的单元,只占用一个cpu
-
一个线程区别于其他线程的地方是pc, regs, stack
-
interleave thread
- multi core
- switch
-
shared memory? -> Locks
- xv6 内核线程共享了内存
- xv6 用户进程不共享内存
- Linux 用户进程共享内存
-
其他的多任务解决方案
- 事件驱动编程
- 状态机
-
challenge
- switch - interleave 线程调度(scheduling)
- what to save / restore
- compute - bound 运算密集进程不肯让出cpu
- timer interrupts
- kernel handler
- yield - switch
- pre-emptive scheduling 抢占式调度
- voluntary scheduling 自愿调度
-
线程的state
- running 在运行
- runnable 等待被运行
- sleeping 由于系统调用在等待I/O设备等
Context Switch
-
简化的线程切换过程
- 其主要的设计在于,当要切换线程时,不在用户层直接切换,而在内核切换
-
完整的线程切换过程
- 每个用户线程对应一个内核线程
- 每个内核线程拥有一个context
- 每个cpu核心拥有一个调度器线程和保存在cpu结构体中的调度器context
- 用户线程p1由于timer interrupt或是系统调用等待I/O设备,其数据被保存在tf1中进入对应的内核线程k1
- 内核线程k1数据被保存在其对应的context并switch到调度器线程s0
- 调度器线程数据被保存在调度器context并跳到另一个runnable状态的内核线程k2
- 内核线程k2通过其对应的context恢复数据后执行c程序,该程序通过先前已经被保存的tf2恢复用户进程p2的数据,将运行的线程切换到p2
- context switch有不同含义,在本课中特指在内核空间中内核线程与调度器线程之间的切换
-
何为“数据”
- 在p1切换到k1的过程中,数据被保存在trapframe中,主要包括pc,32个通用寄存器和一些有关trap机制的寄存器
- 在k1切换到s0的过程中,数据被保存在context中,主要包括32个通用寄存器中的callee saved register。不保存pc的原因是在调用切换函数时,pc已经被更改了,没有保存pc的必要
MIT 6.S081 Lecture 11: Scheduling 1