乍一看,我的问题可能看起来有点微不足道.请耐心等待,并完整阅读.
我在Linux内核模块中发现了一个繁忙的循环.因此,其他进程(例如sshd)在很长一段时间内(例如20秒)没有获得CPU时间.这是可以理解的,因为我的机器只有单个CPU,繁忙循环没有机会安排其他进程.
只是为了实验,我在忙循环中的每次迭代后添加了schedule().即使这会使CPU保持忙碌,但仍应让其他进程运行,因为我正在调用schedule().但是,这似乎并没有发生.我的用户级进程仍然在很长一段时间内(20秒)挂起.
在这种情况下,内核线程得到了很好的值-5和用户级线程得到了很好的值0.即使用户级线程的优先级较低,我认为20秒太长而无法获得CPU.
有人可以解释为什么会发生这种情况吗?
注意:我知道如何完全删除繁忙的循环.但是,我想在这里理解内核的行为.内核版本为2.6.18,禁用内核抢占.
我经常听司机开发人员说尽可能避免内核模式切换.我无法理解确切的原因.从我的理解开始是 -
在这些操作中,系统调用几乎像普通函数调用一样工作.虽然sysenter可能表现得像一个错误预测的分支,这可能导致处理器流水线中的ROB刷新.即使这并不是很糟糕,它就像任何其他错误预测的分支一样.
我听到一些人在Stack Overflow上回答:
while(1);不保证无上下文切换.实际的系统调用成本来自哪里?