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

进程的调度

在linux2.6内核中,每一个cpu都有一个运行队列,即内核变量struct runqueue,并且每个cpu都有一个全局变量struct task_struct*,用来保存cpu正在运行的进程是谁

进程的优先级设计

实时进程没有nice值的概念,优先级0~99,普通进程有nice值,通过nice值来影射优先级,nice为-20映射优先级100,nice值为19,映射优先级139

共计140个优先级,0~139

运行队列的设计

活动队列

1.nr_active: 时间片未耗尽的进程的个数
2.queue[140]: 数组下标就是优先级,queue的每个元素是pcb指针,struct task_struct挂在不同节点下,就有了不同优先级
从该结构中,选择⼀个最合适的进程,过程是怎么的呢?
1. 从0下标开始遍历queue[140]
2. 找到第⼀个⾮空队列,该队列必定为优先级最⾼的队列
3. 拿到选中元素的第⼀个进程,将其从活跃队列去除,然后开始执行
bitmap[5]:⼀共140个优先级,⼀共140个进程队列,为了提⾼查找⾮空队列的效率,就可以⽤
5*32个⽐特位表⽰队列是否为空,这样,便可以提⾼查找效率!

过期队列

1.  过期队列和活动队列结构⼀模⼀样
2.过期队列上都是时间⽚耗尽的进程
3.当活动队列上的进程都被处理完毕之后,对过期队列的进程进⾏时间⽚重新计算,然后交换两个队列的指针

运行队列里有两个指针,分别指向活跃队列和过期队列

进程调度过程

一个进程里保存了运行的时间片,还有所有的寄存器。cpu依靠时钟源的时钟周期(ns)来运行进程的指令,靠时钟源的时钟中断(ms)来更新进程的时间片,假设时钟中断是1ms,时间片10ms,假如cpu处于用户态,时钟中断cpu会陷入内核,执行中断函数将时间片减1ms,然后恢复用户态。假如cpu正在执行系统调用,本来就在内核,那就不会减时间片。等到时间片为0,那这个进程pcb就会保存上下文寄存器,并设置TIF_NEED_RESCHED​ 标志位

进程调度时机

(1) task_struct(PCB)​

struct task_struct {
    // ... 其他字段 ...
    struct thread_info    *thread_info;  // 指向 thread_info
    // ... 调度相关字段 ...
};

​(2) thread_info(存储线程状态,包含 TIF_NEED_RESCHED)​

struct thread_info {
    unsigned long        flags;       // 线程状态标志,包括 TIF_NEED_RESCHED
    // ... 其他字段 ...
};

进程时间片为0,并不会立即在时钟中断函数里进行进程调度,而是设置标志位,等到cpu寄存器从内核栈里恢复后,去查看pcb中thread_info里flags中有没有设置TIF_NEED_RESCHED标志位,如果有那就进行进程调度,cpu寄存器从内核栈里恢复,并且准备切换成内核态的这个时间节点,我们称为安全点

 

http://www.xdnf.cn/news/7009.html

相关文章:

  • SpringBoot快速上手
  • CUDA 纹理入门
  • replay下载
  • SOLID 面对象设计的五大基本原则
  • 一种基于条件约束注意力生成对抗网络的水下图像增强模型
  • 二叉树构造:从前序、中序与后序遍历序列入手
  • USB学习【11】STM32 USB初始化过程详解
  • 【AI】Ubuntu 22.04 4060Ti16G 基于SWIFT框架的LoRA微调 模型Qwen3-1.8B 数据集弱智吧 微调笔记
  • 【iOS】探索消息流程
  • 上位机知识篇---流式Web服务器模式的实现
  • STM32SPI通信基础及CubeMX配置
  • OVS练习笔记20250518
  • Kubernetes控制平面组件:Kubelet详解(五):切换docker运行时为containerd
  • Vue-监听属性
  • 报错System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”
  • 面试中的线程题
  • 数据结构:二叉树一文详解
  • Linux安全第三章-系统安全及应用
  • 深入浅出Hadoop:大数据时代的“瑞士军刀”
  • 面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏
  • Linux(2)——shell原理及Linux中的权限
  • 黑灰产业链深度解析
  • 最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)
  • 使用 C# 入门深度学习:线性代数详细讲解
  • Android 性能优化入门(一)—— 数据结构优化
  • MLLM常见概念通俗解析(三)
  • Java面试深度解析:微服务与云原生技术应用场景详解
  • 互联网大厂Java面试:从Spring到微服务的深度探讨
  • 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting
  • svn: E170013 和 svn: E120171 的问题