为什么我应该在代码中最小化系统调用的使用?

时间:2011-06-21 11:46:47

标签: operating-system system-calls

我想知道是否有任何理由在代码中最小化系统调用的使用以及不使用系统调用的替代方法,可以说使用API​​但api依次使用系统调用

是真的吗?

4 个答案:

答案 0 :(得分:12)

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

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

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

我可能忘记了一些步骤。这听起来不像很多工作吗?你想要的只是大胆的部分。其余的是开销。

答案 1 :(得分:1)

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

更好地理解这一点的文章:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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