目录
第四章:进程
4.1进程管理
4.1.1进程管理需要的学习目标
4.1.1.1了解进程的相关信息
4.1.1.2僵尸进程的概念和处理方法:
4.1.1.3PID、PPID的概念以及特性:
4.1.1.4进程状态
4.1.2进程管理PS
4.1.2.1静态查看进程
4.1.2.1.1自定义查看进程的列信息
4.1.2.1.2进程排序(默认为升序排序)
4.1.2.1.3进程的父子关系
4.1.2.2动态查看进程
4.1.2.2.1top的选项
第四章:进程
4.1进程管理
4.1.1进程管理需要的学习目标
4.1.1.1了解进程的相关信息
进程的概念:进程:进程是已启动的可执行程序的运行,实例echo、read带有这种单词的就是一个程序,进程存储在内存中,内存速度很快。
进程的组成:进程标识符(PID):每个进程都有一个唯一的数字标识符,用于区分系统中的不同进程。
- 程序计数器(Program Counter, PC):指示了进程将要执行的下一条指令的地址。
- 寄存器集合:包括但不限于:
- 内存映像:进程的内存空间,包括:
- 文件描述符表:包含进程打开的所有文件和设备的引用。
- 环境变量:定义了进程执行时所需的环境信息。
- 当前工作目录:进程的当前目录,用于解析相对路径。
- 信号处理:定义了进程如何响应各种信号。
- 进程状态:如运行中(Running)、等待(Waiting)、停止(Stopped)或僵尸(Zombie)状态。
- 进程优先级:影响进程获得CPU时间片的频率。
程序与进程的区别:
程序:通常是通过某种语言编写的文本文件,一旦我们把程序执行起来了就是进程,Linux中./+文件名就是运行的意思,程序存储在外存中,但是外存很慢
程序编程进程之后的变化:简单来说程序就是还没被运行的计算机指令的集合,进程是计算机中当前正在前端或者后端运行的程序。程序变成进程之后会拥有一些东西
程序变成进程之后会拥有:
1.内存资源,程序在硬盘中,进程在内存中
2.CPU资源,CPU的1s 被分成了1000份(分片),有一个或者多个片来处理进程,占有CPU的0.2%的时间来处理。
3.网络资源,程序运行的时候可能会占用网络资源
4.名字PID(process Identify)
5.权限、自我复制等等。。。。。。
图解如下(最左侧alice为未被执行的初始程序):
进程的生命周期:
系统引导:计算机启动时,BIOS或UEFI固件首先执行,它会找到启动设备(如硬盘),并加载引导加载程序(Bootloader)。
- 加载操作系统:引导加载程序加载操作系统内核到内存中,并将其执行。操作系统内核是操作系统的核心部分,负责管理系统资源和控制硬件。
- 初始化进程创建:操作系统内核初始化后,会创建第一个用户空间的进程,通常这个进程的进程ID(PID)是1。在Linux系统中,这个进程是init,在Windows系统中,是smss.exe(Session Manager Subsystem)。由init生成的进程我们也叫它孩子进程,当CPU执行孩子进程的时候父进程是休眠的,因为CPU没有更多的算力投入到Process父进程的计算中了。
- 读取启动配置:第一个进程会根据操作系统的配置文件(如/etc/inittab在某些Linux发行版中,或注册表中的启动项在Windows中)来确定需要启动哪些服务和应用程序。
- 创建子进程
- 进程间通信:新创建的进程可能会需要与其他进程通信,操作系统提供了多种进程间通信(IPC)机制,如管道、消息队列、共享内存、套接字等。
- 用户登录:在多用户系统中,第一个进程或其子进程之一会负责启动登录管理器,允许用户登录系统。
- 桌面环境和会话管理:在用户登录后,会话管理器或类似的进程会启动桌面环境和用户的个人应用程序。
- 持续管理:第一个进程或其子进程可能还负责持续监控和管理系统的运行状态,包括处理系统日志、资源监控等。
- 正常结束的进程会重新返回到父级进程Process中,非正常结束的进程会变成Zombie僵尸进程。
4.1.1.2僵尸进程的概念和处理方法:
僵尸进程(Zombie Process)是一个已经完成执行但尚未被其父进程回收其进程描述符(即调用wait()或waitpid()系统调用)的进程。在Linux和其他类Unix操作系统中,僵尸进程占用系统资源,特别是进程表项,但不会消耗CPU时间。僵尸进程的进程描述符在进程终止后仍然保留在系统中,直到父进程调用了wait()或waitpid()来显式地回收它。
僵尸进程通常出现在以下情况:
- 子进程已经完成其执行并退出。
- 父进程没有调用wait()或waitpid()来读取子进程的退出状态。
僵尸进程的特征
- 它在进程列表中显示为“Z”状态。
- 它占用进程ID(PID)但不占用其他资源。
- 如果父进程没有正确处理,僵尸进程会一直存在。
解决方法
- 显式回收:
父进程应该调用wait()或waitpid()来显式地回收子进程的资源。这会读取子进程的退出状态,并释放其进程描述符。 - 使用wait()的循环:
在某些情况下,父进程可能不知道何时子进程会退出。在这种情况下,可以在父进程中使用一个循环来调用wait(),这样可以回收所有已经终止的子进程。 - 设置忽略子进程退出信号:
在某些编程实践中,可以通过设置子进程的信号处理函数来忽略SIGCHLD信号,然后周期性地调用waitpid(),传递-1作为第一个参数,这样会回收任何状态改变的子进程。 - 使用waitpid():
使用waitpid()可以指定等待特定PID的子进程,或者使用-1来等待任何子进程。 - 避免创建僵尸进程:
在程序设计时,确保每个子进程都有一个父进程来管理它。
使用守护进程(Daemon)来管理子进程,确保它们被适当地回收
- 使用ps命令检查:
使用ps命令加上适当的选项(如-e或-a)来检查系统中的僵尸进程。 - 重启系统:
如果僵尸进程过多,影响系统性能,重启系统可以清除所有进程,包括僵尸进程。 - 使用脚本或工具:
可以编写脚本或使用系统管理工具来监控和清理僵尸进程。
僵尸进程本身不会对系统造成直接的损害,但过多的僵尸进程可能会耗尽系统资源,导致新进程无法启动。因此,正确管理子进程的生命周期是避免僵尸进程问题的关键。
4.1.1.3PID、PPID的概念以及特性:
PID:当一个操作系统运行进程时,系统会自动为其分配一个唯一的标识符,这个标识符就是PID。PID是一个非零整数,具有唯一性,用于标识一个进程。PID一旦被分配给一个进程,就会伴随该进程的整个生命周期,直到进程结束。PID的目的是为了便于操作系统管理和标记进程。当进程的生命周期终止时,其PID会被释放,之后的进程可以再次使用这个PID。
PID(进程标识符)的特性
- 唯一性:PID是一个整数,用于唯一地标识系统中的每个进程。
- 范围:PID的范围通常从1到32767,但这个范围可以根据系统配置进行调整。
- 生命周期:PID在进程的整个生命周期内保持不变,直到进程终止。
- 特殊值:PID 1通常被分配给系统中的第一个用户级进程,即init进程,它是所有其他用户级进程的祖先。
PPID:在Linux系统中,PPID代表的是父进程的PID,即父进程的进程号。当一个进程被创建时,创建它的那个进程被称为父进程,而子进程通过PPID指出其父进程。PPID也是一个非零整数,与PID一样,用于标识进程之间的关系。通过编程调用getpid函数可以获取自身的进程标识符,而getppid函数则用于获取父进程的进程标识符。
PPID(父进程标识符)
- 关系:PPID是一个整数,表示创建当前进程的父进程的PID。
- 继承:当一个新进程被创建时,它会从其父进程那里继承PPID的值。
- 用途:PPID用于追踪进程的家族树,即进程之间的父子关系。
- 特殊值:如果一个进程的PPID为0,这通常意味着它是一个守护进程(Daemon),或者是由于某些原因父进程已经终止,而子进程变成了孤儿进程,随后被init进程收养。
处理孤儿进程
- 当一个父进程终止时,它的子进程如果没有被其他进程收养,就会变成孤儿进程。操作系统通常会将孤儿进程的PPID设置为1,即init进程,这样init进程就会在孤儿进程终止时回收其资源。
4.1.1.4进程状态
进程的状态共分为四类:R(运行中的进程)、S(睡眠的进程)、T(停止的进程)、Z(僵尸进程)
如果出现R+、S+等命令说明优先级比较高,如果有需要CPU会优先处理它。
4.1.2进程管理PS
4.1.2.1静态查看进程
在Linux中我们一般使用PS命令来完成对命令的静态查看。
ps aux
ps aux表示打开进程管理器,也可以使用ps a、ps u、ps x分别进行进程信息的查看,只不过它们略有不同,a选项表示显示所有终端的进程,包括其他用户的进程。u选项表示以用户友好的方式显示进程信息,包括用户、PID、CPU使用率、内存使用率、命令等。x选项表示显示没有控制终端的进程,即那些与终端无关的进程(下图则展示了a、u、x的三种不同的查看方式)。
配合管道(后期会讲)我们可以完成对进程更多的操作
例如:
ps aux | head -1
表示查看进程的表头,输出字段的含义
静态查看进程所显示的信息(如下图所示):
USER:运行进程的用户名。
PID:进程的ID。我们通过PID来杀死进程
%CPU:进程占用的CPU百分比。占了cpu百分之多少的资源,也称CPU占用率
1以下消耗不大,1以上消耗过大
%MEM:进程占用的内存百分比。
VSZ:虚拟内存大小(Virtual Size),进程使用的虚拟内存总量。
硬盘中我们拿出一部分当假内存使用,就叫做虚拟内存
RSS:实际内存大小(Resident Set Size),进程实际占用的物理内存量。
TTY:进程所在的终端类型,比如 pts/0 表示一个伪终端,只有自己一个窗口,本机打开。
pts/1表示文件在1号窗口远程打开,我们也可以通过控制终端名称杀死进程
STAT:进程的状态,例如 R 表示运行,S 表示睡眠。Z表示卡了,僵尸程序需要重启一下
START:进程的启动时间。
TIME:进程占用CPU的总时间。单位为秒,CPU处理文件的时间
COMMAND:启动进程的命令
4.1.2.1.1自定义查看进程的列信息
如果我们不想一次性查看进程的那么多的信息,假设我们只想查看进程的创建者、进程号、父级进程号、内存占用我们也可以使用PS命令,只不过选项不同
ps axo user,pid,ppid,%mem
注意事项:我们使用自定义查看进程信息的命令是axo不是aux,其次,属性列之间使用逗号进行分隔
4.1.2.1.2进程排序(默认为升序排序)
我们学会了使用自定义查看命令之后,假设我们还是想要user,pid,ppid,%mem查看这些自定义进程信息,但是在这些信息中有一个内存占用较高的前四项我要进行删除,我们可以将自定义进程属性列和排序功能进行结合。
ps axo user,pid,ppid,%mem --sort=-%-mem
排序的语法是--sort = 按照什么进行排序(如下图所示)
如果想要从小到大进行排序则要将“按照什么进行排序"的前面的‘-’删除
ps axo user,pid,ppid,%mem --sort=-%mem
我们发现计算机中会存在很多进行我们输入一遍命令之后会弹出很多行,但是我们又想进行排序又不想数据那么长,我们只想查看内存占用最高的那前几个,我们可以将自定义进程属性列、排序命令与管道相结合,创造出既可以自定义查看内容又可以进行排序还不会显得数据冗余过长,快速的找出我们想要的数据(如下图,我们找出了内存占比最高的两个进程)
ps axo user,pid,ppid,%mem --sort=-%mem | head -3
耗费cpu最多的程序是gnome-shell,gnome-shell:Windows的图形程序。PID为2160,kill之后桌面会崩溃,CPU占用率0.7,内存占用率10.7%(具体数值分情况讨论)
利用上述命令我们对就可以查看到内存排序的进程了,删除进程我们后期再讲。
4.1.2.1.3进程的父子关系
通过上述的基础理论知识学习,我们已经搞明白了何为父进程,何为子进程,而且明白了PID和PPID的概念以及父子进程的相互关系,那么我们在计算机中是如何查看哪些进程的父进程是谁呢?Linux中给我们提供了ps -ef命令。
ps -ef命令是一个常用的命令行工具,用于显示系统中所有进程的详细信息。这个命令的参数组合如下:
- -e:显示所有进程。
- -f:以完整格式显示进程列表,包括更多的信息,例如用户、终端、CPU和内存使用率等。
执行ps -ef后,你将获得一个包含许多列的长列表,显示了所有进程的详细信息。
ps -ef弹出的属性列为:
1.UID:用户ID
2.PID:程序ID(1号进程名称为system,操作系统本身的进程就是这个)
3.PPID:父系程序ID,PPID不为零说明有亲爹,PPID定位到PID就是那个进程的爹
4.C:CPU使用率的百分比(CPU usage),表示进程占用的CPU资源比例。
5.STIME:启动时间(start time)
6.TTY:终端
7.TIME:运行时间
8.CMD:程序名称
示例:ps -ef
假设A的PID是2 PPID是0
假设B的PID是0 PPID是2
那么B的爹就是A
PPID->PID
PPID映射PID
4.1.2.2动态查看进程top
PS静态查看进程的优点是不会过多的占用系统资源,但是如果我们想要实时查看进程信息的话用什么命令来实现呢?我们可以使用top命令完成对进程的实时查看
top
使用top 显示的信息一般有五行12列
五行(如下)
第一行:
top - 18:15:32 up 1 day ,12:18, 5 users, load average:0.00,0.06,0.06
程序名 - 系统时间 运行时间 登录用户数 cpu平局在5、10、15分钟内负载均衡的值
第二行(关于进程的汇总信息):
Tasks:361 total, 1running,360 sleeping, 0 stopped, 0 zombie
任务总数,正在运行的任务数,睡眠数、停止数、僵尸数
第三行(Cpu占用率):
%cpu(s)13.4us,5.7sy,0.0ni,80.8id,0.0wa,0.0hi,0.0si,0.0st
us表示由人执行的程序占用了多少cpu(%)
sy则表示系统
ni表示设置优先级的程序运算占用Cpu多少
id表示空闲Windows中的 Sysytem Idle进程代表了cpu还剩多少进程可用,不是占领了高的cpu占用率
wa表示等待
hi表示硬件
st表示虚拟机
第四行:
KiB MeM:2027936 total,80160 free, 1557772 used, 390004 buff/cache
物理内存总大小 闲置的物理内存大小 已经使用的物理内存 cache缓存的大小
第五行(虚拟内存,交换空间):
KiB Swap:2097148total,1199612 free, 897536 used。182468 avail Mem
虚拟内存总大小 空闲 已经使用的虚拟内存
十二列(如下)有
PID:进程编号
USER:谁启动的该进程
PR:系统优先级
NI:用户自定义优先级
VIRT
RES
SHR
这三个字母表示内存
S:状态
%CPU:CPU占用率
%MEM
TIME+:运行耗时
COMMAND:程序名
4.1.2.2.1top的选项
我们在输入top命令(如上)实时显示出进程信息的时候,top窗口会实时监听用户键盘的输入,当我们输入固定的指令的时候计算机才会执行相应的步骤
具体的指令如下:
h:获取帮助
M:按内存占比对进程进行排序
P:按CPU的占比进行排序
N:按PID的大小进行排序
< :向前翻页(需要按住SHIFT)
>:向后翻页(需要按住SHIFT) Z:设置字体为彩色
top的其他操作:
1.当我们想要将top的更新时间调整的更加频繁或者更加平缓,我们可以使用
top -d n (n为用户输入的数字,单位为秒)
来定义top命令的刷新时间
top每n秒刷新一次
例如:
top -d 0.2
top动态进程查看每0.2秒刷新一次
2.结束top窗口
我们可以输入ctrl + c、ESC、Q键来退出top窗口
当然,进程仍涉及到像优先级、进程信号、如何查看内存、如何查看磁盘空间、作业控制Jobs、虚拟文件系统等知识,大家不要急,我们马上就会讲到~
还是那句话,如果文章中哪些地方有问题或者不明白评论发即可~