news 2026/6/15 18:48:30

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/6/15 18:48:54

YOLOFuse预训练权重下载链接汇总:官方与镜像站点对照表

YOLOFuse预训练权重下载链接汇总:官方与镜像站点对照表 在智能安防、自动驾驶和工业巡检等现实场景中,单一可见光摄像头常常“力不从心”——夜晚看不清、烟雾里漏检、强光下过曝。这些问题催生了多模态感知技术的快速发展,尤其是RGB-红外双流…

作者头像 李华
网站建设 2026/6/15 15:58:34

YOLOFuse在百度云盘中的分享链接整理:直链下载提速技巧

YOLOFuse:多模态目标检测的“开箱即用”实践之路 在低光照、烟雾弥漫或强逆光等恶劣环境下,传统基于可见光的目标检测模型常常“失明”。行人轮廓模糊、车辆细节丢失、小目标难以捕捉——这些问题困扰着安防、巡检和自动驾驶领域的工程师。而与此同时&a…

作者头像 李华
网站建设 2026/6/15 13:53:55

YOLOFuse如何更新到最新版?Git pull同步代码最佳实践

YOLOFuse 如何安全高效地更新到最新版?Git 同步实战指南 在多模态感知技术飞速发展的今天,RGB-IR 双流目标检测已成为安防监控、自动驾驶和夜间巡检等场景中的关键技术。YOLOFuse 作为基于 Ultralytics YOLO 构建的开源融合检测框架,凭借其高…

作者头像 李华
网站建设 2026/6/15 0:48:18

YOLOFuse社区活跃度观察:GitHub Star增长趋势分析

YOLOFuse社区活跃度观察:GitHub Star增长趋势分析 在智能安防、夜间监控和自动驾驶感知系统中,一个老生常谈的问题始终困扰着开发者:当光照条件急剧恶化时,传统视觉模型的检测性能为何会断崖式下跌? 答案显而易见——R…

作者头像 李华
网站建设 2026/6/15 16:30:14

es可视化管理工具助力精准数据检索实践

用好ES可视化工具,让数据检索像查快递一样简单你有没有过这样的经历?系统突然报警,日志炸了屏,几十台服务器的输出堆在终端里,而你要从百万行记录中找出那个致命的error——靠grep和tail -f硬扛,眼睛快瞎了…

作者头像 李华
网站建设 2026/6/15 0:26:35

单精度浮点数转换误区:IEEE 754常见陷阱与规避策略

单精度浮点数转换的“隐形坑”:从 IEEE 754 看懂那些年我们踩过的数值陷阱你有没有遇到过这样的情况?明明写的是0.1 0.2,结果却死活不等于0.3?一个整数16777217转成float后莫名其妙变成了16777216?循环加0.1f到1.0f&a…

作者头像 李华