linux2.4到linux2.6内核调度(5)

本文详细解读Linux内核中调度系统代码结构,并深入分析2.6版内核中改进的task_struct表征进程方式,包括状态表示、时间戳记录以及关键属性的调整与新增,旨在提升调度效率与进程管理能力。

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

调度系统代码结构 绝大多数调度系统的实现代码,包括 runqueue 结构的定义,都在[kernel/sched.c]文件中,这样做的目的是将所有调度系统的代码集中起来,便于更新和替换。除非特别注明,本文所引代码和函数实现均位于[kernel/sched.c]中。

3. 改进后的 task_struct

2.6 版的内核仍然用 task_struct 来表征进程,尽管对线程进行了优化,但线程的内核表示仍然与进程相同。随着调度器的改进,task_struct 的内容也有了改进,交互式进程优先支持、内核抢占支持等新特性,在 task_struct 中都有所体现。在 task_struct 中,有的属性是新增加的,有的属性的值的含义发生了变化,而有的属性仅仅是改了一下名字。

1) state

进程的状态仍然用 state 表示,不同的是,2.6 里的状态常量重新定义了,以方便位操作:

/* 节选自[include/linux/sched.h] */

#define TASK_RUNNING                0

#define TASK_INTERRUPTIBLE          1

#define TASK_UNINTERRUPTIBLE        2

#define TASK_STOPPED                4

#define TASK_ZOMBIE                 8

#define TASK_DEAD        16

新增加的TASK_DEAD指的是已经退出且不需要父进程来回收的进程。

2) timestamp

进程发生调度事件的时间(单位是 nanosecond,见下)。包括以下几类:

  • 被唤醒的时间(在 activate_task() 中设置); 

  • 被切换下来的时间(schedule()); 

  • 被切换上去的时间(schedule()); 

  • 负载平衡相关的赋值(见"调度器相关的负载平衡")。 

从这个值与当前时间的差值中可以分别获得"在就绪队列中等待运行的时长"、"运行时长"等与优先级计算相关的信息(见"优化了的优先级计算方法")。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值