《 Linux操作系统》第五讲 进程管理 学时计划:4学时理论,0学时实验 (无实验教学内容) 教学大纲: 1、进程 2、进程的监控 3、进程管理 4、/PROC文件系统 5、讨论与思考 Linux的进程管理与UNIX操作系统有着很多共同点,但也有 些独特的特性。 Linux是一种动态系统,能够适应不断变化的计算需 求。 Linux计算需求的表现是以进程的通用抽象为中心的。进程可以 是短期的,也可以是长期的,因此对进行及其调度进行一般管理就显 得极为重要。 本讲介绍 Linux进程的基本概念和生命周期,并重点介绍 Linux 的进程查看、管理和调度的工具的使用方法。 、进程 1.1进程的概念 Linux是一个多用户多任务的操作系统 多用户是指多个用户可以在同一时间使用同一个1inux系统;多 任务是指在 Linux下可以同时执行多个任务,更详细的说,1inux采 用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据 每个任务的优先级为每个任务分配合适的时间片,每个时间片很短, 用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系 统资源,因此 Linux可以在一个任务还未执行完时,暂时挂起此任务, 又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这 个任务完成,才从任务队列中去除。 1|(anx操作系统》讲稿/河南中医学院/阮晓龙/ phactcm.edu.cn
1 《Linux 操作系统》讲稿 / 河南中医学院 / 阮晓龙 / rxl@hactcm.edu.cn 《Linux 操作系统》第五讲: 进程管理 学时计划:4 学时 理论,0 学时 实验 (无实验教学内容) 教学大纲: 1、进程 2、进程的监控 3、进程管理 4、/PROC 文件系统 5、讨论与思考 Linux 的进程管理与 UNIX 操作系统有着很多共同点,但也有一 些独特的特性。Linux 是一种动态系统,能够适应不断变化的计算需 求。Linux 计算需求的表现是以进程的通用抽象为中心的。进程可以 是短期的,也可以是长期的,因此对进行及其调度进行一般管理就显 得极为重要。 本讲介绍 Linux 进程的基本概念和生命周期,并重点介绍 Linux 的进程查看、管理和调度的工具的使用方法。 一、进程 1.1 进程的概念 Linux 是一个多用户多任务的操作系统。 多用户是指多个用户可以在同一时间使用同一个 linux 系统;多 任务是指在 Linux 下可以同时执行多个任务,更详细的说,linux 采 用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据 每个任务的优先级为每个任务分配合适的时间片,每个时间片很短, 用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系 统资源,因此 Linux 可以在一个任务还未执行完时,暂时挂起此任务, 又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这 个任务完成,才从任务队列中去除
上述的描述是在一台计算机上只有一颗CPU,并且该CP只有 个核心的情形,在这种环境下,虽然系统可以运行多个任务,但是在 某一个时间点,CP只能执行一个进程。但是如果一台计算机有多颗 CPU,每颗CPU有多个核心的情形下,多任务的处理方式是不同的, 因此在某个时间点上,可以有多个进程同时运行。 进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的 程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称 为一个进程。 需要注意的是程序和进程是有区别的,进程虽然有程序产生,但 是它并不是程序,程序是一个进程指令的集合,它可以启用一个或多 个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进 程仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存 资源随之释放 例如,用户在 Linux上打开一个文件、就会产生一个打开文件的 进程,关闭文件,进程也随机关闭。如果在系统上启动一个服务,例 如启动 tomcat服务,就会产生一个对应的java的进程。而如果启动 apache服务,就会产生多个httpd进程。 关于进程的更详细的介绍,请参阅《操作系统原理》。 1.2进程的分类 按照进程的功能和运行的程序分类,进程可划分为两大类 系统进程:可以执行内存资源分配和进程切换等管理工作。该进 程的运行不受用户的干预,即使是root用户也不能干预系统进程的 运行。 用户进程:通过执行用户程序、应用程序或内核之外的系统程序 而产生的进程,此类进程可以在用户的控制下运行或关闭。 用户进程又可以细分为交互进程、批处理进程和守护进程三类。 交互进程:由一个shel1终端启动的进程,在执行过程中,需要 与用户进行交互操作,可以运行于前台,也可以运行在后台。 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进 程 2《Linux操作系统》讲稿/河南中医学院/阮晓龙/rx@hactcm.edu.cn
2 《Linux 操作系统》讲稿 / 河南中医学院 / 阮晓龙 / rxl@hactcm.edu.cn 上述的描述是在一台计算机上只有一颗 CPU,并且该 CPU 只有一 个核心的情形,在这种环境下,虽然系统可以运行多个任务,但是在 某一个时间点,CPU 只能执行一个进程。但是如果一台计算机有多颗 CPU,每颗 CPU 有多个核心的情形下,多任务的处理方式是不同的, 因此在某个时间点上,可以有多个进程同时运行。 进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的 程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称 为一个进程。 需要注意的是程序和进程是有区别的,进程虽然有程序产生,但 是它并不是程序,程序是一个进程指令的集合,它可以启用一个或多 个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进 程仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存 资源随之释放。 例如,用户在 Linux 上打开一个文件、就会产生一个打开文件的 进程,关闭文件,进程也随机关闭。如果在系统上启动一个服务,例 如启动 tomcat 服务,就会产生一个对应的 java 的进程。而如果启动 apache 服务,就会产生多个 httpd 进程。 关于进程的更详细的介绍,请参阅《操作系统原理》。 1.2 进程的分类 按照进程的功能和运行的程序分类,进程可划分为两大类: 系统进程:可以执行内存资源分配和进程切换等管理工作。该进 程的运行不受用户的干预,即使是 root 用户也不能干预系统进程的 运行。 用户进程:通过执行用户程序、应用程序或内核之外的系统程序 而产生的进程,此类进程可以在用户的控制下运行或关闭。 用户进程又可以细分为交互进程、批处理进程和守护进程三类。 交互进程:由一个 shell 终端启动的进程,在执行过程中,需要 与用户进行交互操作,可以运行于前台,也可以运行在后台。 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进 程
守护进程:守护进程是一直运行的一种进程,经常在 Linux系统 启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的 执行某种任务或等待处理某些发生的事件。例如htpd进程,一直处 于运行状态,等待用户的访问。 1.3进程的属性 1.3.1进程的状态 个进程在其生存期内,可处于一组不同的状态下,称为进程状 态。进程状态保存在进程任务结构的 state字段中。 当进程正在等待系统中的资源而处于等待状态时,则称其处于睡 眠等待状态。在 Linux系统中,睡眠等待状态分为可中断的和不可中 断的等待状态。 用户运行态 内核运行态 系统调用或中断返回 中断,中断返回 可状态( 睡眠 终止 僵死状态 zombie 睡眠 暂停 调度 不可中断睡眠状态 暂停状态 唤醒 继续 COIL 就绪态 running 技术成就梦想 图5-1进程状态及转换关系 进程的状态有五种情况,具体如下。 (1)运行状态( TASK RUNNING)。 当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行 则称该进程为处于运行状态( running)。若此时进程没有被CPU执行, 则称其处于就绪运行状态。见图5-1中3个标号为0的状态。进程可 以在内核态运行,也可以在用户态运行。当一个进程在内核代码中运 行时,称其处于内核运行态,或简称为内核态;当一个进程正在执行 3l(anx操作系统》讲稿/河南中医学院/阮晓龙/ phactcm.edu.cn
3 《Linux 操作系统》讲稿 / 河南中医学院 / 阮晓龙 / rxl@hactcm.edu.cn 守护进程:守护进程是一直运行的一种进程,经常在 Linux 系统 启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的 执行某种任务或等待处理某些发生的事件。例如 httpd 进程,一直处 于运行状态,等待用户的访问。 1.3 进程的属性 1.3.1 进程的状态 一个进程在其生存期内,可处于一组不同的状态下,称为进程状 态。进程状态保存在进程任务结构的 state 字段中。 当进程正在等待系统中的资源而处于等待状态时,则称其处于睡 眠等待状态。在 Linux 系统中,睡眠等待状态分为可中断的和不可中 断的等待状态。 进程的状态有五种情况,具体如下。 (1)运行状态(TASK_RUNNING)。 当进程正在被 CPU 执行,或已经准备就绪随时可由调度程序执行, 则称该进程为处于运行状态(running)。若此时进程没有被 CPU 执行, 则称其处于就绪运行状态。见图 5-1 中 3 个标号为 0 的状态。进程可 以在内核态运行,也可以在用户态运行。当一个进程在内核代码中运 行时,称其处于内核运行态,或简称为内核态;当一个进程正在执行 图 5-1 进程状态及转换关系
用户自己的代码时,称其为处于用户运行态(用户态)。当系统资源 已经可用时,进程就被唤醒而进入准备运行状态,该状态称为就绪态 这些状态在内核中表示方法相同,都被称为处于 TASK RUNNING状态。 当一个新进程刚被创建出后就处于本状态中 (2)可中断睡眠状态( TASK INTERRUPTIBLE)。 当进程处于可中断等待(睡眠)状态时,系统不会调度该进程执 行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程 收到一个信号,都可以唤醒进程转换到就绪状态(即可运行状态)。 (3)不可中断睡眠状态( TASK UNINTERRUPTIBLE)。 除了不会因为收到信号而被唤醒,该状态与可中断睡眠状态类似。 但处于该状态的进程只有被使用wake_upO函数明确唤醒时才能转换 到可运行的就绪状态。该状态通常在进程需要不受干扰地等待或者所 等待事件会很快发生时使用。 (4)暂停状态( TASK STOPPED)。 当进程收到信号 SIGSTOP、 SIGTSTP、 SIGTTIN或 SIGTTOU时就会 进入暂停状态。可向其发送 SIGCONT信号让进程转换到可运行状态。 进程在调试期间接收到任何信号均会进入该状态。 (5)僵死状态( TASK ZOMBIE)。 当进程已停止运行,但其父进程还没有调用wait0询问其状态 时,则称该进程处于僵死状态。为了让父进程能够获取其停止运行的 信息,此时子进程的任务数据结构信息还需要保留着。一旦父进程调 用wait(取得了子进程的信息,则处于该状态进程的任务数据结构 就会被释放。 当一个进程的运行时间片用完,系统就会使用调度程序强制切换 到其他的进程去执行。另外,如果进程在内核态执行时需要等待系统 的某个资源,此时该进程就会调用 sleep on(或 interruptible_ sleep_on(自愿地放弃CPU的使用权,而让调度程序 去执行其他进程。进程则进入睡眠状态( TASK UNINTERRUPTIBLE或 TASK INTERRUPTIBLE)。 只有当进程从"内核运行态"转移到"睡眠状态"时,内核才会进行 进程切换操作。在内核态下运行的进程不能被其他进程抢占,而且一 4|am操作系统》讲稿/河南中医学院/阮晓龙/@phactcm.edu.cn
4 《Linux 操作系统》讲稿 / 河南中医学院 / 阮晓龙 / rxl@hactcm.edu.cn 用户自己的代码时,称其为处于用户运行态(用户态)。当系统资源 已经可用时,进程就被唤醒而进入准备运行状态,该状态称为就绪态。 这些状态在内核中表示方法相同,都被称为处于 TASK_RUNNING状态。 当一个新进程刚被创建出后就处于本状态中。 (2)可中断睡眠状态(TASK_INTERRUPTIBLE)。 当进程处于可中断等待(睡眠)状态时,系统不会调度该进程执 行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程 收到一个信号,都可以唤醒进程转换到就绪状态(即可运行状态)。 (3)不可中断睡眠状态(TASK_UNINTERRUPTIBLE)。 除了不会因为收到信号而被唤醒,该状态与可中断睡眠状态类似。 但处于该状态的进程只有被使用wake_up()函数明确唤醒时才能转换 到可运行的就绪状态。该状态通常在进程需要不受干扰地等待或者所 等待事件会很快发生时使用。 (4)暂停状态(TASK_STOPPED)。 当进程收到信号 SIGSTOP、SIGTSTP、SIGTTIN 或 SIGTTOU 时就会 进入暂停状态。可向其发送 SIGCONT 信号让进程转换到可运行状态。 进程在调试期间接收到任何信号均会进入该状态。 (5)僵死状态(TASK_ZOMBIE)。 当进程已停止运行,但其父进程还没有调用 wait()询问其状态 时,则称该进程处于僵死状态。为了让父进程能够获取其停止运行的 信息,此时子进程的任务数据结构信息还需要保留着。一旦父进程调 用 wait()取得了子进程的信息,则处于该状态进程的任务数据结构 就会被释放。 当一个进程的运行时间片用完,系统就会使用调度程序强制切换 到其他的进程去执行。另外,如果进程在内核态执行时需要等待系统 的 某 个 资 源 , 此 时 该 进 程 就 会 调 用 sleep_on() 或 interruptible_sleep_on()自愿地放弃 CPU 的使用权,而让调度程序 去执行其他进程。进程则进入睡眠状态(TASK_UNINTERRUPTIBLE 或 TASK_INTERRUPTIBLE)。 只有当进程从"内核运行态"转移到"睡眠状态"时,内核才会进行 进程切换操作。在内核态下运行的进程不能被其他进程抢占,而且一
个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数 据错误,内核在执行临界区代码时会禁止一切中断。 1.3.2父进程和子进程 在 Linux系统中,进程ID(用PID表示)是区分不同进程的唯 标识,它们的大小是有限制的,最大ID为32768,用UID和GID 分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的 init进程的后代,内核在系统启动的最后阶段启动init进程,因而, 这个进程是 Linux下所有进程的父进程,用PPID表示父进程。 使用ps命令查看mysq1的进程信息,具体如下。 zhaodongfeng@ TeachServer - S ps auxlgrep mysql 7100.02.617697227484? Ssl Oct23 4: 17 /usr/sbin/mysqld 1000 4980 0.0 0.1 7928 1036 pts/0 S+ 23: 36 0: 00 grep -=auto mysql 相对于父进程,就存在子进程,一般每个进程都必须有一个父进 程,父进程与子进程之间是管理与被管理的关系,当父进程停止时, 子进程也随之消失,但是子进程关闭,父进程不一定终止。 如果父进程在子进程退出之前就退出,则所有子进程就变成的 个孤儿进程,如果没有相应的处理机制的话,这些孤儿进程就会一直 处于僵死状态,资源无法释放,此时解决的办法是在启动的进程内找 个进程作为这些孤儿进程的父进程,或者直接让init进程作为它 们的父进程,进而释放孤儿进程占用的资源。 进程的监控 不管是 Linux系统管理员还是程序开发人员,在工作中都不可避 免的需要查看系统进程的运行情况,以观测系统的运行情况和进行系 统维护操作。 2.1查看系统进程 2.1.1ps ps是最常用的监视进程的命令。ps命令给出了有关进程的所有 有用信息。由于UNIX和 Linux系统的历史比较复杂,发行的版本比 较混乱,所以ps的用法很多,并且比较混乱。 5|am操作系统》讲稿/河南中医学院/阮晓龙/ phactcm.edu.cn
5 《Linux 操作系统》讲稿 / 河南中医学院 / 阮晓龙 / rxl@hactcm.edu.cn 个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数 据错误,内核在执行临界区代码时会禁止一切中断。 1.3.2 父进程和子进程 在 Linux 系统中,进程 ID(用 PID 表示)是区分不同进程的唯 一标识,它们的大小是有限制的,最大 ID 为 32768,用 UID 和 GID 分别表示启动这个进程的用户和用户组。所有的进程都是 PID 为 1 的 init 进程的后代,内核在系统启动的最后阶段启动 init 进程,因而, 这个进程是 Linux 下所有进程的父进程,用 PPID 表示父进程。 使用 ps 命令查看 mysql 的进程信息,具体如下。 zhaodongfeng@TeachServer:~$ ps aux|grep mysql mysql 710 0.0 2.6 176972 27484 ? Ssl Oct23 4:17 /usr/sbin/mysqld 1000 4980 0.0 0.1 7928 1036 pts/0 S+ 23:36 0:00 grep --color=auto mysql 相对于父进程,就存在子进程,一般每个进程都必须有一个父进 程,父进程与子进程之间是管理与被管理的关系,当父进程停止时, 子进程也随之消失,但是子进程关闭,父进程不一定终止。 如果父进程在子进程退出之前就退出,则所有子进程就变成的一 个孤儿进程,如果没有相应的处理机制的话,这些孤儿进程就会一直 处于僵死状态,资源无法释放,此时解决的办法是在启动的进程内找 一个进程作为这些孤儿进程的父进程,或者直接让 init 进程作为它 们的父进程,进而释放孤儿进程占用的资源。 二、进程的监控 不管是 Linux 系统管理员还是程序开发人员,在工作中都不可避 免的需要查看系统进程的运行情况,以观测系统的运行情况和进行系 统维护操作。 2.1 查看系统进程 2.1.1ps ps 是最常用的监视进程的命令。ps 命令给出了有关进程的所有 有用信息。由于 UNIX 和 Linux 系统的历史比较复杂,发行的版本比 较混乱,所以 ps 的用法很多,并且比较混乱