小编APK*_*Kar的帖子

为什么在Linux内核中繁忙的循环时,为了TOO,进程被剥夺了CPU的权限?

乍一看,我的问题可能看起来有点微不足道.请耐心等待,并完整阅读.

我在Linux内核模块中发现了一个繁忙的循环.因此,其他进程(例如sshd)在很长一段时间内(例如20秒)没有获得CPU时间.这是可以理解的,因为我的机器只有单个CPU,繁忙循环没有机会安排其他进程.

只是为了实验,我在忙循环中的每次迭代后添加了schedule().即使这会使CPU保持忙碌,但仍应让其他进程运行,因为我正在调用schedule().但是,这似乎并没有发生.我的用户级进程仍然在很长一段时间内(20秒)挂起.

在这种情况下,内核线程得到了很好的值-5和用户级线程得到了很好的值0.即使用户级线程的优先级较低,我认为20秒太长而无法获得CPU.

有人可以解释为什么会发生这种情况吗?

注意:我知道如何完全删除繁忙的循环.但是,我想在这里理解内核的行为.内核版本为2.6.18,禁用内核抢占.

linux operating-system kernel kernel-module linux-kernel

10
推荐指数
1
解决办法
1094
查看次数

系统调用与函数调用之间的性能差异

我经常听司机开发人员说尽可能避免内核模式切换.我无法理解确切的原因.从我的理解开始是 -

  1. 系统调用是软件中断.在x86上,它们由使用指令sysenter触发.这实际上看起来像是从机器特定寄存器获取目标的分支指令.
  2. 系统调用实际上不必更改地址空间或进程上下文.
  3. 但是,它们确实在进程堆栈上保存寄存器,并将堆栈指针更改为内核堆栈.

在这些操作中,系统调用几乎像普通函数调用一样工作.虽然sysenter可能表现得像一个错误预测的分支,这可能导致处理器流水线中的ROB刷新.即使这并不是很糟糕,它就像任何其他错误预测的分支一样.

我听到一些人在Stack Overflow上回答:

  1. 你永远不知道系统调用需要多长时间 - [我]是的,但是任何功能都是如此.所需的时间取决于功能
  2. 它通常是安排现场. - [me]进程可以重新安排,即使它一直在用户模式下运行.例如,while(1);不保证无上下文切换.

实际的系统调用成本来自哪里?

performance x86 kernel system-calls

8
推荐指数
1
解决办法
2296
查看次数