process - 进程和常规函数调用之间的区别?
问题描述
我刚刚被介绍了一个过程的想法。
本书将进程定义为“正在运行的程序的实例”。
对于这意味着什么,我仍然有些困惑。在我看来,进程是程序正在运行的特定指令?或不?
函数调用和进程有什么区别?例如,假设我们有一个名为 main 的函数,在其中我们调用 printf 函数。printf 算作一个单独的进程吗?为什么/为什么不?
是什么让某事成为子进程与父进程?我知道创建子进程的一种方法是调用 fork()。然后根据 fork 返回的整数值,我们可以在子进程中还是在父进程中。但是除了有什么东西可以使某些东西成为父进程和子进程之外吗?
同样基于问题 2 的答案, printf 是否算作子进程?
解决方案
正如书中提到的那样,严格地谈论 linux 进程是程序的“实例”。这意味着它们包含您的程序需要“执行”的信息。
进程不是指程序正在运行的指令,而是指整个正在运行的程序。您所指的程序是我假设您编写的代码,但这只是该过程的一个方面。还有各种其他属性,如堆栈内存空间、堆内存空间和进程 ID 等,所有这些详细信息都存储在称为进程控制块 (PCB) 的数据结构中。假设您有一个名为 fibonacci 的代码“Fibonacci.c”的编译版本,如果您从两个不同的终端运行它,它将产生同一程序的“两个进程”。
函数调用是在进程内部发生的事情。printf 会发生在同一个函数中。它不能算作一个单独的进程,因为它是在同一个实体中执行的。
fork 可以创建子进程。根据经验,我会说在我们当前进程中创建的任何进程都是子进程。虽然这可能不是一个严格的定义。fork 所做的是复制当前进程,这意味着它通过创建新 PCB 来创建新条目。它与调用 fork 的进程具有相同的代码段,但它有自己的内存空间、进程 ID 等。我不会更深入地介绍当 fork 发生时如何处理内存,但您可以在 man 中阅读更多相关信息页。
printf 也不是子进程。它驻留在当前进程本身中。
推荐阅读
- javascript - React 中的大数
- xml - 需要使用 XSLT 1.0 将 XML 节点的文本分解为子节点
- node.js - Create-react-app 返回“找不到模块 'rxjs'”
- amazon-s3 - Localstack 服务“s3”尚不可用,正在重试
- yii2 - ckEditor 5 图片上传禁止 403
- reactjs - 尝试导入错误:未从“react-bootstrap”导出“十四行诗”
- javascript - rc-calendar 检测日期日历中的月份变化
- reactjs - React Redux PUT 请求失败
- javascript - GraphQL Mutation 如何与 Type 关联
- javascript - 使用不同的范围对象作为键访问 AngularJS 范围对象