MIT 6.S081 Lecture 11: Scheduling 1

Reading

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

http://huaeryi.com/2023/04/15/6-S081-Lecture-11/

作者

huayi

发布于

2023-04-15

更新于

2023-04-18

许可协议