Linux进程管理

进程的简介

进程中主要有三个问题;1、进程是什么?2、进程的生命周期。3、进程的状态。

进程是什么

进程:顾名思义,进行程序;结合计算机运行时并补充语言,则可以理解为正在进行程序实例

理解程序

如下,我们现在在file1.txt文件下写一个程序;程序功能每个三秒就打印一次"…"

[root@localhost ~]#touch file1.txt
[root@localhost ~]#vim file1.txt
echo ......
sleep 3
echo ......
sleep 3
echo ......
sleep 3
[root@localhost ~]#chmod u+x file1.txt

当我们将file1.txt编写好并为ta赋予执行权后,file1.txt就已经成为了一个可运行的程序

理解进程(进行程序)

但我们开始使用这个程序的时候,即每三秒就打印一次"…"的效果时,就是在运行程序了;可以理解为当我们使用这个程序时,所出现的效果就是进程

那么计算机是怎么样执行这个进程的呢?我们将程序里的内容如"echo,sleep"称为命令,而file1.txt称为载体,命令+载体+计算机可以读懂我们写下的命令,这整个流程下来,就会计算机开始运行我们的程序即出现进程

如下,就是我们开始运行file.txt这个程序

image-20240911150220290

理解实例(实例是什么)

例如:当我们学习通收到一个作业时,这个作业上的内容,对于我们来说就是一个程序,当我们还没有完成作业时,但正在进行完成作业的这项动作时,这个时候就叫做运行实例,即程序在工作时被称为进程

进程总结

程序:写好了,但还没开始运行;如"/usr/bin/passwd"或是"/usr/sbin/useradd";可以看出程序是静态的

进程:类似与在Windows中双击.exe则开始运行程序;即是动态的,有生命周期

可以说是"使用命令=运行程序";并且进程需要以下几点来支撑

1、已分配内存的地址空间;2、安全属性(即特权和所有权,属主和属组);3、程序代码有一个或多个线程;4、进程状态,即程序是存活的还是死亡的

到达进程的过程,以运行passwd为例

1、root使用passwd,即开始执行"passwd"的程序文件文件"/usr/bin/passwd";唉?等等!你说怎么查找到passwd的程序执行文件?直接使用**“which passwd”**即可

2、程序文件"/usr/bin/passwd"的disk(磁盘)占用为28k,diskID不被分配,memory不被分配,cpu不被分配,network不被分配;其中memory、cpu和network是三大分配资源

3、开始运行程序文件"/usr/bin/passwd"时,"/usr/bin/passwd"就发生了一些变化,其中进程标识"PID和PPID"是比较重要的,还有diskID、memory、cpu和network的状态变成了需要分配

进程的状态大致上分为三种:1、正在运行(running );2、停止;3、退出(代表着马上结束)

进程的生命周期

在系统中,进程都是由父系进程而衍生出来的,在进程的生命周期中有个概念叫fork

专业术语介绍

fork:父系进程将自己复制一份,然后创建一个子进程。这时,新的进程才算产生出了,而每一个新进程会产生一个唯一的进程ID(这个进程ID就被称为PID)

PID:PID与系统的安全相关,用于满足跟踪安全性;我们可以将PID理解为我们每个人的身份证号

systemd:整个系统的第一个进程,被称为系统进程

进程的作用及定义

进程的作用:任何进程都可以创建子进程

进程的定义:所有的进程都是第一个系统进程(systemd)的后代

Centos往期的进程名

Centos5/6是系统进程:init

Centos7系统进程:systemd(其进程的名称与Windows一样)

Centos9系统进程:/usr/lib/systemd/systemd

所以计算机第一个进程就是systemd进程,然后再由systemd启动其他的进程,以此类推,系统内的我们所需要的进程就慢慢地启动起来了

进程的状态

进程常见的四种状态

1、running(正在运行);2、sleep(睡眠);3、stop(停止);4、zombie(僵持状态,意思就是进程被卡住了)

进程的工作

在程序运行时,CPU会对时间和资源的分配产生不断的变化;如下

但CPU遇到多个任务的时候,如运行着QQ、WC、Eg、VM等程序,CPU也是基于人类的大脑开发出来的,一心二用肯定是不行的,那又该怎么办呢?

则CPU会将不同的事务按照时间进行分割开来。和人一样,人们对吃饭、睡觉和工作等也会按照时间断进行分割,即该吃吃该睡睡;计算机也是和我们一样的,只不过CPU将时间断分割的非常的小,小的让我们很难察觉的到,因为CPU是以毫秒级来进行分割的

比如:我们在计算机上运行多个游戏,使得计算机非常的卡的原因;电脑鼠标移动卡的原因如下

当CPU处理非常多个的事务,就会造成CPU分配给某一个事情的时间太多了,鼠标移动时非常的卡就是因为CPU给其他任务的时间太多了,而给鼠标移动这个进程任务的时间是不够用的,时间一不够用就是会造成CPU的卡顿

进程管理

本章内容主要了解与进程相关的信息:PID、PPID;当前进程状态;内存分配情况;CPU;用户UID;进程名称

我们查看进程有两种方法:①静态查看进程ps;②动态查看进程top

静态查看进程ps

我们查看ps的操作类似与在Windows系统上使用任务管理器,只不过任务管理器更接近与是top动态的方式表现。相比之下,我们使用ps的方式可以类似与任务管理器(如杀死进程等)

语法:ps aux;该命令可以查看系统的全部进程信息;如下,我们查看系统进程的前两行(第一行为参数)

image-20240912192409965

参数说明

USER:运行进程的用户;PID:进程ID,PID重要的原因是我们就是依靠PID杀死进程的

%CPU:该进程的CPU占用率;%MEM:该进程的内存占用率;VSZ:该进程占用的虚拟内存(这里面的虚拟内存实则是硬盘给的空间)

RSS:该进程占用的实际内存;TTY:进程运行的终端

STAT:进程的状态,进程的状态基本上分为五种,分别是①R(running正在运行),②S(sleep睡眠),③T(stop停止的进程),④Z(zombie僵住了的进程),⑤X(已经挂掉了的进程)

START:进程的启动时间;TIME:进程占用CPU的总时间;COMMAND:进程的文件,或者说是进程名

查看能持续时间长的进程

因为像ls和cd等这种快速的进程,我们使用ps是非常难查看其进程,所以我们选择比较长时间的进程,如pwd、sleep 1000和vim等进程

我们通过开两个bash终端窗口来方便我们查看vim的进程,这里我们采用在VM虚拟机上使用vim在X shell上使用ps来查看进程;如下图

image-20240912201117860

如上图,只要我们的将vim一直保持着使用的状态,那么使用ps aux就会一直有vim该进程的信息;但我们可以注意到了,在上图中,我们使用ps查看的结果的第二行并不是关于vim进程的,而是关于ps过滤出vim进程的,即是grep的,因为我们现在关注的是vim进程,所以不用理会即可

进程排序

进程排序的原理是通过某些资源的高低(如CPU、内存等),来排列出所有进程当中最占用资源的进程是什么?

既然是排序,那么就会有升序和降序(减号是降序,没有减号即是升序);

语法:ps aux --sort 资源名(如%cpu、%mem和vsz等),该命令默认是升序,而想要降序排序则可以在资源名上面加上一个"-“,如"ps aux --sort -%cpu”

以下为查看实例,由于系统内运行的程序过多,我们缩减到查看ps的前十行

以cpu占用情况进行升序排列

[root@localhost ~]# ps aux --sort %cpu | head -10

image-20240912203307883

以mem占用情况进行升序排列

[root@localhost ~]# ps aux --sort %mem | head -10

image-20240912203425268

以vsz(虚拟内存)占用情况进行降序排列

[root@localhost ~]# ps aux --sort -vsz | head -10

image-20240912203555283

进程的父子关系

语法:ps -ef;会将PID和PPID打印出来,PID子进程编号,PPID父进程编号。每一个PID对应着一个PPID,而PPID就是对应PPID的父进程。换句话说,有PPID的进程衍生出PID的进程。如下,我们将ps aux和ps -ef的打印结果进行一个对比

image-20240912204339687

控制查看进程时显示的进程字段

语法:ps axo 自定义字段(多个字段之间可以用逗号隔开);如下,只查看使用ps查看进程中user、pid(优先级)、command(进程的程序文件)|只查看前十行

[root@localhost ~]# ps axo user,pid,command | head -10

image-20240912205448614

静态查看进程ps总结

在静态查看进程ps中,我们学会查看全部进程ps aux以及结果的参数;排序查询ps aux --sort 资源名

使用ps -ef查看进程的父子关系,即PPID和PID;还有自定义显示字段可以用ps axo 自定义字段

动态查看进程top

动态查看类似与任务管理器中的性能选项;使用方法很简单,直接输入top,如图,实际上使用top是一个动态的查看内容

image-20240912210322987

top上半部分参数内容

第一列:top - 21:06:07 up 2:31, 4 users, load average: 0.00, 0.00, 0.00

top:表示程序名;- 21:06:07 up 2:31表示系统时间和运行时间; 4 users:表示当前有4个用户在登录; load average表示CPU负载

第二列:Tasks: 210 total, 1 running, 209 sleeping, 0 stopped, 0 zombie

Tasks: 210 total:表示系统的进程总数;1 running:表示进程运行数;209 sleeping:表示进程睡眠数;0 stopped:表示进程停止数;0 zombie:表示进程僵死数

后三列是比较底层的信息了了解即可,而第三列基本表示不同进程占用的CPU:%Cpu0 : 0.3 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st

0.3 us:表示用户的CPU占比; 0.7 sy:表示系统的CPU占比;0.0 ni:表示优先级的CPU占比;98.7 id:表示id空闲的CPU占比; 0.0 wa:表示等待的CPU占比;0.3 hi:表示电脑硬件的CPU占比; 0.0 si:表示软件的CPU占比;0.0 st:表示该计算机在虚拟机中的占比

第四行和第五行的内容是关于存储的

top下半部分参数内容

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

2316 root 20 0 2240156 35152 19092 S 4.2 3.7 0:47.82 mate-indicators

PID:进程编号;USER:运行该进程的用户;PR和NI:进程优先级(稍后会了解)

VIRT:虚拟内存(即从硬盘哪里分过来的一部分)的使用情况;RES:真实的内存的使用情况;SHR:共享内存的使用情况

S:进程的状态,有R运行、S睡眠、T停止、Z僵死、X结束

TIME:进程运行的时间;COMMAND:现在显示的是哪个程序

top内部使指令

“h"或”?"表示帮助;"N"以PID的大小进行排序;"M"内存的使用进行排序

"z"显示为不同颜色;"Z"设置颜色

top使用技巧

单纯的只有一个top,可以立即查看当前的所有进程信息;我们还通过top中的"-d"选项可以对top的内容指定其刷新频率如下

[root@localhost ~]#top -d 1

如上述命令,可以看到top显示出来的内容以1s的形式刷新一次

除此之外,我们还可以通过"-p"选项来指定只查看哪个进程;如下述命令,指定查看10126进程使其的刷新率为1s,如果想查看多个进程的信息,可以输入多个PID并且以逗号来隔开

[root@localhost ~]#top -d 1 -p 10126

上述命令在实际的生产中可以搭配ps aux的过滤帮助我们实时监控一个程序的状态;如下,这里以vim作为例子

先使用ps找到vim的PID

[root@localhost ~]# ps aux | grep vim

image-20240912220723390

接着我们再使用top和top的选项进行实时监控

[root@localhost ~]# ps aux | grep vim

image-20240912220919157

动态查看进程top总结

在动态查看进程top中,我们了解到如何使用top来以动态的方式查看进程信息

并且还认识了使用top后的参数内容,另外还有使用top来进行实时监控进程信息

使用信号来控制进程kill

语法:kill -信号的编号 进程的PID

信号的种类

信号①SIGHUP重新加载配置;信号②SIGINT键盘中断(就是Ctrl+C);信号③SIGQUIT键盘退出(Ctrl+l);信号⑨强制退出,无条件的

信号15.SIGIERM终止(正常结束);信号18.SIGCONT继续;信号19.SIGSTOP暂停;信号20.SIGTSTP键盘暂停(Ctrl+Z)

上述说了这么多种信号,其实与kill最相关的是信号⑨和信号15

信号⑨和信号15的演示实例

首先我们需要知道信号⑨是非法的杀死程序,而信号15是正常地杀死程序;实验步骤如下

1、创建2个文件;2、通过一个终端,使用vim打开f1;3、通过另一个终端,也使用vim打开f2

4、通过第三个和第四个终端,查询两个程序的进程,查询到PID后使用top实现实时监控

5、在第五个终端上发送信号15和信号⑨,观察两个终端的状态;状态发送命令为"kill -15 PID号"和"kill -9 PID号"

全部的命令如下

终端③

[root@localhost ~]#touch f1 f2

终端①

[root@localhost ~]#vim f1

终端②

[root@localhost ~]#vim f2

终端③

[root@localhost ~]#ps aux | grep vim 
[root@localhost ~]#top -d 1 -p PID1

终端④

[root@localhost ~]#top -d 1 -p PID2

终端⑤

[root@localhost ~]#kill -15 PID1		#正常杀死进程
[root@localhost ~]#kill -9 PID2			#非法杀死进程

image-20240912224157738

image-20240912224915396

image-20240912224802106

使用信号来控制进程kill总结

这么多信号中,其实我们在日常的生产环境中就只需要记住几个信号的作用就可以了

信号⑨为杀死进程是最为重要的,还有信号19使进程暂停,既然有了暂停那肯定就有信号18为继续

进程的优先级

我们看到的优先级大多数都是以数值的方式展现出来的,然后以比较的方式体现出谁更加的优先。

我们学习进程优先级的目的主要是:①先是学习对进程优先级的查询;②然后我们查询完优先级后,就可以学习如何对进程优先级进行调整和控制

③从而实现通过调整进程优先级使的某些进程占用更多的系统资源

进程优先级的简介

时间片技术:前面我们提到了CPU在执行多任务的时候是通过使用时间分割的形式,即将事务分割成一个一个时间片来执行

术语为:Linux进程调度及多任务是每个CPU在一个时间点上只能处理一个进程,通过时间片技术,来同时运行多个程序

在top查看的优先级中我们分为两种优先级:就是在top中看到的两种优先级;①NI(nice优先级),②PR优先级

NI:为实际的nice值;PR(+20):将nice级别显示为映射到更大优先级队列,即在nice值的基础上在加20;如-20映射到0,-19映射到39

image-20240913194318779

进程优先级范围

image-20240913192847861

如上图所示;nice值越大,则优先级就越低;nice值越小,则优先级越高

进程所占用的资源的多少主要体现在一下方面:一个进程的优先级越小,就说明该进程的优先级占用的资源就越少;反之,进程的优先级越大,就说明该进程的优先级占用的资源就越大

NI:优先级可修改;PR:优先级不可修改(但可以通过修改NI的优先级然后映射到PR上)

为什么要设置两种优先级

其实,这两种优先级是分为静态优先级(NI)和动态优先级(PR)

在进程被创建之处,静态进程优先级(NI)就已经决定下来了,并且是不会随着时间的执行而改变

而动态优先级(PR)是根据系统做出的行为做出调整

例如,将查看图片的优先级大量的提高,可能使得比屏幕运行时的优先级还大,使得屏幕无法正常使用,这时,负责屏幕的进程进行适当的调整,避免屏幕无法使用的情况

综上所述:存在两种优先级的目的是为了保证在系统中更基础的进程(如屏幕的显示等)正常运行

使用ps命令查看进程的NI级别

使用ps只查看pid、command和NI的信息

[root@localhost ~]#ps axo pid,command,nice --sort=-nice | head -10

image-20240913203704549

启动具有不同的nice级别的进程

启动不同nice级别的进程换句话说就是调整启动进程的NI值

语法:nice -n -指定的NI值 进程 &;"&"的意思是将该进程从前台放到后台去,因为如果将这个睡眠进程放到前台后,这个进程就会占用我们输入命令的地方;如下

[root@localhost ~]#nice -n -5 sleep 6000 &			#将睡眠6000s的进程放进后台中
[root@localhost ~]#ps axo pid,command,nice --sort=-nice | grep sleep		#使用ps来查看sleep进程的几个指定选项

image-20240913205459736

重置NI优先级

在上述实验中,我们指定sleep进程的NI优先级为-5,现在我们想把其优先级该为-20,就可以使用我们的renice命令

[root@localhost ~]#renice -20 PID		#PID为启动sleep进程时的PID号

image-20240913210436582

进程的优先级总结

再学习进程优先级时,我们主要了解了使用top时所展现的两个参数,即NI和PR

了解到了这两个参数表示优先级,其中最重要且不能搞混的是,是NI值越大,优先级越小

除此之外,我们还掌握了使用ps如何查看NI优先级、如何指定进程的NI优先级和如何修改以启动的进程的NI优先级

作业控制jobs

前台占用现象

前台占用现象,顾名思义就是使用某些程序时会将前台的终端给占用掉,

如sleep 100,则sleep这个进程会将前台给占用100s,而像sleep这种指令我们就称之为是前台运行指令

作业控制中的专业术语(fg和bg)

fg(foregroup)

fg前台进程:前台进程在终端运行时,会占领终端;可以将后台进程放回前台

bg(backgroup)

bg后台进程:后台进程没有控制终端,不需要和终端进程交互,虽然看不见,但是在运行;可以将后台停止的进程重新唤醒

后台程序控制实例

观察前台的占领现象

使用sleep 200则开始运行sleep进程,使得大部分的输入已经无效了,但是我们可以通过Ctrl+c终止进程

[root@localhost ~]#sleep 200

image-20240913214004217

运行后台程序

使用命令"sleep 3000 &“;这里将原本的前台程序放入后台程序,得益于在命令末尾加上了一个”&"

[root@localhost ~]#sleep 3000 &

image-20240913214029244

使用ps查询所在的进程

image-20240913214055556

使用jobs查看后台进程

使用jobs系统会打印出后台运行的所有程序

[root@localhost ~]#jobs

image-20240913214329559

使用fg将后台程序调回前台

将后台程序调回前台,其实就是我们上面讲的作业控制中的术语中的fg,即与前台有关

[root@localhost ~]#fg 1		#数字"1"表示在jobs中查看的后台进程ID

image-20240913215020096

停止前台程序并查看是否该前台程序是否还存在与后台

使用Ctrl+Z则可以显示这个前台程序以停止,但实际上此时的sleep进程就只是在后台被停止了,我们可以再次使用"jobs"还是可以看到sleep的存在的,如下

image-20240913215415889

使用bg将停止的后台程序重新唤醒

bg与之前fg的使用方法一样

[root@localhost ~]#bg 1		#数字"1"表示在jobs中查看的后台进程ID

image-20240913220130900

消灭后台进程

一提到消灭,就避不开使用"kill";使用命令如下

[root@localhost ~]#kill %1		#该命令中的"%"表示现在kill的是后台进程;"1"表示kill掉的是后台进程1,这点可以使用jobs查看到

作业控制jobs总结

再作业控制中,我们观察到了前台程序占用前台的实例、如何使用"jobs"查看后台程序中有进程存在;

并且还掌握了怎么用"&"在命令上与程序上相关联将前台程序放入后台中,然后再使用**"fg"将后台程序调回前台**;

不仅如此,还可以使用**"Ctrl+Z"将刚刚调回前台的程序终止**,惊讶的是,该进程只是被重新放回了后台中并将其停止,并不会消失;

而后再使用**"bg"将原本使用"Ctrl+Z"停止的后台进程重新唤醒**;

最后我们的实验即将结束,需要做一个类似与关机的操作,我们知道关机前的习惯是将能下线的进程能下就下,所以在这里我们也要将该进程kill掉,这就又涉及到了kill的使用方法,并且还认识到了使用**"%"来表示这是一个后台程序**

虚拟文件系统proc

我们第一次看到过"proc",是使用在Linux系统的根目录中的一级目录中看到的(在"/"下使用ls或ll即可看见)

image-20240913223236707

proc简介

虚拟文件系统内存放着采集服务器为自身内核和进程运行的状态信息;如果这样不好理解我们在下面做一个实验

切换到/proc目录下使用vim对一个新的f1文件进行编辑,因为在/proc目录下是没有f1的,如果我们直接使用"vim f1",那么就会创造一个名为f1的新文件;去查看"vim f1"的PID,然后再去/proc目录下,查看有没有以该PID命名的目录;如下

image-20240913224020460

只要我们一旦将"vim f1"这个进程关闭,那么这个以PID命名的目录就会消失,无论使用find还是使用ls都查找不到;如下

image-20240913224258705

这也侧面的说明了"vim f1"这个进程的"身体"就存在与这个"/proc/PID数值"这个目录下面,一旦退出"vim f1"这个进程,则"/proc/PID数值"就会消失

了解proc内的部分内容

我们知道CPU、内存等资源的信息正好在/proc内也是存在的;如下

查看cpu的信息

[root@localhost ~]#cat /proc/cpuinfo

image-20240913224834869

查看内存的信息

[root@localhost ~]#cat /proc/meminfo

image-20240913224929904

查看内核的信息

[root@localhost ~]#cat /proc/cmdline

image-20240913225012719

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值