Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Operating system 为什么我应该尽量减少在代码中使用系统调用?_Operating System_System Calls - Fatal编程技术网

Operating system 为什么我应该尽量减少在代码中使用系统调用?

Operating system 为什么我应该尽量减少在代码中使用系统调用?,operating-system,system-calls,Operating System,System Calls,我想知道是否有任何理由最小化代码中系统调用的使用,以及不使用系统调用的替代方法是什么,有人会说使用API,但API反过来使用系统调用 这是真的吗???因为大多数系统调用都有固有的开销。系统调用是进入内核的一种手段,内核是获得某种服务的受控网关 执行系统调用时,会执行一些操作(警告,这是一种简化): 调用库(包装器)函数 函数将参数放在预期的位置。该函数还将系统调用的编号放入eax 该函数调用一个陷阱(int0x80或其他) 处理器切换到内核模式 内核调用一些系统调用例程 寄存器保存到内核堆栈中

我想知道是否有任何理由最小化代码中系统调用的使用,以及不使用系统调用的替代方法是什么,有人会说使用API,但API反过来使用系统调用


这是真的吗???

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

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

  • 调用库(包装器)函数
  • 函数将参数放在预期的位置。该函数还将系统调用的编号放入
    eax
  • 该函数调用一个陷阱(
    int0x80
    或其他)
  • 处理器切换到内核模式
  • 内核调用一些
    系统调用
    例程
  • 寄存器保存到内核堆栈中
  • 参数被检查为有效
  • 执行该操作
  • 寄存器从内核堆栈中恢复
  • 处理器返回到用户模式
  • 函数(最终…)返回
我可能忘记了一些步骤。这听起来不是有很多工作要做吗?你想要的只是大胆的部分。其余部分是开销。

A要求系统从用户模式切换到。这使得系统调用非常昂贵

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

  • -杰夫·阿特伍德

  • 首先,如果您使用框架或API(例如,通过使用wxWidgets而不是手动呈现windows或GNU C库),那么您的代码可以在不同的操作系统之间移植


    其次,如果您使用的是API,那么如果制造商改变了操作系统的工作方式,您就不会有问题,因为API(应该)与以前一样。

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

    但是当调用API时,在这里,我们必须做更多的工作??如果我们完全省略系统调用的使用,还有一件事可以做任何工作???@AMIT当调用正常函数时,不需要涉及内核。您可以简单地认为只执行粗体部分。例如,如果您有一个添加两个数字的函数,那么就没有理由陷入内核模式。