个人Linux操作系统学习笔记10 - 进程组织与调度
目录补充前置知识重新设计双链表为什么要这么设计在OS角度怎么做的优点是什么Linux2.6内核进程调度队列进程组织Linux内核里面的内核结构Linux采用链表结构补充前置知识C语言中任何变量的地址数字是开辟众多字节中地址数据最小的那个structA{inta;intb;intc;doubled;}我只知道结构体中C成员的地址怎么知道所在结构体变量的其它地址呢((structA*)0-c)//是c变量在结构体中的偏移量c语言提供了宏offsetof获得结构体内变量偏移量https://legacy.cplusplus.com/reference/cstddef/offsetof/因此可以使用变量地址 - 偏移量 结构体地址获得结构体地址重新设计双链表structlink{structlink*next;structlink*prev;}structtask_struct{//进程的属性structlinknode;//...}因此这个结构体中的链表next与prev指向的也是下一个结构体中node的地址而不是结构体的地址但是我们可以利用上面补充的前置知识获取task_struct的地址为什么要这么设计增加链式管理的扩展性代码只需要维护一份即可举头插链表为例insert_head(head,structlink*);structtask_struct*tnewXXX;insert_head(head,(t-node));在OS角度怎么做的优点是什么Linux内核会将所有的进程task_struct统一放在一张双链表中进程不是也有运行队列吗阻塞队列吗为什么一个节点既在队列里又在链表里structtask_struct{//...structlist_headtasks;//...structlist_headrun;}一个结构体里可以有多个链式结构这样tasks队列交给OS管理run队列用于给cpu调度队列甚至如果有更多的数据结构也可以通过这种方式让一个进程同时属于多个数据结构这就是内核设计数据结构的思路Linux2.6内核进程调度队列时间复杂度为O(1)每一个CPU都有一个调度队列structrunqueue{//...structtask_structqueue[140];//...};其中queue[140]可以理解为structtask_struct*queue[140]这是一个140块空间的队列其中普通优先级100~139我们都是普通的优先级想想nice值的取值范围可与之对应实时优先级0~99不关心其中100139这40个位置就是我们前面讲优先级的6099的40个位置结论1优先级数字本质是数组下标结论2则优先级相同的进程在同一个队列中这140个位置的每一个位置都是一个队列优先级相同则遵循FIFO原则进行调度那么根据优先级选择进程的时候本质是一个hash的过程结论3一旦确认是哪个队列剩下的就是FIFO可是每次想要找到一个不为空的队列最多需要遍历40次我们可以使用位图——每一个比特位对应一个下标0表示空队列1表示非空队列为什么使用位图因为位图的检测效率更高比直接检测效率更高。如果运行队列里一个进程都没有呢使用一个变量nr_active记录进程的总数structprio_array_t{nr_active//进程数bitmap[5]//位图queue[140]//运行队列}在多种优化下查找效率完全逼近O(1)问题所有教程优先级都是61但是不断地有60的教程来那么61的教程是否无法被调度进程饥饿问题分时操作系统会以较为公平的方式选择进程在一段时间内让所有进程都能得到CPU资源因此调度算法没有上面说的这么简单。在runqueue中有两个队列一个活跃队列一个过期队列不代表进程执行完了使用两个指针指向这两个队列*active指针指向活跃队列*expired指针指向过期队列当一个进程在一个时间片结束时无论有没有执行完成都会被放入过期队列中那么活跃队列中的pcb会越来越少过期队列越来越多当活跃队列为空之后直接swap(active, expired)交换两个指针的内容成功完成了将过期队列改为活跃队列新进程加入应当先放到过期队列等待下一轮执行回到上面的问题所有教程优先级都是61但是不断地有60的教程来那么61的教程是否无法被调度就是按照上面的两个队列互相切换的方式那么在每一轮中所有的进程都会得到调度不会出现进程饥饿问题优先级高只决定该进程在当前轮中的先后以上就是Linux O(1) 的调度算法该方法不存在饥饿问题Linux2.4之后的内核支持抢占—— 如果来了一个高优先级的进程那么可能会立即把当前的进程剥离或进行其它操作在运行队列的0~99位的进程为实时进程实时进程相当于分时操作系统的一个子集实时进程会将进程代码全部执行完后再进行下一个因此Linux系统既有分时操作系统也有实时操作系统但是目前基本都是用分时操作系统

相关新闻

Visual C++调试与性能分析全攻略:从基础断点到高级内存诊断

Visual C++调试与性能分析全攻略:从基础断点到高级内存诊断

1. 项目概述:为什么我们需要一份“全攻略”?在Visual C(通常指基于Visual Studio的C开发环境)的世界里摸爬滚打了十几年,我见过太多开发者,从刚入行的新手到有一定经验的工程师,都曾陷入同一个困…

2026/7/23 21:29:32阅读更多 →
Open vSwitch与KVM集成方案:构建高效虚拟网络环境

Open vSwitch与KVM集成方案:构建高效虚拟网络环境

Open vSwitch与KVM集成方案:构建高效虚拟网络环境 在云计算与虚拟化技术蓬勃发展的当下,KVM(Kernel-based Virtual Machine)作为一款广泛应用的开源虚拟化解决方案,凭借其高效、稳定及灵活的特性,在数据中心…

2026/7/23 21:29:32阅读更多 →
深度强化学习在电池储能系统中的应用与实践

深度强化学习在电池储能系统中的应用与实践

1. 项目概述:电池储能与深度强化学习的结合电池储能系统在现代能源管理中扮演着越来越重要的角色,特别是在可再生能源集成和电网稳定性方面。传统基于规则的电池充放电控制策略往往难以应对复杂多变的电网环境和用户需求。这正是深度强化学习(DRL)大显身…

2026/7/23 21:29:32阅读更多 →
2026十大生产制造ERP:警惕出货量误导,基于MES集成度与工单闭环逻辑重排

2026十大生产制造ERP:警惕出货量误导,基于MES集成度与工单闭环逻辑重排

在制造业数字化转型的深水区,企业决策者正面临一个尴尬的悖论:市面上号称“高产能”的ERP系统层出不穷,出货量榜单更是让人眼花缭乱,但真正落地后,生产现场的管理效率却并未显著提升。许多企业陷入了“报表数据漂亮&am…

2026/7/23 22:37:41阅读更多 →
ABC467

ABC467

D 计算几何 给四个点,其中两个pq属于一个圆,另外两个rs属于另一个圆。问有没有可能这两个圆的圆心相同? 给了圆上两点,可以确定圆心在这两点形成的线段的中垂线上。如果两个中垂线有交点,则交点就是公共圆心。 转化为直…

2026/7/23 22:37:41阅读更多 →
LLM-Pruner: On the Structural Pruning of Large Language Models 解读

LLM-Pruner: On the Structural Pruning of Large Language Models 解读

一、论文基本信息 论文题目:LLM-Pruner: On the Structural Pruning of Large Language Models 作者:Xinyin Ma、Gongfan Fang、Xinchao Wang 发表会议:NeurIPS 2023 官方代码:horseee/LLM-Pruner。官方仓库标注这是 NeurIPS …

2026/7/23 22:37:41阅读更多 →
CAN/CAN FD调试--笔记1

CAN/CAN FD调试--笔记1

CAN/CAN FD调试–笔记1 一、CAN 和 CAN FD 的配置差别 1.1 BSR 位的作用:速率切换标志 CAN FD 支持两种比特率: 仲裁段(Arbitration Phase):与传统 CAN 相同的低速速率(用于仲裁,确保兼容性…

2026/7/23 22:37:41阅读更多 →
海康摄像头RTSP转换前端浏览器实时播放

海康摄像头RTSP转换前端浏览器实时播放

背景: 公司运维平台需求:把机房监控接入,可在运维平台web实时查看。 解决方案:前端无法播放RTSP数据,问了deepseek和查看别人的建议,最后决定采用以下方案: 基于 ffmpeg 的 Node 后端推流方案 …

2026/7/23 22:37:41阅读更多 →
OpenHarmony 小鸿 AI 开发实战 02:从板级源码读懂 WS63、CI1302、ST7789 与外部 Flash

OpenHarmony 小鸿 AI 开发实战 02:从板级源码读懂 WS63、CI1302、ST7789 与外部 Flash

第 01 篇已经确认当前小鸿本体走的是 xiaohong 这条 WS63/OpenHarmony 主线。继续开发之前,还要把板级源码中的引脚、总线和器件职责理清,否则很容易把一个 GPIO 当成普通按键、把两类 Flash 混成同一存储空间,或者在 LCD 与外部 Flash 共享 …

2026/7/23 22:35:41阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →