进程调度及上下文切换

PCB

系统通过PCB来控制管理进程,PCB是系统感知进程存在的唯一标志

记载信息

  • 程序计数器:接着要运行的指令地址。
  • 进程状态:可以是new、ready、running、waiting或 blocked等。
  • CPU暂存器:如累加器、索引暂存器(Index register)、堆栈指针以及一般用途暂存器、状况代码等,主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类因电脑架构有所差异。
  • CPU排班法:优先级、排班队列等指针以及其他参数。
  • 存储器管理:如标签页表等。
  • 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
  • 输入输出状态:配置进程使用I/O设备,如磁带机。

组织方式

  • 线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况。
  • 索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。
  • 链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。

上下文切换

概念

上下文切换,也就是从一个可执行进程切换到另一个可执行进程。

实现流程

  1. 将挂起的进程的CPU状态存储在进程的PCB内以及保存用户堆栈等信息。
  2. 在组织PCB的数据结构中检索下一个进程的PCB,接下来由定义在kernel/sched.c中的context_switch()函数负责处理。它完成了两项基本的工作:
  • 调用switch_mm(),该函数负责把虚拟内存从上一个进程映射换到新进程中。
  • 调用switch_to(),该函数负责从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存、恢复栈信息和寄存器信息,还有其他任何与体系结构相关的状态信息,都必须以每个进程为对象进行管理和保存。
  1. 跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行)并恢复该进程。

引起上下文切换的原因

  1. cpu调度(正常调度、当前进程遇到I/O等阻塞操作、当前进程没抢到锁被挂起、用户代码自动挂起当前任务如sleep方法)
  2. 硬件中断

上下文切换开销

  1. 保存和恢复寄存器、堆栈信息。
  2. 更新进程页表以及更新内核相关数据结构。

为什么线程上下文切换开销更小

  1. 前后两个线程属于不同进程,此时资源不共享,所以切换时就跟进程上下文切换是一样的。
  2. 前后两个线程属于一个进程,虚拟内存共享,不会更新页表所以不会引起缺页异常,也不会刷新TLB。只切换线程的私有数据如栈和寄存器等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值