进程是一个可执行程序的实例。
一、linux系统进程管理
1、进程管理的作用
- 判断机器健康状态
- 查看系统中所有进程
- 杀手进程
2、查看系统进程
1、ps -aux
BSD操作系统格式:
TTY说明:
tty1 - tty7: 本地控制台终端
tty1 - tty6: 字符界面终端
tty7: 图形终端
pts/0 - pts/255: 虚拟终端
START常见状态:
R: 运行
S: 睡眠
D: 不可被唤醒的睡眠状态
Z: 僵尸进程
T: 停止状态
X: 死掉的进程
N: 优先级较低进程
L: 部分页被锁进内存
s: 包含子进程
l: 多线程
+: 位于后台
<: 优先级较高进程
2、ps -le
Linux 标准命令格式:
3、持续监听进程运行状态(top)
第一行为任务队列信息:
内容 | 说明 |
---|---|
09:39:43 | 系统当前时间 |
up 10:38 | 系统的运行时间,本机己经运行 10 小时 38 分钟 |
1 user | 当前登录了 1 个用户 |
load average: 0.07, 0.02, 0.00 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 |
第二行为进程信息:
内容 | 说明 |
---|---|
Tasks: 295 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
294 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为CPU 信息:
内容 | 说明 |
---|---|
%Cpu(s): 0.0 us | 用户模式占用的 CPU 百分比 |
0.0 sy | 系统模式占用的 CPU 百分比 |
0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
100.0 id | 空闲 CPU 占用的 CPU 百分比 |
0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
0.0 si | 软中断请求服务占用的 CPU 百分比 |
0.0 st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息:
内容 | 说明 |
---|---|
MiB Mem : 3901.5 total | 物理内存的总量 |
2538.2 free | 空闲的物理内存数量 |
560.5 used | 己经使用的物理内存数量 |
802.7 buff/cache | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息:
内容 | 说明 |
---|---|
MiB Swap: 923.3 total | 交换分区(虚拟内存)的总大小 |
923.3 free | 空闲交换分区的大小 |
0.0 used | 已经使用的交换分区的大小 |
3097.2 avail Mem | 作为缓存的交换分区的大小 |
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
第六行主要是系统进程信息,各个字段的含义如下:
内容 | 说明 |
---|---|
PID | 进程的 ID |
USER | 该进程所属的用户 |
PR | 优先级,数值越小优先级越高 |
NI | 优先级,数值越小、优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程的命令名 |
4、查看进程树(pstree)
5、终止进程
二、进程和程序
程序包含一系列信息文件,这些信息描述了如何在运行时创建一个进程,所包含内容如下:
- 二进制格式标志:每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解释文件中的其他信息。
- 机器语言指令:对程序算法进行编码。
- 程序入口地址:程序开始执行时的起始指令位置。
- 数据:程序文件包含的变量初始值和程序的字面常量。
- 符号表和重定位表:描述程序中函数和变量的位置及名称。
- 共享库和动态链接信息
- 其他信息:用于描述如何创建进程。
可以用一个程序来创建许多进程。
进程:由内核定义的抽象实体,并为该实体分配用于执行程序的各项系统资源。
从内核角度看,进程由用户内存空间和一系列内核数据结构组成。
- 用户空间:包含程序代码及代码所使用的变量。
- 内核数据结构:用于维护进程状态信息。
三、进程号和父进程号
每个进程都有一个进程号(PID),进程号是一个正数,用以标识系统中的某个进程。
1、getpid()
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
1、参数
2、返回值
返回类型为 pid_t 的进程号。
2、getppid()
#include <sys/types.h>
#include <unistd.h>
pid_t getppid(void);
1、参数
2、返回值
返回类型为 pid_t 的父进程号。
如果子进程的父进程终止,则子进程就会变成“孤儿”,init 进程随即将收养该进程,子进程后续对 getppid() 的调用将返回进程号 1。
四、/proc 文件系统
1、/proc/PID
对于每个进程,内核都提供了相应的目录,命名为 /proc/PID,其中PID是进程的ID。在此目录中的各种文件和子目录包含了进程的相关信息。
每个 /proc/PID 目录中都存在一个命名为 status 的文件,提供了有关进程的一系列信息。
该文件格式随着时间推移不断演变。
/proc/PID 目录中的部分文件:
1、/proc/PID/fd
/proc/PID/fd 目录为进程打开的每个文件描述符都包含一个符号链接,每个符号链接的名称都与描述符的数值相匹配。
2、/proc/PID/task
针对进程指令的每个线程,内核提供了以/proc/PID/task/TID命名的子目录,其中TID时该线程的线程ID。
每个/proc/PID/task/TID子目录中都有一套类似于/proc/PID目录内容的文件和目录。因为线程共享了多个属性,所以这些文件中的许多信息堆进程中各个线程而言都是相同的。
2、/proc 目录下的系统信息
/proc 目录下的各种文件系统和子目录提供了对系统级信息的访问。
3、访问 /proc 文件
通常使用 shell 脚本来访问 /proc 目录下文件。也可以从程序中使用常规 I/O 系统调用访问 /proc 目录下的文件。但在访问这些文件时,有如下一些限制。
- /proc 目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行修改。/proc/PID 目录下的大多数文件就属于此类型。
- /proc 目录下的一些文件仅能由文件拥有者(或特权进程)读取。
- 除了 /proc/PID 子目录中的文件,/proc 目录的其他文件大多属于 root 用户,并且也仅有 root 用户能够修改那些可修改的文件。
1、访问 /proc/PID 目录中的文件
/proc/PID 目录内容变化不定。每个目录随着进程创建而创建,随着进程的终止而灭。
五、系统标识:uname()
uname() 系统调用返回一系列关于主机系统的标识信息。
1、uname命令
uname [-amnrsv][--help][--version]
参数:
- a或–all 显示全部的信息。
- -m或–machine 显示电脑类型。
- -n或–nodename 显示在网络上的主机名称。
- -r或–release 显示操作系统的发行编号。
- -s或–sysname 显示操作系统名称。
- -v 显示操作系统的版本。
- -p或–processor 输出处理器类型或"unknown";
- -i或–hardware-platform 输出硬件平台或"unknown";
- -o或–operating-system 输出操作系统名称;
- –help 显示帮助。
- –version 显示版本信息。
2、uname() 系统调用
#include <sys/utsname.h>
int uname(struct utsname *buf);
struct utsname {
char sysname[]; /* Operating system name (e.g., "Linux") 操作系统名称 */
char nodename[]; /* Name within "some implementation-defined network" 网络中名称 */
char release[]; /* Operating system release (e.g., "2.6.28") 操作系统发行编号 */
char version[]; /* Operating system version 操作系统版本 */
char machine[]; /* Hardware identifier 硬件标识符 */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name NIS 或 YP 域名 */
#endif
};
SUSv3 规范了 uname(),但对 utsname 结构中各种字段的长度未加定义,仅要求字符串以空字节终止。
utsname 结构中的 sysname、release、version 和 machine 字段由内核自动设置。
utsname 结构中的 nodename 字段由 sethostname() 系统调用设置。
utsname 结构中的 domainname 字段由 setdomainname() 系统调用设置。