Linux系统编程:进程_基础部分
Contents
进程和程序
进程(process) 是一个可执行 程序(program) 的实例。
程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程。
- 二进制格式标识 - 描述可执行文件格式的元信息(起始点、段信息等)。内核利用此信息来解释文件中的其他信息。
- 机器语言指令 - 对程序算法进行编码。
- 程序入口地址 - 标识程序开始执行时的起始指令位置。
- 数据 - 程序文件包含的变量初始值和程序使用的字面常量值。
- 符号表及重定位表。
- 共享库和动态链接信息。
- 其他信息
PS:以上内容均可通过readelf查看,具体请参阅《程序员的自我修养》。
进程 是由内核定义的抽象的实体,并为该实体分配用以执行程序的各项系统资源。
进程存在于 用户空间和内核空间。
- 用户空间 包含了程序代码以及代码所使用的变量。
- 内核空间 的内核数据结构用于维护进程的状态信息。
- 进程标识号
- 虚拟内存表
- 打开文件的描述符
- 信号传递及处理的有关信息
- 进程资源使用及限制
- 当前工作目录
- 其他信息
进程和程序的关系:一个程序可以创建多个进程。
进程号
系统中的没一个进程都有一个唯一的进程号(PID),对于系统调用来说,进程号可以作为传入参数,也可以是返回值。
Linux系统中,前三位进程号是固定的:
- 0号 - idle进程,用于在系统空闲时 “空转”。
- 1号 - init进程
- 系统内所有其他进程的祖先。
- 如果子进程的父进程终止,子进程会变为 孤儿进程,此时会由init进程接管该进程,回收该进程。
- 不同版本的Linux系统对应的程序可能有所不同,目前主流的为 systemd。
- 2号 - kthread进程,内核线程,只在内核空间内运行,也称为守海南护进程。
与进程号相关的系统调用有 getpid 和 getppid
- getpid - 返回当前进程的进程号。
- getppid - 返回父进程的进程号。