进程和程序

进程(process) 是一个可执行 程序(program) 的实例。

程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程。

  • 二进制格式标识 - 描述可执行文件格式的元信息(起始点、段信息等)。内核利用此信息来解释文件中的其他信息。
  • 机器语言指令 - 对程序算法进行编码。
  • 程序入口地址 - 标识程序开始执行时的起始指令位置。
  • 数据 - 程序文件包含的变量初始值和程序使用的字面常量值。
  • 符号表及重定位表
  • 共享库和动态链接信息
  • 其他信息

PS:以上内容均可通过readelf查看,具体请参阅《程序员的自我修养》。

进程 是由内核定义的抽象的实体,并为该实体分配用以执行程序的各项系统资源。

进程存在于 用户空间和内核空间

  • 用户空间 包含了程序代码以及代码所使用的变量。
  • 内核空间 的内核数据结构用于维护进程的状态信息。
    • 进程标识号
    • 虚拟内存表
    • 打开文件的描述符
    • 信号传递及处理的有关信息
    • 进程资源使用及限制
    • 当前工作目录
    • 其他信息

进程和程序的关系:一个程序可以创建多个进程

进程号

系统中的没一个进程都有一个唯一的进程号(PID),对于系统调用来说,进程号可以作为传入参数,也可以是返回值。

Linux系统中,前三位进程号是固定的:

  • 0号 - idle进程,用于在系统空闲时 “空转”
  • 1号 - init进程
    • 系统内所有其他进程的祖先。
    • 如果子进程的父进程终止,子进程会变为 孤儿进程,此时会由init进程接管该进程,回收该进程。
    • 不同版本的Linux系统对应的程序可能有所不同,目前主流的为 systemd
  • 2号 - kthread进程,内核线程,只在内核空间内运行,也称为守海南护进程。

与进程号相关的系统调用有 getpidgetppid

  • getpid - 返回当前进程的进程号。
  • getppid - 返回父进程的进程号。

进程的内存布局

虚拟内存

栈和栈帧

命令行参数和环境列表