PCB
系统通过PCB来控制管理进程,PCB是系统感知进程存在的唯一标志
记载信息
- 程序计数器:接着要运行的指令地址。
- 进程状态:可以是new、ready、running、waiting或 blocked等。
- CPU暂存器:如累加器、索引暂存器(Index register)、堆栈指针以及一般用途暂存器、状况代码等,主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类因电脑架构有所差异。
- CPU排班法:优先级、排班队列等指针以及其他参数。
- 存储器管理:如标签页表等。
- 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
- 输入输出状态:配置进程使用I/O设备,如磁带机。
组织方式
- 线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况。
- 索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。
- 链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。
上下文切换
概念
上下文切换,也就是从一个可执行进程切换到另一个可执行进程。
实现流程
- 将挂起的进程的CPU状态存储在进程的PCB内以及保存用户堆栈等信息。
- 在组织PCB的数据结构中检索下一个进程的PCB,接下来由定义在kernel/sched.c中的context_switch()函数负责处理。它完成了两项基本的工作:
- 调用switch_mm(),该函数负责把虚拟内存从上一个进程映射换到新进程中。
- 调用switch_to(),该函数负责从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息,还有其他任何与体系结构相关的状态信息,都必须以每个进程为对象进行管理和保存。
- 跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行)并恢复该进程。
引起上下文切换的原因
- cpu调度(正常调度、当前进程遇到I/O等阻塞操作、当前进程没抢到锁被挂起、用户代码自动挂起当前任务如sleep方法)
- 硬件中断
上下文切换开销
- 保存和恢复寄存器、堆栈信息。
- 更新进程页表以及更新内核相关数据结构。
为什么线程上下文切换开销更小
- 前后两个线程属于不同进程,此时资源不共享,所以切换时就跟进程上下文切换是一样的。
- 前后两个线程属于一个进程,虚拟内存共享,不会更新页表所以不会引起缺页异常,也不会刷新TLB。只切换线程的私有数据如栈和寄存器等信息。