当前位置: 首页 > news >正文

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)
http://www.jsqmd.com/news/178759/

相关文章:

  • 太原代写标书哪个更值得选择
  • YOLOFuse检测结果用于MATLAB数据分析:跨平台协作路径
  • YOLOFuse检测结果用于MATLAB数据分析:跨平台协作路径
  • YOLOFuse train_dual.py高级用法:调整学习率与batch size
  • FPGA应用开发和仿真【2.3】
  • 基于VOFA+的数据可视化操作指南
  • 三位3D视觉从业者的2025年终总结!
  • YOLOFuse直播演示预告:手把手教你运行第一个demo
  • 时钟分频电路设计详解:vhdl课程设计大作业系统学习
  • Multisim14.2安装后无法启动?Win10专项修复
  • framebuffer驱动中的显存管理机制详细解析
  • 一文说清理想二极管在多电源选择中的作用
  • es可视化管理工具助力精准数据检索实践
  • 微信4.0 hook,三端(mac,windows,安卓)都可用的可行性方案,附带frida脚本
  • YOLOFuse自动化脚本编写建议:批量推理与定时任务配置
  • YOLOFuse缉毒犬训练辅助:可疑物品藏匿点热成像提示
  • YOLOFuse自动驾驶感知层补充:恶劣天气目标识别
  • AI应用架构师实战分享:AI系统性能测试方案经验
  • YOLOFuse深海探测器视觉系统:黑暗环境目标识别
  • YOLOFuse新生儿保温箱监控:温度波动即时提醒
  • YOLOFuse适用于哪些场景?夜间监控、烟雾穿透、安防系统应用前景
  • 快速理解vivado使用教程核心要点:初学者必备知识
  • 安卓 audioservice 之 BtHelper
  • React Native 导航错误解析与解决方案
  • React Native 导航错误解析与解决方案
  • 使用调试器调试某UE4手游
  • 单精度浮点数转换误区:IEEE 754常见陷阱与规避策略
  • 从“概念炼金”到“价值落地”:AI时代企业咨询的防忽悠指南与务实之道
  • YOLOFuse体育馆赛事安保:人群冲撞风险预测
  • 深入理解UDS 31服务:ECU编程前的必备知识