Linux内核调度——《奔跑吧Linux内核》学习笔记

本文详细探讨了内核启动时的init_task进程,内核栈的8KB配置,进程创建通过do_fork(),进程分类及CFS调度器的公平原则,以及进程的不同状态和多核负载均衡。了解这些关键概念有助于掌握操作系统内核的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

init进程

在内核启动时,会有一个init_task进程,他是所有进程的鼻祖,又称0号进程。当系统没有进程需要调度时候,会执行idle进程。

进程控制块PCB

https://www.cnblogs.com/yungyu16/p/13024626.html

内核栈

通常内核栈大小为8KB,即两个物理页面的大小。他存在于内核映像文件的.data段中,由编译时分配好。ARM32处理器从汇编跳转到startkernel前,设置好SP指针指向栈顶。

进程创建

最终都是调用内核里的do_fork()函数。

进程分类

按调度需求,进程分为:
交互式进程,如鼠标键盘,特点是要求相应快;
批处理进程,特点是需要很大算力或资源;
实时进程,特点是对延时要求严格,如vr设备,延时太大会眩晕,工控设备延时太大会出事故。

CFS调度器

完全公平调度
内核使用0139表示优先级,数值越低,优先级越高。100139给普通进程使用。用户空间有个nice值映射到普通进程优先级100~139.。
cfs定义了一种新的模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(也就是一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。

进程状态

R, TASK_RUNNING:就绪态或者运行态,进程就绪可以运行,但是不一定正在占有CPU
S, TASK_INTERRUPTIBLE:浅度睡眠,等待资源,可以响应信号,一般是进程主动sleep进入的状态
D, TASK_UNINTERRUPTIBLE:深度睡眠,等待资源,不响应信号,典型场景是进程获取信号量阻塞
Z, TASK_ZOMBIE:僵尸态,进程已退出或者结束,但是父进程还不知道,没有回收时的状态
T, TASK_STOPED:停止,调试状态,收到SIGSTOP信号进程挂起。

多核负载均衡

大小核负载均衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值