Linux/Unix系统编程 五:进程

进程是一个可执行程序的实例

一、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 stst(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 结构中的 sysnamereleaseversionmachine 字段由内核自动设置。

utsname 结构中的 nodename 字段由 sethostname() 系统调用设置。

utsname 结构中的 domainname 字段由 setdomainname() 系统调用设置。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值