【问题标题】:Difference between a process and a regular function call?进程和常规函数调用之间的区别?
【发布时间】:2020-08-16 21:15:39
【问题描述】:

我刚刚了解了流程的概念。

本书将进程定义为“正在运行的程序的实例”。

  1. 对于这意味着什么,我仍然有些困惑。在我看来,进程是程序正在运行的特定指令?或不?

  2. 函数调用和进程有什么区别?例如,假设我们有一个名为 main 的函数,在其中我们调用 printf 函数。 printf 算作一个单独的进程吗?为什么/为什么不?

  3. 是什么让某事成为子进程与父进程?我知道创建子进程的一种方法是调用 fork()。然后根据 fork 返回的整数值,我们可以在子进程中还是在父进程中。但是除了有什么东西可以让某个东西成为父进程和子进程吗?

  4. 同样基于问题 2 的答案,printf 是否算作子进程?

【问题讨论】:

  • tl;dr: 1. 不。 2. 不,printf 不算作一个单独的进程。 3. 除非您将clone 视为与fork 不同,否则不会。 4.没有。
  • 那么什么是进程?
  • 进程只是运行代码所需的程序的执行实体。进程具有运行它们所需的元数据。您可以从阅读任何操作系统书籍开始了解进程的概念。

标签: process operating-system fork parent-child


【解决方案1】:

严格按照 linux 进程来谈论是书中提到的程序的“实例”。这意味着它们包含您的程序需要“执行”的信息。

  1. 进程不是指程序正在运行的指令,而是指整个正在运行的程序。您所指的程序是我假设您编写的代码,但这只是该过程的一个方面。还有各种其他属性,如堆栈内存空间、堆内存空间和进程 ID 等,所有这些详细信息都存储在称为进程控制块 (PCB) 的数据结构中。 假设您有一个名为 fibonacci 的代码“Fibonacci.c”的编译版本,如果您从两个不同的终端运行它,它将产生同一程序的“两个进程”。

  2. 函数调用是在进程内部发生的事情。 printf 会发生在同一个函数中。它不能算作一个单独的进程,因为它是在同一个实体中执行的。

  3. fork 可以创建子进程。根据经验,我会说在我们当前进程中创建的任何进程都是子进程。虽然这可能不是一个严格的定义。 fork 所做的是复制当前进程,这意味着它通过创建一个新的 PCB 来创建一个新条目。它与调用 fork 的进程具有相同的代码段,但它有自己的内存空间、进程 ID 等。我不会更深入地介绍当 fork 发生时如何处理内存,但您可以在 man 中阅读更多相关信息页。

  4. printf 也不是子进程。它驻留在当前进程本身中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 2012-02-27
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多