首页 > 解决方案 > 进程和常规函数调用之间的区别?

问题描述

我刚刚被介绍了一个过程的想法。

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

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

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

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

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

标签: processoperating-systemforkparent-child

解决方案


正如书中提到的那样,严格地谈论 linux 进程是程序的“实例”。这意味着它们包含您的程序需要“执行”的信息。

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

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

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

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


推荐阅读