进程调度时机分类及常见的进程调度点体会

发布于 2022-09-23 14:26:13 字数 3265 浏览 27 评论 0

linux kernel 2.6:总结--------(进程调度只能发生在内核态)

一 调度时机
1)显示调度,进程自己因为缺少相应的所申请的资源,显示调用调度器,让出处理器,比如:内核申请的
          信号阻塞了,自旋锁锁住了
2)隐式调度,整个linux系统在运行过程中的非显示的调用调度器,这又分两种情况
A)用户态抢占调度  比如:在系统调用,中断处理,异常处理返回用户态时,该进程的时间片已经用完
B)内核态抢占调度  比如:当前内核态执行过程中事先没有禁止内核态抢占,有中断产生时,中断处理
                    又产生了更高级优先进程,那么就会直接抢占前面的内核态执行体
           
   内核态抢占的抢占点有两处:(A)中断处理返回内核态时(如果事先没有禁止内核态抢占---preempt_disable)
                            (B)重新起用内核态抢占时---preempt_enable

相关数据结构及函数如下:
struct task中
{
unisgned int preempt_count;-----(PREEMPT 0-7位表示内核态禁止抢占计数器,SOFTIRQ 8-15表示软中断禁止
                            计数器,HARDIRQ 16-27表示中断嵌套的深度)
}
只要PREEMPT为0时才允许内核态抢占.

preempt_disable()--------------主要执行inc_preempt_count()(增加PREEMPT,从而禁止内核态抢占)
preempt_enable()--------------主要执行preempt_enable_no_resched()和preempt_check_resched()
                                preempt_enable_no_resched()主要执行dec_preempt_count()
                                preempt_check_resched()主要执行test_thread_flag(TIF_NEED_RESCHED)
                                (是否设置了需要调度的标志)和preempt_schedule()(进行内核态抢占调度)

二 常见的调度点
1)进程被阻塞时 比如申请资源时被阻塞
2)调整参数时   比如通过sched_setscheduler() ,nice()等函数调整进程的调度策略,静态优先级时
3)睡眠进程被唤醒时  比如wake_up唤醒等待队列中的进程时,如果该进程具有更高优先级则会设置当前
               进程TIF_NEED_RESCHED,如果允许内核态抢占,则会调度一次,
               ( 这是由等待队列中的默认的唤醒函数控制的,默认的唤醒函数为:
               int default_wake_function(wait_queue_t*,unisgned int  mode,int sync,void* key)
               EXPORT_SYMBOL(default_wake_function)
               因为EXPORT_SYMBOL了default_wake_function,所以我们可以制作我们自己的唤醒函数.
4)中断处理完时  如果中断处理过程中设置了TIF_NEED_SCHED标志,中断返回时,不论是要返回内核态
                还是用户态,都会发生一次抢占.当然,在这也会检查有没有软中断需要处理.
5)执行了preempt_enable()函数  (见前面说明)
                           
                            先写到这儿

[ 本帖最后由 dreamice 于 2009-1-14 21:27 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

你爱我像她 2022-09-30 14:26:13

加油,分析详细一点

娇柔作态 2022-09-30 14:26:13

非常好,学习了

归途 2022-09-30 14:26:13

本来还有很多东西要写(都是从书本上得来的我自己的分析,不一定正确,何况我还没有什么驱动编程的实践经验),可是我在本版提的一些基本问题没答案,我还要继续做实验,等我搞懂些实际问题后抽时间再写吧。以后还会结合源代码写内存管理,软中断,网络子系统(硬件--驱动--struct DEVICE---ip(或ARP)---TCP/UDP---sys_call(如sys_create)---socket),设备模型等方面我自己的体会。

一句话:我是“赵括”,不要见笑,有错误请指正。

自此以后,行同陌路 2022-09-30 14:26:13

继续努力,慢慢就牛了

心头的小情儿 2022-09-30 14:26:13

,多谢楼主分享经验~
嘎嘎,不过貌似应该:显示--->显式。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文