命令行参数和文件 I/O 操作是否可能消耗 CPU 时间?

命令行参数和文件 I/O 操作是否可能消耗 CPU 时间?

根据定义中央处理器时间:

CPU 时间(或 CPU 执行时间)是给定程序执行开始和结束之间的时间。此时间占 CPU 计算给定程序的时间,包括代表程序执行的操作系统例程,但不包括等待 I/O 和运行其他程序的时间。

在测量进程的 CPU 时间时,诸如建立和关闭 I/O 流(用于命令行参数和文件)等操作所涉及的时间是否包含在 CPU 时间中?

答案1

是(对于健全的实现和合理的定义)

显然,如果您有类似的命令cat /etc/passwd,那么该进程将执行调用以open(2)打开文件。

稍微不那么明显的是,如果您有一个像打开文件的成本这样的命令,cat < /etc/passwd也将更改为该过程,至少对于典型的 shell 实现来说是这样。 shell 将按如下方式处理该命令。

  1. 它将发现这cat不是一个内置命令。因此它将创建一个新进程来运行它。传统上,这将使用 fork(2) 系统调用,但现在可以是 vfork 或克隆或生成系统调用,具体取决于系统。
  2. 原始进程将调用 wait 系统调用的某个版本,因为该命令未以&.
  3. 新进程仍在运行 shell。它将调用open打开文件,并将打开的文件安排在文件描述符 0 上。至少有几种方法可以做到这一点,但重点是这个新进程正在调用 open。
  4. 然后,新进程将自身转变为cat使用某些版本的exec系统调用。
  5. 最终cat将退出,并且原始 shell 将从其wait调用中返回。

因此,在这种情况下,新进程也会产生设置 I/O 流的成本。当然,与实际执行 I/O 相比,设置 I/O 的成本通常很小。

对于结束来说,事情有点复杂。与程序关联的运行时通常会刷新所有缓冲区并关闭打开的文件。执行此操作的时间是根据流程计算的。当进程退出时,所有剩余的打开文件都会被关闭。这样做的成本可能会也可能不会计入流程。

如果您有类似 FUSE 的东西,其中另一个进程正在提供文件系统,那么在另一个进程中执行打开操作所花费的时间将计入该进程,而不是进行打开调用的进程。

相关内容