分类: LINUX
2012-10-09 13:21:41
MagicBoy20102013-08-01 05:43:03
Z_H_Z1102:假如我设计一个极限情况,如果一个进程被spin锁住的进程,占用CPU的时间超过了0.95 s,如果不进行进程调度的话是会饿死普通进程吧?
我觉得进程调度应该是一个绝对的方法,一个进程时间片用完了就要换到低优先级的进程以保证其他进程不被饿死,阻止了中断和抢占,但应该并不能进程schedule()的发生;
如果spin_lock_irqsave能够阻止进程调度的话,那么为何只说阻止了中断和抢占,直接说阻止了进程调度不是更easy一些?
如果一个进程时间片用完当然会导致进程的切换,但是进程时间片需要时钟中断去更新,local_irq_disable实际上阻止了这种可能性。抢占意味着当中断发生时,一个进程被投入到当前cpu的运行队列,调度器需要检查它与被中断进程的优先级以确定是否要抢占它。可以简单做个试验,你写一个内核模块,在模块(test.ko)的初始化函数中这样做:
spin_lock_irqsave(...);
unsigned long j = jiffies + 300 * HZ;
while (time_before (jiffies, j));
spin_unlock_irqsave(...);
在多处理系统中你可以将insmod进程绑定到cpu 0上:
#taskset 0x000000001 insmod test.ko
这样你应该有机会从其他cpu上去察看cpu0上task switch发生的次数(/proc?),在cpu0上insmod进程在模块的初始化函数中在spin_lock_irqsave下面忙等待5分钟,这个时间远大于一个进程所拥有的时间
Z_H_Z11022013-07-31 16:44:27
MagicBoy2010:spin_lock_irqsave内含preempt_disable和local_irq_disable,在本地CPU中断关闭的情形下你能想到的进程调度的情形是什么呢?不太明白你困惑的原因...
假如我设计一个极限情况,如果一个进程被spin锁住的进程,占用CPU的时间超过了0.95 s,如果不进行进程调度的话是会饿死普通进程吧?
我觉得进程调度应该是一个绝对的方法,一个进程时间片用完了就要换到低优先级的进程以保证其他进程不被饿死,阻止了中断和抢占,但应该并不能进程schedule()的发生;
如果spin_lock_irqsave能够阻止进程调度的话,那么为何只说阻止了中断和抢占,直接说阻止了进程调度不是更easy一些?
MagicBoy20102013-07-31 10:53:27
Z_H_Z1102:Hi 博主:
从这篇博文中,其一的论点就是“spin_lock_irqsave保护的临界区内容是禁止本地CPU的进程调度的”。这个问题困扰了我很久,我也在网上搜了很多,总之大家的众说风云,我也在我们开发的双核安卓手机上面做过实验,但无法设计出来一个很好的实验,总之还是无法证明此问题。
对于这个问题,博主是否有进一步的论点能够支持此论点,我想进一步和你探讨一下,谢谢
spin_lock_irqsave内含preempt_disable和local_irq_disable,在本地CPU中断关闭的情形下你能想到的进程调度的情形是什么呢?不太明白你困惑的原因...
回复 | 举报MagicBoy20102012-10-12 13:26:12