进程是操作系统中最重要、最基本的概念之一。它是系统分配资源的基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。当执行一个程序的时候,至少会产生一个进程。我们如何对系统中的进程进行管理?
1.什么是进程?
进程(Process)是一个程序在其自身的虚拟地址空间中的一次执行活动。之所以要创建进程,就是为了使多个程序可以并发的执行,从而提高系统的资源利用率和吞吐量。
程序是为了完成某种任务而设计的软件,比如Apache 是程序。简单的说进程就是运行中的程序。
进程和程序的比较
1
程序:只是一个静态的指令集合;而进程是一个程序的动态执行过程,它具有生命期,是动态的产生和消亡的。
2
进程:是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源、不能被系统调度、也不能作为独立运行的单位,因此,它不占用系统的运行资源。
一个运行着的程序,可能有多个进程。 例如: WWW 服务器Apache,当管理员启动服务后,可能会有好多人来访问,也就是说许多用
户来同时请求httpd 服务,Apache 服务器将会创建有多个httpd 进程来对其进行服务。
所以说,程序和进程无一一对应的关系。一方面一个程序可以由多个进程所共用,即一个程序在运行过程中可以产生多个进程;另一方面,一个进程在生命期内可以顺序的执行若干个程序。
2.进程的分类
进程一般分为交互进程、批处理进程和守护进程三类。
1
交互进程:由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
2
批处理进程:不与特定的终端相关联,提交到等待队列种顺序执行的进程。
3
守护进程:在Linux在启动时初始化,需要时运行于后台的进程。
值得一提的是守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root 来启动。例如在Redhat Linux中,我们可以定义httpd 服务器的启动脚本的运行级别,此文件位于/etc/init.d 目录下,文件名是httpd,/etc/init.d/httpd 就是httpd 服务器的守护程序,当把它的运行级别设置为3 和5 时,当系统启动时,它会跟着启动:
#chkconfig --level 35 httpd on
3.进程的属性
每个进程都存在于机器的物理内存中。由于Linux(和UNIX)被设计为多用户系统,因此分配给每个进程的内存是受保护的,其他进程无法访问。进程在自己的内存中装入可执行指令的副本,同时保存它所管理的其他任何动态信息。进程带有CPU的访问限制、执行状态和它的优先级。
系统在管理进程时,按照进程的属性来进行管理,它们分别是:
1
PID:在Linux系统中总是有很多进程同时在运行,为了区分进程,每一个进程都有一个唯一的识别号,称为Process ID,简称PID。
2
父进程和PPID:新的进程可以用系统调用fork来产生,就是从一个已经存在的旧进程中派生出一个新进程来,旧的进程是新产生的进程的父进程,新进程是产生它的进程的子进程。父进程的ID号是PPID。
3
UID和GID:用户的识别号(UID)和组的识别号(GID)就是运行此进程的用户和组。
4
进程的状态:状态分为运行R、休眠S、僵尸Z等
5
进程执行的优先级
6
进程所连接的终端名
7
进程资源占用:比如占用资源大小(内存、CPU 占用量);
4.进程的启动方式
启动一个进程有两个主要途径∶手工启动和调度启动。
1
手工启动:由用户输入命令,直接启动一个进程便是手工启动进程。
2
调度启动:是事先进行设置,根据用户要求让系统自行启动。
手工启动进程又可以分为前台启动和后台启动。
1
前台启动:是手工启动一个进程的最常用的方式。一般地,用户键入一个命令“ls -l”,这就已经启动了一个进程,而且是一个前台的进程。
2
后台启动:直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在耗时进程的运行过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。在后台启动一个进程,可以在命令行后使用&命令。
5.进程监视工具
要监视系统的运行和查看系统的进程状态,可以使用ps、top、tree 等工具。
使用ps命令查看进程
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的。
ps –help会显示50多个用来自定义ps命令行为的不同选项。让情况复杂的是,不同版本的UNIX开发了自己的ps命令,这些命令之间没有相同的命令选项约定。
Linux版本的ps命令尽量设法满足使用具有不同UNIX背景的人群,对于任意一个指定功能经常会有多个选项,有些选项按照惯例有一个连字号(“-”),有些则没有。
ps命令的选项主要从进程的选择和输出选择定义。
进程的选择
用于进程选择的常见ps命令行选项如下表:
选项
说明
-A,-e,ax
所有进程
-C,commmand
所有commmand的实例
-t,--tty terminal
从terminal启动的所有进程
-U,--user,--User user
属于user的所有进程
-p,p,--pid N
Pid为N的进程
-r
显示运行中的进程
输出的选择
用来选择进程的哪些方面需要列出,常用输出的命令行选项如下表:
选项
说明
-f
详尽列表
-l,l
长格式
-j,j
作业格式
-o,o,--format str
用户定义的格式,使用由str指定的字段(str的可用字段可由ps L列出,或者通过查阅ps (1)man page获得)
ps命令与Linux中的其他命令相比,其命令行选项特征比较奇怪。实际上用户往往会不断尝试,直到他们找到适合于自己的组合,然后一直使用。例如,有些人喜欢用ps aux命令列出所有进程,然而许多人更喜欢用ps -ef命令。
举个例子
例如,想按照用户名和启动时间顺序显示进程,并且要显示所有用户的进程和无控制终端(后台进程)的进程,可以执行ps aux,下面是部分输出:
# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 19232 1500 ? Ss Jul09 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S Jul09 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jul09 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S Jul09 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Jul09 0:00 [stopper/0]
root 6 0.0 0.0 0 0 ? S Jul09 0:11 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Jul09 0:16 [events/0]
root 8 0.0 0.0 0 0 ? S Jul09 0:00 [events/0]
root 9 0.0 0.0 0 0 ? S Jul09 0:00 [events_long/0]
... ...
使用ps aux 或ps lax 来查看进程时,输出的各个进程属性含义如下表:
字段
说明
USER
进程的属主
PID
进程的ID
PPID
父进程
%CPU
进程占用的CPU 百分比
%MEM
占用内存的百分比;
NI
进程的NICE 值,数值大,表示较少占用CPU 时间
VSZ
进程虚拟大小;
RSS
驻留中页的数量;
TTY
终端ID
STAT
进程状态
WCHAN
正在等待的进程资源;
START
启动进程的时间;
TIME
进程消耗CPU 的时间;
COMMAND
命令的名称和参数;
使用top命令监控进程
ps命令仅仅是显示它运行的那一刻指定进程的统计信息。与之相比,top命令则用来实时监控机器上进程的状态。
如果要监视系统的实时状态,需要使用top 命令,下图是top 命令的输出:
1
摘要部分表示:
当前系统时间07 :14 :29,系统已经启动了14 小时37 分,目前有六个用户已经登录到系统中,load average 后面的三个值分别代表:最近1 秒、5 秒、15 秒的系统负载值。
2
Tasks 部分分别表示:
有129 个进程在内存中,其中1 个正在运行,128 个正在睡眠,0 个进程处于停止状态,0 个进程处于僵尸状态。
3
CPU 部分依次表示:
用户态进程(users)的CPU 使用,核心态进程(system)使用的CPU,nice 值为负的进程所使用的CPU,空闲(idle)CPU,由于进程等待(wait)所使用的CPU,硬件(hardirq)IRQ 所使用的CPU,软件IRQ(softirq)所使用的CPU。
4
Mem 和swap 部分依次表示:
总内存,已经使用的内存,空闲的内存,用于缓存文件系统的内存(buffers,主要存储目录信息)。交换内存的总容量,已经使用的交换内存,空闲得交换内存,用于缓存文件内容的内存(cached)。
后面的内容就是当前系统中的各个进程的状态,缺省情况下,top 命令每隔5秒钟刷新一次数据。
top命令运行时,可以使用如下命令,让top做出响应,不需要按回车键。
按键
命令
q
退出
h or ?
帮助
s
设置两次刷新时间间隔,以秒为单位;
Space
更新显示
M
按内存占用大小排序,由大到小;
P
按CPU 占用情况排序,由大到小
U
显示特定用户的进程
k
提示输入要杀死的进程ID,目的是用来杀死该进程(默认信号为15)
r
把renice 应用到一个进程,提示输入PID 和renice 的值;
N
以进程ID 大小排序,由大到小;
虽然top命令,通常不需要命令行选项就可以运行,但是它的确支持如下选项。
选项
说明
-d
在两次刷新之间延迟secs秒(默认为5秒)
-q
尽量经常刷新
-n N
刷新N次后退出
-b
以“批处理方式”运行,好像是在哑终端上写入一样
举个例子
使用top -n 1 指定刷新1次,-b以批处理方式运行。执行结果如下图:
关注我们
云运维联盟
专注Linux云平台运维
领取专属 10元无门槛券
私享最新 技术干货