进程和线程的区别(什么是进程控制块)

进程(Process)是计算机中的基本概念,用于管理和执行程序,它是一个正在运行的程序实例,它是一个独立的执行单元,具有自己的内存空间、代码、数据。
它允许多个任务同时运行,因为这样可以提高计算机系统的效率和多任务处理能力。
在操作系统中,每个进程都被分配一个唯一的正数 ID(Process ID),这个 PID 用于标识进程在系统中的唯一性。
进程的状态
从程序员的角度,我们可以将进程总结为下面三种状态之一:
运行状态(Runing)
进程要么在 CPU 上运行,要么在等待被执行,这是进程活跃并且执行任务的状态。
停止状态(Stopped)
进程的执行被「挂起」,不再被调度执行。当收到停止信号时,进程就停止。当收到继续执行信号时,进程再次开始运行。
终止状态(Terminated)
进程永远地停止了,它的执行已经结束。
程序和进程的区别
程序是静态的,它是一堆代码和数据的集合,也可以说是一组指令和数据的描述。它可以以目标文件存在于磁盘上,或者是加载到计算机的地址空间中,
进程是程序在执行时的一个具体实例。进程包括程序的代码、数据、堆栈以及一些系统资源的副本。每个进程都有自己独立的执行上下文。
程序运行在进程的上下文中,进程是程序的实际运行状态。多个进程可以同时运行不同的程序,从而允许多任务并行执行。
fork() 函数在新的子进程中,运行相同的程序,新的子进程是父进程的一个复制品。
而 execve() 函数在当前的上下文中加载并运行一个新的程序,它会覆盖当前进程的地址空间,但并不会创建一个新的进程,新程序的 PID 与原进程相同。
什么是子进程?
子进程(Child Process)是在一个父进程(Parent Process)的上下文中创建的新进程。
新创建的子进程几乎与父进程相同,它获得了父进程的地址空间的一份独立复制,包括父进程的代码、数据段、堆、共享库和用户栈。
父进程通过调用 fork() 函数创建一个新的运行的子进程。这个新的子进程可以访问父进程中已经打开的任何文件,而它们唯一的区别就在于它们的进程ID(PID)不同。这个机制允许在不同的进程中执行并行任务。
int main(){  pid_t pid;  int x = 1;  pid = Fork();    if (pid == 0){ /* Child */    printf(\\\"child : x=%d\\\\n\\\", ++x);    exit(0);  }  /* Parent */  printf(\\\"parent: x=%d\\\\n\\\", --x);  exit(0);}

输出结果是:

    linux> ./forkparent: x=0child : x=2
    我们通过观察 x 的值,可以明显地看到子进程在复制父进程的执行环境后,可以独立运行,不会受到父进程的干扰。
    我们画个进程图,会更方便于我们理解:

    在这个场景中,父进程初始化了变量 x,并调用了 fork() 函数创建了一个子进程。接下来,父子进程都执行了 printf 语句。
    从左到右排列的顶点表示了程序的不同状态,从而清晰展示了父进程和子进程的执行流程,以及它们之间的关系。
    在不同进程中的 printf 语句可以以任意顺序执行,具体取决于操作系统的调度。这种并发执行方式可能会导致程序输出的顺序不确定。
    回收子进程
    在操作系统中,当一个进程终止后,内核并不会立刻从系统中清除该进程。相反,它被操持在一种已终止的状态中,直到它被父进程回收。
    当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,并释放子进程占用的系统资源。从这时开始,该子进程被完全从系统中移除,不再占用系统资源,也不再存在于进程表中。
    如果一个已终止但未被回收的进程继续存在,它被称为「僵死进程」。僵死进程不再占用系统资源,但仍保留其在内核中的某些状态,以供父进程在以后的某个时刻回收它。
    僵死进程的存在通常是短暂的,因为父进程通常会尽快回收已终止的子进程。
    父进程已终止,子进程怎么办
    当一个父进程意外终止时,子进程并不会立即终止。相反,子进程会变成一个孤儿进程,因为它失去了其父进程。
    这个时候,内核会安排 init 进程(在 Unix 系统中通常是 PID 1)成为孤儿进程的新父进程。init 进程是系统启动时由内核创建的,并且在系统运行期间一直存在,因此它是所有进程的祖先。
    init 进程会定期扫描系统中的僵死进程(已终止但尚未被回收的进程),并将它们回收。这确保了即使父进程提前终止,僵死进程最终也会被回收,释放系统的内存资源和其他资源。init 进程充当了这个清理工作的角色,以确保系统的稳定性。
    虽然子进程的回收是有序进行的,但子进程回收的顺序可能因操作系统而异,甚至在相同的操作系统上,执行相同程序的不同时间也可能导致不同的回收顺序。这是因为内核会根据各种因素来决定回收的顺序,而不是按照特定的顺序来进行。

    题图生成:Pixabay
    内容优化:ChatGPT
    内容来源:《深入理解计算机系统》

    原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34540.html

    (0)
    小道研究's avatar小道研究
    上一篇 2024年4月15日 上午6:20
    下一篇 2024年4月15日 上午6:22

    相关推荐

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注