news 2026/4/25 10:55:17

xv6 进程调度

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
xv6 进程调度

进程调度

1、概念

对于xv6操作系统,他是一个8核cpu,一个核心严格意义上在一个时间点上只能执行一个进程,一个8核的cpu严格意义上可以同时执行8个进程。那么为什么会有一个单核cpu同时执行多个进程的说法呢?实际上是cpu的进程调度机制,cpu规定一个进程不能一直执行下去,某个进程执行一段时间之后,会被暂停被迫让出cpu供其他进程运行,等到其他进程也执行相应的时间后该进程才有机会再次被执行。正是这种轮询的进程调度机制,给人一种单核cpu能同时运行多个进程的感觉。

2、进程调度分析

  • 整体流程:

    ①、每个cpu核心在mian.c完成初始化后都会进入scheduler函数进行进程调度,scheduler()函数是一个死循环会一直寻找处于就绪态的进程来执行。

    ②、当有一个新进程被调度的时候,scheduler中的swtch会先把scheduler的上下文存放到当前cpu的结构体contest中,然后切换上下文去调度新进程。

    ③、进程开始执行一段时间,cpu的时间片到了,触发定时器中断,进程进入trap执行yield,保存当前进程的上下文**并切换上下文去执行mian.c里的scheduler,scheduler再次调度新的进程。**实现进程的循环调度。

    ④、当一个进程到达生命周期后,会执行exec这个系统调用,它最终也会切回scheduler。

注意:cpu的时间片到达之后,cpu会默认切换回mian.c里面的scheduler,接下来要调度哪个进程都是由scheduler决定的!

  • 实现细节分析:

(1)、每一个cpu都有一个结构体用来存储cpu状态信息

// Per-CPU state.structcpu{structproc*proc;// The process running on this cpu, or null.structcontextcontext;// swtch() here to enter scheduler().intnoff;// Depth of push_off() nesting.intintena;// 记录中断被关闭之前,中断的状态};

struct proc *proc:表示当前cpu核所运行的进程

struct context context:当前cpu的上下文,这个属性是固定不变的,上下文信息其实就是scheduler()函数的上下文

(2)、swtch(struct context*, struct context*)分析:

主要是用来保存进程执行上下文的,并用于进程切换。用scheduler()里面调用的函数swtch(&c->context, &p->context);为例

它在每次调度之前都会把scheduler的上下文保存到cpu结构体的contest里去

# Context switch # # void swtch(struct context *old, struct context *new); # # Save current registers in old. Load from new. #swtch(&c->context, &p->context); .globl swtch swtch: sd ra, 0(a0) #将ra寄存器保存到a0,a0存储的是switch的第一个参数c->context sd sp, 8(a0) sd s0, 16(a0) sd s1, 24(a0) sd s2, 32(a0) sd s3, 40(a0) sd s4, 48(a0) sd s5, 56(a0) sd s6, 64(a0) sd s7, 72(a0) sd s8, 80(a0) sd s9, 88(a0) sd s10, 96(a0) sd s11, 104(a0) #到这一步就是将scheduler的现场保存到了c->context !!! #将要执行的进程的上下文写入寄存器 ld ra, 0(a1) #ra里写了新进程p的返回地址 ld sp, 8(a1) ld s0, 16(a1) ld s1, 24(a1) ld s2, 32(a1) ld s3, 40(a1) ld s4, 48(a1) ld s5, 56(a1) ld s6, 64(a1) ld s7, 72(a1) ld s8, 80(a1) ld s9, 88(a1) ld s10, 96(a1)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 12:21:25

YOLOFuse轻量化版本开发中:面向嵌入式设备裁剪模型

YOLOFuse轻量化版本开发中:面向嵌入式设备裁剪模型 在智能安防、自动驾驶和工业检测等场景日益复杂的今天,单一视觉模态的局限性正变得越来越明显。尤其是在夜间、烟雾或强光干扰环境下,仅依赖RGB图像的目标检测系统常常“失明”——行人轮廓…

作者头像 李华
网站建设 2026/4/24 19:55:21

Multisim14.2安装后无法启动?Win10专项修复

Multisim 14.2在Win10上点开没反应?别急,一文搞定启动难题 你是不是也遇到过这种情况:好不容易按照网上的 multisim14.2安装教程 走完流程,结果双击图标—— 毫无反应、闪退、弹窗报错“0xc000007b” ?尤其在新装…

作者头像 李华
网站建设 2026/4/20 7:11:15

YOLOFuse项目根目录结构解析:train_dual.py与infer_dual.py使用说明

YOLOFuse项目根目录结构解析:train_dual.py与infer_dual.py使用说明 在智能安防、自动驾驶和夜间监控等现实场景中,单一可见光摄像头在低光照、烟雾或恶劣天气下常常“失明”。你是否曾遇到过这样的问题:白天表现良好的目标检测模型&#xff…

作者头像 李华
网站建设 2026/4/24 13:45:55

自动驾驶决策控制仿真:系统学习核心模型构建

自动驾驶决策控制仿真:从零构建高保真闭环系统你有没有遇到过这样的困境?算法在仿真里跑得完美无缺,实车一上路却频频“翻车”——变道失败、轨迹抖动、紧急制动……背后的原因往往不是代码写错了,而是仿真的世界太“理想化”了。…

作者头像 李华
网站建设 2026/4/23 15:14:18

YOLOFuse打鼾与呼吸暂停检测:健康风险早期提示

YOLOFuse打鼾与呼吸暂停检测:健康风险早期提示 在深夜的卧室里,一个人正安静地躺着——看起来一切正常。但如果你能“看见”他的呼吸节律,或许会发现异常:胸腹长达十秒没有起伏,血氧可能正在悄然下降。这样的场景每天在…

作者头像 李华