为啥我应该在我的代码中尽量减少系统调用的使用?

Posted

技术标签:

【中文标题】为啥我应该在我的代码中尽量减少系统调用的使用?【英文标题】:Why should I Minimize the use of system call in my code?为什么我应该在我的代码中尽量减少系统调用的使用? 【发布时间】:2011-09-19 11:08:25 【问题描述】:

我想知道是否有任何理由尽量减少代码中系统调用的使用以及不使用系统调用的替代方法,有人会说使用 API 但 api 反过来使用系统调用

是真的吗??

【问题讨论】:

【参考方案1】:

因为大多数系统调用都有固有的开销。系统调用是一种进入内核的方法,是获取某些服务的受控网关。

执行系统调用时,会执行一些操作(警告,这是一种简化):

您调用库(包装)函数 该函数将参数放在预期的位置。该函数还将系统调用的编号放入eax 函数调用陷阱(int 0x80 或其他) 处理器切换到内核模式 内核调用一些system_call 例程 寄存器保存到内核堆栈中 检查参数是否有效 操作已执行 寄存器从内核堆栈中恢复 处理器返回用户模式 函数(终于...)返回

而且我可能忘记了一些步骤。这听起来是不是工作量很大?你想要的只是粗体部分。其余的都是开销。

【讨论】:

但是当一个 Api 被调用时,我们需要做更多的工作吗?? 另外一件事,如果我们完全省略使用系统调用将能够做任何工作?? @AMIT 当调用普通函数时,内核不需要参与。您可以简单地认为只执行粗体部分。例如,如果您有一个将两个数字相加的函数,则没有理由陷入内核模式。【参考方案2】:

system call 要求系统从用户模式切换到 Kernel mode。这使得系统调用变得昂贵。

一篇文章可以更好地理解这一点:

    Understanding User and Kernel Mode - 杰夫阿特伍德

【讨论】:

【参考方案3】:

首先,如果您使用框架或 API(例如,使用 wxWidgets 而不是手动渲染窗口或 GNU C 库),您的代码可以在不同操作系统之间移植。

其次,如果您使用 API,那么如果制造商更改操作系统的底层工作方式,您将不会遇到问题,因为 API(应该)与以前相同。

【讨论】:

【参考方案4】:

我现在想到的唯一原因是可移植性问题。如果您使用系统调用,您的代码将仅在该操作系统上运行。而如果你需要将相同的源代码编译到另一个操作系统上,你就会遇到麻烦,API可能会完全不同。

【讨论】:

以上是关于为啥我应该在我的代码中尽量减少系统调用的使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的 java 代码中没有调用通知

为啥在我的代码中调用复制构造函数而不是移动构造函数?

为啥当我使用 presentModelViewController 时未在我的 UITabBArController 中调用 viewWillAppear?

为啥我的闭包在我期望的时候没有被调用?

为啥在 GLFW 窗口中使用此代码在我的屏幕上没有绘制立方体?

我不知道为啥多线程编码不能减少我的代码中的计算时间