当前位置: 技术问答>linux和unix
进程调度的问题
来源: 互联网 发布时间:2016-08-26
本文导语: 在一个多处理器系统中(SMP),每个核都有一个runqueue。 假设系统中有大量的进程,并且都处于TASK_RUNNING状态。 并且假设这些进程中,有两个FIFO类型的实时进程A和B,其实时优先级分别为1和2。其它的进程全部是普通...
在一个多处理器系统中(SMP),每个核都有一个runqueue。
假设系统中有大量的进程,并且都处于TASK_RUNNING状态。
并且假设这些进程中,有两个FIFO类型的实时进程A和B,其实时优先级分别为1和2。其它的进程全部是普通进程。
另外,所有进程都没有和任何处理器设定亲和关系。
我的问题是,如果A和B处于同一个runqueue中,并且A始终占着CPU。
那么按照FIFO实时进程的调度策略,B岂不是没有机会执行了?
如果真的是这样,这就显得不合理了。因为B的优先级明显高于其它普通进程,而其它处理器却被普通进程占用了。
假设系统中有大量的进程,并且都处于TASK_RUNNING状态。
并且假设这些进程中,有两个FIFO类型的实时进程A和B,其实时优先级分别为1和2。其它的进程全部是普通进程。
另外,所有进程都没有和任何处理器设定亲和关系。
我的问题是,如果A和B处于同一个runqueue中,并且A始终占着CPU。
那么按照FIFO实时进程的调度策略,B岂不是没有机会执行了?
如果真的是这样,这就显得不合理了。因为B的优先级明显高于其它普通进程,而其它处理器却被普通进程占用了。
|
在新版的Linux内核比如2.6.32中实时进程在创建时,
1、选一个正在运行的cpu中会选择一个优先级最低的CPU进行抢占
2、或者选一个空闲的CPU
不存在这种情况
而比较旧的版本比如2.6.11实时进程的处理和一般进程相似有可能出现这种情况
|
从理论上讲的确(可能)存在,而实际应用中并不会出现,
因为LZ忽略了几个条件
1、忽略了负载均衡,而CPU调度队列中进程数也是负载均衡的重要参数。
在进程创建时会加入到负载较低的CPU的队列中,这就使得不同cpu的运行
队列中的进程个数相差不会很大;即使两个实时进程在同一个队列中,
cpu间也存在进程迁移
2、忽略了什么样的进程或线程有实时优先级并采用FIFO的调度方式
系统使用FIFO调度方式的实时线程或进程不存在占着cpu不放的情况,
LZ自己实现的线程或进程存在占着CPU 不放的情况,而调度方式是基于时间片的分时调度
当然,LZ可以通过一些命令改变调度方式和优先级
比如Solaris10 下面的priocntl改变线程或进程
调度方式和优先级使系统进入假死状态,这又有什么意义呢?(说明Solaris 10 没有使用FIFO调度方式)
而Linux还没有发现用户设置进程调度方式的命令。
总之,LZ假设的情况在实际应用中不会出现
LZ对Linux的进程调度已经有了比较深的了解
建议再看一下cpu 的负载均衡算法以及进程创建后是如何选择CPU的运行队列的,
这样就比较全面了。
|
这个假设是有问题的,
A和B在同一个runqueue中在什么情况下会出现优先级低的A一直运行呢?
情况1:
A先运行,B后加入到runqueue中,
这个时候会出现进程抢占,B会占据CPU
情况2:
B先运行,A后加入,
除非B主动让出cpu ,A才会运行,
一旦B被重新唤醒,进程B同样会抢占CPU
要出现LZ所说的情况要满足2个条件
一是内核不可抢占的
二是A先与B执行
Linux 内核是可以抢占的。
Solaris、AIX同样如此。
A和B在同一个runqueue中在什么情况下会出现优先级低的A一直运行呢?
情况1:
A先运行,B后加入到runqueue中,
这个时候会出现进程抢占,B会占据CPU
情况2:
B先运行,A后加入,
除非B主动让出cpu ,A才会运行,
一旦B被重新唤醒,进程B同样会抢占CPU
要出现LZ所说的情况要满足2个条件
一是内核不可抢占的
二是A先与B执行
Linux 内核是可以抢占的。
Solaris、AIX同样如此。
|
负载均衡
当其他cpu空闲时,便会把cpu分成b使用
如果其他cpu也是满载荷,不知道会不会进行抢占
个人看法,具体代码没有研究过。
当其他cpu空闲时,便会把cpu分成b使用
如果其他cpu也是满载荷,不知道会不会进行抢占
个人看法,具体代码没有研究过。
|
网上抄的一句话:
在Linux 2.4中,进程的调度策略可以有三种选择:SCHED_FIFO(先进先出式调度,除非有更高优先级进程申请运行,否则该进程将保持运行至退出才让出 CPU)、SCHED_RR(轮转式调度,该进程被调度下来后将被置于运行队列的末尾,以保证其他实时进程有机会运行)、SCHED_OTHER(常规的分时调度策略)。另外,policy中还包含了一个SCHED_YIELD位,置位时表示主动放弃CPU。
在Linux 2.4中,进程的调度策略可以有三种选择:SCHED_FIFO(先进先出式调度,除非有更高优先级进程申请运行,否则该进程将保持运行至退出才让出 CPU)、SCHED_RR(轮转式调度,该进程被调度下来后将被置于运行队列的末尾,以保证其他实时进程有机会运行)、SCHED_OTHER(常规的分时调度策略)。另外,policy中还包含了一个SCHED_YIELD位,置位时表示主动放弃CPU。
|
如果不可抢占,人家又先到,那只好等待执行结束了。这种中断的东西完全看调度了。