什么是程序?什么是进程?他们之间的区别是什么?

本篇文章详细讲解以下问题:什么是程序?什么是进程?他们之间的区别是什么?

灵魂拷问:程序与进程的区别?

程序与进程

  程序是包含一系列信息的文件,描述如何在运行时创建一个进程,如我们写的源代码文件,编译好的可执行文件 .out 文件等。所以在操作系统角度,程序是创建进程的描述。程序文件可以包含以下描述信息:

  1. 二进制格式标识 :每个程序都有用于描述可执行文件格式的信息。Linux 内核通过该信息来处理和解释文件中的其他信息。如ELF 可执行文件。
  2. 机器语言指令:机器语言程序对程序进行编码,得到指令,然后 CPU 去执行该指令。
  3. 程序入口地址:用于表示程序开始时的起始指令位置,CPU 从该位置开始执行。
  4. 数据:程序文件中包含的变量初值和程序使用的字面常量值
  5. 符号表与重定位表:描述程序中函数与变量的位置及名称。可以用于调试和运行时的符号解析(动态链接)。
  6. 共享库和动态链接信息:程序中的一些字段,用于程序运行时所需的共享库以及加载共享库的动态连接器的路径名。
  7. 其他信息:用于描述创建进程的其他信息。


  那什么是进程呢?进程是正在运行的程序实例。在系统角度,程序仅占用磁盘空间,不占用内存等其他资源,而进程是占用内存和CPU 资源。更加官方的来说,进程是具有一定程序功能的关于某个数据集合的一次运行活动。它是操作系统执行的基本单元,在传统操作系统中,进程既是基本的分配单元,也是基本的执行单元。

  再进一步来说,进程是内核定义的一个抽象实体(数据结构),并为该实体分配用于执行程序的各项系统资源。在我们写好源代码文件,通过 gcc 编译得到可执行文件,即程序。通过 ./file 执行,系统会创建一个新的进程,为执行该程序分配必须的系统资源(内存,CPU等)。

  对于内核来说,进程则是由用户内存空间内核数据结构组成。其中,用户内存空间存放程序代码及使用的变量,内核数据结构是用于维护进程的状态信息(如进程ID,虚拟内存表,打开的文件描述符,信号传递与处理的相关信息,进程资源使用及限制等信息),即进程控制块

  总的来说,程序是存储在硬盘的可执行文件,其用来描述创建进程的相关信息。而进程是运行的程序,其包含两个部分:处于用户空间的程序代码及变量与处于内核空间的进程状态信息(进程控制块)。

一键三连是对我最大的鼓励与支持。欢迎关注编程小镇,每天涨一点新姿势😄。