scheduler 与 power mangement 的关系 --- linux kernel 实现之美

本文探讨了Linux内核中任务(Task)的唤醒过程,重点介绍了核心函数wake_up_process()及try_to_wake_up()的工作原理。通过分析源代码,详细解释了任务如何从睡眠状态被唤醒并重新调度。

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

/*
 * 从这里开始吧.
 * 		func : 尝试唤醒一个指定的 Task.
 * 		*p   : 将要被唤醒的 Task的 task_struct 
 * 
 *      很显然, 该Task 被唤醒后会被放入到 RB-Tree 中(CFS, DL)、List中(RT)
 *      这是调度延迟的一部分.
 */
int wake_up_process(struct task_struct *p)
{
	/*
	 *  看,封装的简单吧. 该函数是static的,外界看不到. 内核自己雪藏了.
	 *  给外界提供了wake_up_process()来使用. 下面的export_symbol就很自然了.
	 */
	return try_to_wake_up(p, TASK_NORMAL, 0);
}
EXPORT_SYMBOL(wake_up_process);
   0)               |            hrtimer_interrupt() {
   0)   0.093 us    |              _raw_spin_lock_irqsave();
   0)   0.186 us    |              ktime_get_update_offsets_now();
   0)               |              __hrtimer_run_queues() {
   0)   1.264 us    |                __remove_hrtimer();
   0)   0.106 us    |                _raw_spin_unlock_irqrestore();
   0)               |                hrtimer_wakeup() {
   0)               |                  wake_up_process() {
   0)               |                    try_to_wake_up() {
   0)   0.767 us    |                      _raw_spin_lock_irqsave();
   0)               |                      select_task_rq_fair() {
   0)               |                        select_idle_sibling() {
   0)   0.332 us    |                          available_idle_cpu();
   0)   1.108 us    |                        }
   0)   2.414 us    |                      }

在这里插入图片描述

/*
 *    ok, 先看参数.
 */
static int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
{
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值