【问题标题】:How many system calls is performed?执行了多少系统调用?
【发布时间】:2015-01-17 21:19:51
【问题描述】:

我的问题是关于 Linux 中的系统调用。我听说一个在提示符中只打印“hello world”的简单程序可能需要多达 50 个系统调用。这是正确的吗?如果正确,所有这些调用中发生了什么?

【问题讨论】:

  • 系统调用的数量很大程度上取决于语言和编译选项。所以我不会说很多是必需的
  • 我听说计算机科学讨论中提到的数字多达 230% 被夸大了。

标签: linux system call


【解决方案1】:

您可以使用工具strace 打印出系统调用。只需启动前面带有 strace 的任何程序,如下所示:strace echo "Hello World"。您可能需要成为 root 用户才能使用它。

这里是manpage for strace

【讨论】:

  • 是的,我知道,但我的问题不是确切执行了多少系统调用,而是为什么需要这么多。执行一个新进程需要一个系统调用,但运行这样一个简单的程序还需要什么?
  • 您不会认真地期望我们解释每个电话,是吗?...浏览列表,谷歌(很多),如果仍然不清楚,请发布关于其中一个的问题。
  • 实际上,这正是您要问的 ;-)。他们每个人所做的正是 strace 将打印的内容。如果不进行大量挖掘,它可能不太可读,但它将是您可以获得的最准确的答案,适用于您的系统和您正在运行的命令。
  • @user3213297:“执行新进程”是系统调用,但不在您正在运行的进程中。 Hello-World 唯一实际需要的系统调用是write(stdout, "Hello World", 11)exit()。任何其他都来自您用于开发的语言的运行时库,并且可以支持更复杂程序中使用的功能。
  • 谢谢!一些很好的答案:)
【解决方案2】:

因此,即使软件很简单,您仍然需要考虑硬件在幕后发生的所有事情。在您的示例中,“一个仅在提示符中打印 'hello world' 的简单程序”,发生了很多事情。要开始思考为什么涉及这么多系统调用,请问问自己从磁盘获取文件并在 CPU 上执行其指令的底层机制是什么(其中一部分涉及写入输出流和更改监视器上的像素)。每次我们的用户空间应用程序想要访问这些硬件时,我们都需要进行系统调用。对于 hello world,我们需要在 hello-world.c 文件和 stdio.h 文件之间创建链接。这将需要许多系统调用。然后我们需要将链接的文件映射到内存中,(以便处理器可以执行)需要更多的系统调用。以此类推。

【讨论】:

    【解决方案3】:

    在 Linux(和 Windows)中,系统调用通常通过在 EAX 寄存器中传递 SysCallId 并执行int 0x80(软件中断)或SYSENTER(新指令)来执行

    基本上这会将控制权转移给内核,然后内核将使用传递的索引在其系统服务表中找到要执行的函数并执行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2011-07-26
      • 2014-03-26
      相关资源
      最近更新 更多