linux进程调度

一般大部分进程都在阻塞中
非抢占式只能等进程主动让步,不好,抢占式由调度程序来决定是否抢占,由谁新获得cpu,时间片。
我们考虑I/O消耗进程大部分时间阻塞,被唤醒应立即执行(交互性),运行时间短
CPU消耗进程运行时间长,但应降低其调度频率
普通进程 nice(-20 到+19),越小优先级越大,
实时进程 0到99,越大优先级越大,实时进程(deadline)优先级肯定大于普通进程
时间片太长交互性差,太短吞吐量差(cpu时间都耗在进程切换上)
直接nice值对于时间片长度(Unix中使用),不好我们这里不用,例如0分配100ms,19分配5ms,看下面两问题
1一个nice为0,一个为19的105ms一个周期,两个19的10ms一个周期(上下文切换增加)
2 nice为0和1的比例100:95,18和19的比例为10:5

CFS(完全公平调度):针对普通进程
处理器使用比:n可运行进程,每个1/n, 根据nice(优先级)调整权重,修正使用比。
目标延迟(调度周期):根据使用比动态计算时间片
最小粒度:最小运行时间
时间记账:task_struct - sched_entity - vruntime
vruntime:虚拟运行时间,进程诞生后不断累加,vruntime=实际运行时间*(nice为0的权重/权重)
理想情况所有进程的vruntime都一样,vruntime貌似不需要,但一个周期内进程调度有先后且有些进程如IO进程运行不到给它分配的时间,所以导致各进程实际vruntime不同
选择vruntime最小进程运行即红黑树最左叶子节点
进程被创建或唤醒,加入红黑树,可能导致最左叶子节点变化,need_resched,重新调度
进程终止或阻塞,从红黑树删除
调度类:关联着调度算法,有着自己的进程队列,可从中选出优先级最高进程。
从最高优先级调度类中选最高优先级进程(调度实时进程的调度类优先级肯定高于调度普通进程的调度类CFS),所以肯定会先调用实时进程。
上下文切换:虚拟内存,处理器状态(栈,寄存器)的切换
每个进程有need_resched标志(放在thread_info 内)
用户抢占:从系统调用或中断返回用户空间时,检查need_resched发起抢占
内核抢占:运行内核代码(如系统调用)也会时间片耗尽(从中断返回),或变得可以抢占,或主动schedule,或阻塞(调用了schedule)等,也会有抢占行为,但必须保证重新调度是安全的(没有持有锁,thread_info的preempt_count 为0)
实例分析:进程正系统调用,时钟中断发生,发现时间片耗尽设置need_resched,中断返回检查need_resched和preempt_count ,若count为0,可发起抢占
count不为0,不抢占,继续系统调用中,锁释放代码检查这两个标志,满足发起抢占
中断处理程序不可抢占,都没有进程这个概念,抢占了怎么重新调度
实时调度策略
SCHED_FIFO 不基于时间片,一直运行,除非有更高优先级(直接抢占),同一优先级也只能干等
SCHED_RR 一直运行,同一优先级按时间片调度,
linux是软实时:不保证deadline,但一般情况下都能满足。
linux软的处理器亲和性,也可以强制指定(task_struct - cpu_allowed)cpu_allowed会从父进程继承,然后你可以显式改动。
yield放弃处理器时间,可放入过期队列保证一段时间内不再调度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值