linux里的抢占-preempt

linux里的抢占-preempt,第1张

1. 什么是抢占

抢占就是进城切换, 以thread_info->preempt_count标识。

thread_info->preempt_count一物多用:

bit0-7代表的是抢占的次数,最大抢占深度为256次,

bit8-15代表的是软中断的次数,最大也是256次,

bit16-19表示中断的次数,注释的大概意思是避免中断嵌套,但是也不能防止某些驱动中断嵌套使用中断,所以嵌套16层也是最大次数了。

bit20~23代表的NMI中断

2.抢占的函数:

spin_lock()/spin_unlock()

disable_preempt()/enable_preempt()--禁止或使能内核抢占,调用下面的inc_preempt_count()/dec_preempt_count(),加了memory barrier。

inc_preempt_count()/dec_preempt_count()

get_cpu()/put_cpu()

3.调度点

a) 进程被阻塞时

b) 调整参数时,比如通过sched_setscheduler() ,nice()等函数调整进程的调度策略,静态优先级时

c) 睡眠进程被唤醒时,比如wake_up唤醒等待队列中的进程时,如果该进程具有更高优先级则会设置当前

  进程TIF_NEED_RESCHED,如果允许内核态抢占,则会调度一次

d)中断处理完时,如果中断处理过程中设置了TIF_NEED_SCHED标志,中断返回时,不论是要返回内核态还是用户态,都会发生一次抢占.当然,在这也会检查有没有软中断需要处理。

e)执行了preempt_enable()函数。

假设:您的实时linux调度是默认的,那么A0会抢占处于运行状态且优先级最低的进程所占用的cpu,也就是cpu1.

如果,你绑定了A0 A1 A2 到core0上,那么A0会抢core0


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7322541.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存