进程是应用程序在内存中的基本执行单元,同时系统资源分配的基本单位。 Linux 下几乎所有的用户管理,资源分配等操作都是通过相应进程的控制来实现的。 知识大纲 『 *1 进程的概念,包括进程的组成,进程的状态等。 *2 Linux进程, 包括进程的状态,调度信息,标识符,进程间通信相关信息的获取等。 *3 进程的创建与控制,包括进程创建函数,进程终止,获取进程信息,守护进程等。 』 12.1 进程的概念 进程(Process)是指操作系统中被加载到内存中的,正在运行的应用程序实例。 它最初是随着批处理系统和分时系统的出现而引入的。 用户 : 进程是应用程序的一次执行过程。 OS内核 : 进程代表着OS分配的内存,CPU时间片等资源的基本单位,是为程序提供的运行环境。 Linux中,各个进程运行在其各自的地址空间中,具有独立的权限与职责,如果系统中某个进程崩溃,不会影响到其余的进程。进程之间只有通过通讯机制才能发生联系。 -12.1.1 进程的组成 进程主要由程序,数据,以及进程控制块 (PCB) 3个部分组成。 1), 程序 程序是描述进程功能的可执行机器指令,它通常作为一个静态文件存储在计算机系统的硬盘等存储设备之中。 2), 数据 数据是进程的操作对象,同一段程序在不同数据集上的执行过程是不同的进程。 3), 进程控制块 PCB 是 OS 中用来描述和控制进程的一种数据结构,它是进程存在的唯一标志。 PCB 主要包括 『 PID, PPID, 启动进程的UID, GID, 进程当前的状态,进程的优先级以及进程的资源占用情况等。 -12.1.2 进程状态的转化 在多任务OS中,进程在 CPU 上交替运行,状态不断改变。 三大基本状态 『 *1 运行态 *2 就绪态 *3 阻塞态 』 实际的操作系统中,除了上面的3大基本状态之外,还包括,新建态,终止态。 4* 新建态 :进程被创建但尚未被提交的状态。 进程创建分2个阶段 : 第一阶段为新进程创建必要的管理信息,第二阶段使该进程进入就绪态。 由于存在新建态,OS可能会根据系统的负载和内存的容量等情况推迟新建态进程的提交。 随着新进程不断地被创建,系统资源渐渐地不能满足所有进程运行的要求,尤其是内存资源。这时就需要将某些进程挂起,即将其换出内存,存放到磁盘交换分区中。这种状态进程之间的转换关系就如右图 (略)。 *1 活跃就绪态 *2 挂起就绪态 *3 活跃阻塞态 *4 挂起阻塞态 *5 运行 被挂起的进程不参加 CPU 调度,通过这种方式可以平衡系统的负载。 -12.2 Linux 进程 Linux系统中,每个进程由一个 task_struct 数据结构来描述,即前面提到的进程控制块PCB。 #include <linux/sched.h> task_struct 包含了进程管理和控制的所有信息。 struct task_struct { volatile long state; // 进程的状态 struct thread_info *thread_info; atomic_t usage; unsigned long flags; int lock_depth; ..... } -12.2.1 进程的状态 *1), 运行状态 *2), 等待状态(正在等待某个事件或资源) *3), 暂停状态 *4), 僵死状态。 (终止了,但还保留task_struct) -12.2.2 进程调度信息 -12.2.3 进程的标识符 -12.2.4 进程间通信相关信息 -12.2.5 进程链接信息 -12.2.6 时间和定时器信息 -12.2.7 文件系统信息 -12.2.8 其他信息 -12.3 进程的创建与控制 Linux系统下用于新进程创建的函数主要有4个 : fork 函数, vfork函数, system函数, popen函数。 进程终止有多种方式, 主要介绍 : exit函数和_exit函数。 -12.3.1 fork 函数 -12.3.2 vfork函数 和 exec 函数 -12.3.3 system 函数 -12.3.4 popen 函数 -12.3.5 进程终止 -12.3.6 获取进程信息 -12.4 守护进程 -12.4.1 守护进程的创建方法 (1),将子进程放入后台运行 (2),在子进程中创建新会话 (3), 关闭打开的文件描述符 (4), 改变工作目录 (5), 重设文件权限掩码 (6), 处理 SIGCHLD 信号 -12.4.2 守护进程的输出 -12.5 常见面试题 (1), Linux系统中进程主要有几种状态? (2), 在Linux系统中如何创建守护进程? -12.6 小结 Linux 是一个多用户,多任务的操作系统,进程管理是其内核中的一个重要的组成部分。 进程是程序在计算机系统上的一次执行活动,它不仅是系统内存独立运行的实体,还是资源竞争和分配的基本单位。理解进程的概念,掌握进程的创建,等待,终止等方法是本章及后续章节学习的基础,尤其是 fork, exec, system, wait 等函数。 守护进程(Daemon)是运行在后台的一种特殊进程,它通常伴随着Linux系统始终运行。因此如果要把自己的进程改造成为守护进程,务必要小心操作,同时还要深刻理解进程之间的相互关系。