博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 调度
阅读量:4194 次
发布时间:2019-05-26

本文共 2428 字,大约阅读时间需要 8 分钟。

ps 优先级   和标准级别比较 【-40,99】

top                                             【-99,40】

调度类:

实时进程:fifo rr

普通进程:cifs

内核抢占:

  1. 高优先级实时进程抢占低优先级实时进程
  2.  高优先级实时进程抢占 普通优先级进程 

普通进程之间没有抢占的概念

内核发生场景:

用户空间:

  1. 中断返回到用户空间  (resume_userspace ->work_pending)
  2. 系统调用返回到用户空间

内核空间:

  1. 中断返回到内核空间
  2. spinlock锁释放
  3. 调用schedule
  4. 队列中有阻塞任务

thread_info  中的preempt_count 指示内核空间是否可以被抢占,0表示可以被抢占。

内核抢占结束后重新启用会调用,preempt_check_resched.  

preempt_check_resched 调用preempt_schedule . 

wake up 函数执行流程

wake_up 调用default_wake_function -> try_to_wake_up  作用:将任务放入运行队列。

一 调度时机
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()函数  (见前面说明)

struct thread_info {

struct task_struct*task;/* main task structure */
struct exec_domain*exec_domain;/* execution domain */
__u32 flags;/* low level flags */
__u32 status;/* thread synchronous flags */
__u32 cpu;/* current CPU */
int preempt_count;/* 0 => preemptable,
  <0 => BUG */
mm_segment_t addr_limit;
struct restart_block    restart_block;
void __user *sysenter_return;
#ifdef CONFIG_X86_32
unsigned long           previous_esp;   /* ESP of the previous stack in
  case of nested (IRQ) stacks
*/
__u8 supervisor_stack[0];
#endif
int uaccess_err;
};

ret_from_int  ret_from_exception   ret_from_sys_call

参考资料:

中断返回,系统调用返回 , 异常返回 。

http://blog.csdn.net/zhw888888/article/details/6602754

你可能感兴趣的文章
顺丰快递员私自截留口罩贩卖?官方回应来了:口罩微商搞的鬼!
查看>>
刘强东为抗疫发声:我们送的不是货,是温暖和希望!
查看>>
各地延迟上课,请收好这份线上教学操作指南
查看>>
从教科书式的失败到手术刀式的自救,李宁找回了“李宁”!
查看>>
美团延长旅行订单免费取消保障政策至2月29日
查看>>
奏响春的序曲,「武汉的春天」让人泪目
查看>>
华大基因:新型冠状病毒检测试剂盒日均产能已达8万人份
查看>>
情人节集体撤档,《肥龙过江》改网播,线上首映会成为常态吗?
查看>>
华为P40 Pro相机高清细节图曝光:潜望式长焦镜头抢眼
查看>>
“抢菜大战”背后:生鲜电商的突击大考
查看>>
骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
查看>>
二月手机好评排行榜公布:华为第一,小米10没上榜
查看>>
英特尔展示业界首个一体封装光学以太网交换机
查看>>
年存10W+的年轻人都是怎么攒钱的
查看>>
苹果确认部分iPad Air 3会出现永久性黑屏:可免费维修
查看>>
iPhone 11全球供应紧张:何时补货未知
查看>>
小米40W无线闪充今年商用:MIX 4首发?
查看>>
国产手机卖的越来越贵,是好是坏?
查看>>
拼多多联合三奇医卫等企业,每天上架1000万只平价口罩
查看>>
5000起步没商量!vivo NEX 3S 5G手机正式发布:骁龙865+无界瀑布屏加持
查看>>