【发布时间】:2014-03-30 21:56:54
【问题描述】:
我对系统调用的理解是,在 Linux 中,系统调用机制(int 0x80 或其他)被记录并保证在不同内核版本中保持稳定。使用此信息,系统调用直接在 CRT 库中实现,因此当我调用例如printf("a"); 这涉及对 CRT 的单个函数调用,其中系统调用被设置和激活。理论上,这可以通过静态编译 CRT(在 Linux 上不常见,但有可能)进一步改进,这样即使是单个函数调用也可以内联。
另一方面,Windows 不记录甚至不保证系统调用机制的一致性。 唯一在 Windows 上进行系统调用的方法是调用从 CRT 完成的ntdll.dll(或者可能是其他一些*.dll),所以有两个 涉及的函数调用。如果静态使用 CRT 并且函数被内联(在 Windows 上比在 Linux 上更常见),我们仍然有对 ntdll.dll 的单个函数调用,我们无法摆脱。
所以在我看来,理论上 Windows 上的系统调用本质上会更慢,因为它们总是需要比 Linux 等价物多做一个函数调用。这种理解(以及我上面的解释)是真的吗?
注意:我只是在理论上问这个问题。我知道在进行系统调用时(我认为这总是涉及 2 个上下文切换 - 每个方向一个)额外函数调用的成本可能完全可以忽略不计。
【问题讨论】:
-
CRT?什么阴极射线管?我不将 C 用于 Windows 应用程序。我的 Delphi 应用程序导入操作系统 DLL 并调用它们。此外,Windows 上的 printf() ?有多少 Windows 应用程序使用 printf 调用? 99.99% 有 GUI,而不是 60 年代侏罗纪的“终端控制台”界面。
-
@MartinJames CRT 如果您使用的是 C(或者可能也是大多数解释型语言)。在您的情况下,它将是 Delphi 运行时,无论是什么。
printf就是一个例子。任何打开文件或分配堆内存或写入屏幕或其他东西的调用都会执行系统调用 -
@user2120666 这个问题至少对我来说是非常清楚的,也许是你的理解蒙上了一层阴影?您认为这个问题在哪里混淆了对 CRT 的调用和对内核空间的调用?据我所知,它一直仔细区分两者。
-
我会将“理论上 Windows 上的系统调用本质上会更慢”更正为“理论上 Windows 上的运行时库调用本质上会更慢”。有了这种变化,您的推理是合理的,尽管正如您所说,差异是微不足道的。请注意,我所做的区别 很重要,因为许多 Windows 程序员不经常使用运行时库,倾向于直接调用 Win32 API。
-
很难理解这个问题在问什么,为什么它有赏金。这是一个苹果和梨的比较。
标签: linux windows operating-system system-calls