1.什么是进程?线程?
进程(Process):是操作系统进行资源分配的最小单位。一个进程是一个程序的一次执行过程。每启动一个进程,操作系统就会为它分配一块独立的内存空间,用于存储PCB、数据段、程序段等资源。每个进程占有一块独立的内存空间。
线程(英语:thread)是操作系统能够进行运算调度的最小单位。线程是进程的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
通俗解释:一个进程指的是一个正在执行的应用程序。线程的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。程序执行流是从上倒下贯穿运行的。
线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。一个工厂可以容纳多个工人,工厂负责为所有工人提供必要的资源(电力、产品原料、食堂、厕所等),所有工人共享这些资源,每个工人负责完成一项具体的任务,他们相互配合,共同保证整个工厂的平稳运行。
每个进程执行前,操作系统都会为其分配所需的资源,包括要执行的程序代码、数据、内存空间、文件资源等。一个进程至少包含 1 个线程,可以包含多个线程,所有线程共享进程的资源,各个线程也可以拥有属于自己的私有资源。
2.进程的5种状态
在linux系统中,进程有5种状态,分别是:
R(TAKS_RUNNING) : 可执行态
S(TASK_INTRRUPTABLE) :可唤醒休眠
D(TASK_UNINTRRUPTABLE) :不可唤醒休眠
T(TASK_STOP) :暂停状态
Z(EXIT_ZOMBIE) :僵死态
下面详细介绍每一种状态:
(1)R(TAKS_RUNNING) : 可执行态
正在运行或者在就绪队列中等待运行的进程。此时进程资源已经准备就绪,就等运行。一个进程处于RUNNING并不代表他一定在被执行,由于在多任务系统中,各个就绪进程需要并发执行,所以某个特定时刻,这些处于RUNNING状态的进程中,只有一个能得到处理器,而其他进程必须有一个就绪队列中等待,即使在多处理器的系统中,linux只能同时让一个处理器执行任务。
(2) S(TASK_INTRRUPTABLE) :可唤醒休眠
处于这种状态的进程在等待队列中,当资源有效时,可以由操作系统进行唤醒,与不可唤醒休眠状态区别是:处于此状态中的进程也可以被其他进程所唤醒(可以被其他进程通过信号来唤醒,或者通过操作系统的wake_up()唤醒);唤醒后即可转为可执行态。
(3) D(TASK_UNINTRRUPTABLE) :不可唤醒休眠
处于这种状态的进程正在等待队列中,当资源有效时,可以由操作系统唤醒(通过wake_up()调用唤醒),否则一直处于等待状态;一般而言,Linux中如果我们等待的是磁盘资源,当进程等待磁盘资源拷贝写入的过程,此时进程处于阻塞状态,这种进程阻塞状态就是D状态(不可被中断),操作系统也不能杀掉该进程,只能等D状态进程自己醒来。等待磁盘给回应才能醒来。
(4) T(TASK_STOP) :暂停状态
停止运行(STOPPED),也就是挂起状态,进程被暂停,需要通过其它进程的信号才能被唤醒
(5) Z(EXIT_ZOMBIE) :僵死态
程序退出后的中间等待处理状态。表示进程结束但尚未消亡的一种状态,此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。
Z状态是一种已经死亡的状态,但是死了之后,不要让操作系统释放它。那该状态存在的意义是什么呢?当一个Linux中的进程退出的时候,一般不会直接进入X状态(死亡,资源可以立马回收),而是进入Z状态,为什么?
因为进程被创建出来一定是要有任务完成,当进程退出的时候,我们怎么知道进程把任务给我们完成了呢?需要将进程的执行结果告知给父进程或者操作系统。
子进程退出,维护Z状态,就是为了让父进程或者操作系统来读取执行结果!父进程和操作系统通过进程等待来读取僵尸进程的信息
僵死状态是一个比较特殊的状态。当进程退出并且父进程(使⽤用wait()系统调⽤)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。僵死进程会以终⽌止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
3.图形方式查看进程
(1)鼠标点击桌面查看
utilities-----> system moniter : 即可查看进程
(2)gnome命令查看
# gnome-system-monitor
4.PS命令详解
PS命令是Process Status的缩写,是在Linux中是查看进程的命令。可以用ps这个命令来获取进程的运行状态和管理进程。
在linux系统中,ps命令有为三种执行风格:
- Unix风格:参数前加单破折线,来源于贝尔实验室开发的AT&T Unix系统
- BSD风格:参数前不加破折线,来源于加州大学伯克利分校开发的一个Unix系统
- GNU风格:参数前面加双破折线,来源于GNU计划&Linux内核的Linux系统
# man ps : 查看ps命令的帮助
(1)Unix风格
参数 | 作用 |
---|---|
-e | 显示所有进程 |
-f | 显示信息的完整格式 |
-H | 显示进程的层级结构 |
-o | 显示指定参数 |
--sort | 排序 |
# ps -e : 显示所有进程
# ps -f : 显示信息的完整格式
# ps -H : 显示进程的层级结构
# ps -o 指定信息 : 显示指定信息
# ps -eo %cpu --sort = %cpu :升序排列所有进程的cpu信息
参数说明
参数 | 作用 |
---|---|
UID | 运行这个进程的用户(如果该用户名过长,会显示成用户id) |
PID | 进程ID |
PPID | 父进程ID(有时我们要干掉一个进程总是失败,这是我们要考虑是不是要干掉它的父进程) |
C | 该进程生命周期的CPU利用率(CPU使用时间/进程运行时间*100%,单位%) |
STIME | 进程启动该时的系统时间(进程的启动时间,时间较久显示日期,当天的显示具体时间HH:MM) |
TTY | 进程启动时的终端设备(?表示没有终端) |
TIME | 运行进程需要的累计CPU时间(就是到目前为止该进程使用CPU一共多久了)单位[dd]-hh:mm:ss |
CMD | 启动进程的命令 |
(2) BSD风格
参数 | 作用 |
---|---|
f | 进程层级关系 |
a | 显示跟任意终端关联的所有进程(当用户登陆系统后产生的进程都是带终端的) |
x | 显示所有的进程,甚至包括未分配任何终端的进程 |
r | 仅显示运行中的进程 |
u | 采用基于用户的格式显示 |
o | 显示指定参数 |
p | 显示指定pid的进程 |
# ps f : 显示层级关系
# ps a : 显示跟终端相关的进程
# ps x : 显示所有进程,内容包括ps a 的显示结果
# ps r : 仅显示运行中的进程
# ps u : 用户信息归类的查看方式
# ps o 指定参数 : 显示指定参数
# ps p pid : 显示指定pid的进程
# ps aux : 以用户格式显示所有进程
参数说明
对比Unix风格,主要多出了几个参数
参数 | 作用 |
---|---|
VSZ | 进程在内存中的大小,单位KB |
RSS | 进程在未换出时占用的物理内存 |
STAT | 代表当前进程状态的双字符状态码 第一个字符:S休眠 R运行 第二个字符:<高优先级进程 N低优先级进程 L有页面锁定在内存 s控制进程 l多线程进程 +前台进程 |
5.pgrep 和 pidof 命令详解
(1)pgrep命令
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。
# pgrep -u uid : 显示指定uid用户的进程id
# pgrep -U 用户名 :显示指定用户的进程id
# pgrep -t 终端名 :显示指定终端进程id
# pgrep -lU westos : 显示westos用户的进程id及名称,顺序一定!l在U前!
#pgep -lt pts/1 : 显示终端的进程id及名称
# pgrep -alU westos : 显示westos用户的进程id及完整名称,顺序一定!l在U前!
#pgep -alt pts/1 : 显示终端的进程id及完整名称
# pgrep -P 父进程号 :显示子进程id
首先在 shell-1 产生子进程 cat ,并查看父进程id
在shell-2 查看该子进程的id
在shell-3 利用pgrep 命令显示子进程的id,与上完全一致!证明该命令显示的是
id为7026的子进程的id
(2)pidof命令
pidof命令用于查找指定名称的进程的进程号id号。
# pidof 进程名 : 显示该进程的进程id
首先在shell-1 打开cat 进程,在shell-2打开vim进程
在shell-3利用pidof命令查看j进程id
6.top命令的用法
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
(1)top输出参数含义
# top : 实时显示进程的资源占用情况。
1)前5行参数信息
# 第一行 :任务队列信息
内容 | 含义 |
20:35:56 | 当前时间 |
up 41 min | 系统运行时间 格式为时:分 |
2 users | 当前登录用户数 |
load average: 0.00, 0.01, 0.05 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
# 第二行:任务状态信息统计
内容 | 含义 |
218 total | 进程总数 |
1 running | 正在运行的进程数 |
217 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
# 第三行:cpu信息
内容 | 含义 |
0.5 us | 用户空间占用CPU百分比 |
0.3 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
98.2 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.0 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0 st | 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间。 |
# 第四行:内存信息
内容 | 含义 |
2046936 total | 物理内存总量 |
445784 free | 空闲内存总量 |
683564 used | 使用的物理内存总量 |
917780 buff/cache | 用作内核缓存的内存量 |
# 第五行:交换区信息
内容 | 含义 |
2097148 total | 交换区总量 |
2097148 free | 空闲交换区总量 |
0 used | 使用的交换区总量 |
860784 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
2)进程信息
列名 | 含义 |
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb |
RES | 进程使用的、未被换出的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
S | 进程状态 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
(2)top内部指令
在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):
- ?:显示在top当中可以输入的命令
- P:以CPU的使用资源排序显示
- M:以内存的使用资源排序显示
- N:以pid排序显示
- T:由进程使用的时间累计排序显示
- k:给某一个pid一个信号。可以用来杀死进程
- r:给某个pid重新定制一个nice值(即优先级)
- q:退出top(用ctrl+c也可以退出top)
(3)top命令参数
- -d:指定刷新频率,表示top命令显示的页面更新一次的间隔。默认是3秒。
- -b:以批次方式显示,静态输出。
- -n:指定显示的批次数量,与-b结合使用。
- -p:指定特定的pid进程号进行观察。
7.进程的优先级
(1)优先级的概念
系统是多任务多用户的操作模式,任务的重要性是有区分。一般根据进程的优先级来确定任务的重要性。具体来说:
- cpu分配资源的先后顺序就是优先级
- 优先权高的进程有优先执行的权利
- 可以让进程运行在指定的cpu上,改善系统整体性能
(2)优先级的范围
- 范围: 0--139
- 内核自控优先级范围:0-99
- 用户可控优先级:100-139
我们只能更改用户可控优先级,即100-139!
nice值是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。
由nice的范围,可以推出pri的范围:
命令 | 含义 |
nice | -20~19 |
pri | 39~0 |
priority | 100~139 |
(3) 更改进程的优先级
# renice -n -5 进程id : 更改进程的优先级
# nice -n -5 进程名 : 指定优先级打开进程
(4)优先级相关的stat状态信息
# ps -o pid , nice , stat , comm :关注stat那一列
8. 进程的前后台调用
linux系统中有些命令会占用shell,我们可以将它打入后台刮起。eg:cat ,vim ,gedit
# < ctrl > + < z > : 把占用shell的进程打入后台挂起
# jobs : 查看当前shell在后台的所有工作
# bg 序号:把后台挂起的进程运行起来
# bg : 默认在后台运行有“+”号的进程
ps:有些进程可以执行后台运行操作,但会立即停止。因为运行需要界面支持,例如cat,vim命令。
# fg 序号:把指定的后台的进程调回前台
# fg : 把后面有“+”的进程调回前台
# 命令 & :直接运行进程在后台,不占用shell(有些命令无法后台运行,cat ,vim)
如果向结束在后台的进程,有两种方法:
1)将进程调回前台,在<ctrl>+<c>结束进程
2)# killall -9 进程名 : 结束指定进程
9.进程信号的理解
(1)进程信号的含义
利用# man 7 signal 可以查看进程信号的含义
具体的如下表:
(2)进程信号控制工具
# kill 进程信号 pid : 精准结束指定进程
# killall 进程信号 进程名字 :批量结束进程
# pkill 进程信号 进程条件 :按条件结束进程
(3)进程信号实验理解
# kill -2 6332 :清空该内存中的进程数据
ps: 输入命令后,一串字符后出现c(等于按了ctrl c),表示该数据被清空
# < ctrl > + < \ > : 鼠标消失,动一下就恢复了!(看视频全屏鼠标消失)
# kill -15 id :正常关闭进程,会被阻塞。
# kill -9 id : 强行结束进程,不会被阻塞。
ps:因为kill -15信号只是通知对应的进程要进行"安全、干净的退出",程序接到信号之后,退出前一般会进行一些"准备工作",如资源释放、临时文件清理等等,如果准备工作做完了,再进行程序的终止。但是,如果在"准备工作"进行过程中,遇到阻塞或者其他问题导致无法成功,那么应用程序可以选择忽略该终止信号。kill -9 是强制杀死一个进程,不管这个进程有多重要。
# kill -18 id : 运行被暂停的进程
# kill -19 id : 暂停进程,不会被阻塞
# kill -20 id : 暂停进程,会被阻塞
当运行被暂停的进程后,刚刚输入没出现的字符立即出现!
10.守护进程
(1)守护进程定义
Linux守护进程是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
(2) 实验环境设定
在虚拟机中添加与主机同一网段的ip:172.25.254.173
主机:172.25.254.73
具体添加步骤如下:
添加成功后用ip a 查看是否添加成功!
添加成功后,用虚拟机ping主机,一般可以ping通,但是这里我出了问题了! 虚拟机和主机相互无法ping通!
在同一网段一般可以ping 通,不用设置dns,网关.....
首先关闭防火墙,selinux,结果还是无法ping通,后来设置了桥接模式顺利解决!
保存后再次尝试ping,发现ping通拉!
ping通后我们利用ssh远程操作虚拟机!
# ssh -l root 172.25.254.173 : 远程连接到173虚拟机的root用户
之所以能连接是因为支持sshd这个服务!
(3) symtemctl 管理系统服务(以sshd服务为例)
systemctl 命令的含义如下:
命令 | 含义 |
start | 开启服务 |
stop | 关闭服务 |
status | 查看状态 |
reload | 重新加载 |
restart | 重新启动服务 |
enable | 设定服务开机自启动 |
disable | 设定服务开机不启动 |
enable --now | 设定服务开机启动并当前开启服务 |
diaable --now | 设定服务开机不启动并当前关闭服务 |
list-units | 查看系统所有服务当前状态 |
list-unit-files | 查看服务开机状态 |
list-dependencies | 列出服务的依赖性 |
mask | 冻结服务 |
unmask | 解冻服务 |
# systemctl status sshd : 查看sshd服务的状态
ps:可以看出该服务是开启的,所以主机才能ssh 虚拟机
# systemctl stop sshd : 关闭sshd服务
关闭sshd服务后,再次用真机ssh虚拟机,发现无法连接!
# systemctl start sshd : 开启sshd服务
# systemctl restart sshd : 重新启动服务,先stop再start(id变了)
# systemctl reload sshd : 重新加载服务,id不变!
# systemctl enable sshd :设定服务开机启动
# systemctl disable sshd :设定服务开机不启动
# systemctl able --now sshd :设定服务开机启动并当前开启服务
# systemctl disable -- now sshd :设定服务开机不启动并当前关闭服务
# systemctl list-units : 查看系统所有服务当前状态
# systemctl list-unit-files : 查看系统所有服务当前状态
# systemctl list-dependencies sshd : 列出sshd服务的依赖性
# systemctl mask sshd : 冻结服务
ps:冻结服务后无法通过start开启服务,必须解冻才可以!
# systemctl unmask sshd : 解冻服务!
# systemctl get-default :查看系统的运行级别
# runlevel : 查看运行级别---数字版 (一共有7个运行级别)
# init 6 : 重启 # init 5 : 开启有图形运行
运行级别 | 含义 |
0 | 关机 |
1 | 单用户 |
2-4 | 无图形 |
5 | 有图形 |
6 | 重启 |
# systemctl set-default multi-user.target :设定默认运行模式为无图形模式
# systemctl set-default graphical.target :设定默认运行模式为有图形模式
11. 系统登陆审计体系
统计登陆系统的账号信息
# w : 显示正在登陆系统的账号
# w -i :显示登陆系统账号的来源
ps:此时显示的是/var/run/utmp里的信息
# last : 显示过去登陆成功的账号,现在已经退出
ps:此时显示的是 /var/log/wtmp里的信息
# lastb : 显示尝试登陆没成功的账号!
ps:此时显示的是/var/log/btmp里的信息