进程调度——schedule()(二)

本文详细阐述了Linux内核中的进程调度过程,特别是`schedule()`函数的执行步骤。在找到下一个进程`next`后,内核访问其`thread_info`数据结构,并在切换前对当前进程`prev`的平均睡眠时间和CPU时间片进行管理。如果`next`与`prev`不相同,则执行进程切换。在切换后,还有一系列后续操作,确保正确恢复上下文并继续执行。
摘要由CSDN通过智能技术生成
1.2 完成进程切换时所执行的操作

找到next进程之后,就是要将该进程投入运行了。此时schedule()函数将进行如下操作:

(1)首先内核会立即访问next进程的thread_info数据结构,其地址存放在next进程描述符的接近顶部的位置。

	prefetch(next);
prefetch宏提示CPU控制单元把next的进程描述符第一部分字段的内容装入高速缓存。

(2)在替代prev之前,调度程序应该完成一些管理工作:

	clear_tsk_need_resched(prev);
	rcu_qsctr_inc(task_cpu(prev));
为了防止schedule()函数以延迟方式被调用,调用clear_tsk_need_resched()函数来清除prev的TIF_NEED_RESCHED标志。然后,函数记录CPU正在经历静止状态(quiescent state)。

之后还要必须减少prev的平均睡眠时间,并把它补充给进程所使用的CPU时间片:

prev->sleep_avg -= run_time;
if ((long)prev->sleep_avg <= 0)
prev->sleep_avg = 0;
prev->timestamp = prev->last_ran = now;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值