【发布时间】:2012-06-25 13:20:34
【问题描述】:
我经常听到驱动程序开发人员说尽可能避免内核模式切换是件好事。我无法理解确切的原因。首先我的理解是-
- 系统调用是软件中断。在 x86 上,它们是通过使用 sysenter 指令触发的。它实际上看起来像一个分支指令,它从机器特定的寄存器中获取目标。
- 系统调用实际上不必更改地址空间或进程上下文。
- 不过,它们确实将寄存器保存在进程堆栈上,并将堆栈指针更改为内核堆栈。
在这些操作中,系统调用的工作方式与普通函数调用非常相似。尽管 sysenter 可能表现得像一个错误预测的分支,这可能导致处理器管道中的 ROB 刷新。即使这样也不是很糟糕,它就像任何其他错误预测的分支一样。
我听到一些人在 Stack Overflow 上回答:
- 你永远不知道系统调用需要多长时间 - [我] 是的,但任何函数都是如此。所需时间取决于功能
- 经常是调度点。 - [me] 进程可以重新调度,即使它一直在用户模式下运行。例如,
while(1);不保证无上下文切换。
实际的系统调用成本来自哪里?
【问题讨论】:
-
现代处理器的性能主要取决于程序使用缓存的程度。没有什么比环形过渡更糟糕的了,每个缓存都是垃圾。从 RAM 中重新加载数据、指令和 TLB 缓存需要很长时间,尤其是在数据被换出时。
-
我不太确定,你的意思是什么。我的理解是缓存永远不必在环转换时刷新,因为地址空间仍然相同。缓存和 TLB 只需要在进程竞争切换时刷新。如果处理器可以用一些地址空间(或进程)标识符标记 TLB 条目,即使这也不需要发生。
标签: performance x86 kernel system-calls