进程调度 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

概述

runrun


  • 置runrun的时机
    • setpri 中 计算进程优先级 小于 现行进程 时置runrun
      这种情况很诡异,在下面单独说明
    • clock 中 每4秒 强制置runrun
    • setrun 唤醒进程优先级 高于 现行进程,置runrun
      (唤醒进程 比 现行进程更重要)

  • 关于 setpri中置runrun情况 的说明
    (不得不承认这种情况确实诡异)
    • 调用setpri的时机
      • trap(陷入) 末尾 调用setpri重算 现行进程优先数
      • clock 整秒处理中 先前态为用户态,重算 现行进程优先数
      • clock 整秒处理中 重算所有进程优先数
    • 对于 重算 现行进程优先数,可以理解为现行进程自谦,当现行进程优先级在降低,自主申请调度
    • 对于 重算 其他进程优先数,的确是突破了逻辑的极限,个人认为是setpri的错误(就是懒得再写一个setpri了),但是这种错误后果不是很严重,只是增加了调度的次数

0#进程

进程图像的交换策略

主要由 sched 完成

  • 找到盘交换区上 进程状态为SRUN 且 驻留时间最长 的进程(称为调入进程)
    • 若没找到,则睡眠在runout,唤醒后重新进行整个过程
    • 若找到,则
      • 若 能从内存分配足够的空间,则从 盘交换区 载入进程图像 到内存,重新进行整个过程
      • 若 不能从内存分配空间,则继续进行
  • 从内存 找到 状态为SWAIT或SSTOP 且 不含SYS或SLOCK标志 的进程(称为调出进程)
    • 若找到,则 将该进程 从内存 调出到 盘交换区,重新进行整个过程
    • 若找不到,则继续
  • 若 调入进程 的驻留时间小于3秒,则睡眠在runin,唤醒后重新进行整个过程;否则继续
  • 从内存 找到 状态为SRUN或SSLEEP 且 驻留时间最长 的进程(称为调出进程2)
    • 若找不到,则睡眠在runin,唤醒后重新进行整个过程
    • 若找到,则
      • 若 调出进程2 的驻留时间小于2秒,则睡眠在runin,唤醒后重新进行整个过程
      • 否则,继续
  • 将 调出进程2 从内存 调出到 盘交换区,重新进行整个过程

优先数计算

  • 公式:
  • 说明:
    • 1.p->pri 最大值限制127,因为它是char型的,变化范围为127 ~ -128
    • 2.PUSER定义在param.h的第160行,值为100
    • 3.p->nice可以被设置,对于一般用户的变化范围是0 ~ 20,对于超级用户的变化范围是 -128 ~ 20

创建子进程

⚠️ **GitHub.com Fallback** ⚠️