1、进程介绍
1、进程的概念
1、进程:硬盘将数据读取到内存,cpu取代码运行的过程 资源单位
程序运行的过程
进程是操作系统最核心的概念
2、线程:执行单位,一个进程中运行的程序。
多进程多线程,一个进程中可以同时运行多个线程
3、并发: 多个进程看起来像是同时运行,他是多道技术的由来 cpu
空间上的复用:程序存放在内存空间物理隔离,
时间上的复用:cpu在多个进程中来回切换
4、并行:实际并行的数量
4核8线程
5、程序运行的多个状态,运行态、就绪态、阻塞态
同步与异步的概念
他是提交任务的方式、同步即执行程序后,cpu会等程序执行完成后,再处理其他事、
异步执行程序,立即去处理其他事情,程序处理完,会发一个信息给到cpu
6、同一个程序可能对应多个程序 父进程:程序运行时产生的第一个进程:由父进程衍生fork()出来的进程 注意:如果父进程终止,子进程也会随之被终止。
2、进程的状态STAT(R、S、D、T、Z、X)
linux下的进程状态
R \运行态
fp:vim a.sh (a.sh里面的程序为 while true;do((1+3));done)
sh a.sh
ps aux | grep a.sh
S \可中断睡眠sleep,即在睡眠的过程中可以接收信号唤醒=》执行的IO操作可以得到硬件设备的响应。
fp:vim b.sh (b.sh里面的程序为 while true;do((1+3));sleep 1 ;done)
sh b.sh
ps aux | grep b.sh
D \不可中断睡眠。即在睡眠的过程中可以接收信号唤醒=执行的IO操作可以得不到硬件设备的响应。
fp:tar czf /root/egon.tar.gz /root/ /opt/
ps aux | grep tar
T \停止的进程
fp:vim a.txt
ctrl+z 中止vim程序后,再次查看状态发现是T
Z \僵尸进程 zimbie
X \死掉的进程(几乎看不见,因为死了就立即回收了)
l \代表以线程的方式运行,即多线程
fp:vim a.py
from threading import Thread
import time
import os
def task():
time.sleep(100)
if __name__ == "__main__":
print(os.getpid())
for i in range(10):
t=Thread(target=task)
t.start()
bash a.py
ps aux | grep [a].py
状态:pts/0 Sl+ bash a.py
| \管道符号代表多进程
< \程序的优先级最高
fp:nice 好心值 n范围-20 ~19
nice -n -20 sleep 3000&
nice -n 19 sleep 3000&
ps aux | grep [s]leep
N \代表此程序的优先级最低
s \进程包含子进程
fp:ps aux | grep nginx
里面的内容有:nginx:master prosess
nginx:worker process
+ \前台的进程组
3、进程状态切换
进程在运行中不断的改变状态:
1、就绪状态
当进程已分配到除CPU以外的所有必要的额资源,只要获得处理便可立即执行,这时的进程状态称为就绪状态
2、执行状态running
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态
3、阻塞状态blocked
正在执行的过程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种。例如,等待IO完成,申请缓冲区不能满足,等待信号等
就绪=》执行
处于就绪状态的进程,当调度器为其分配了处理机后,就变成了执行状态
执行=》就绪
执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪态。
执行=》阻塞
正在执行的进程等待某种时间无法继续执行时,便从执行状态变成阻塞状态
阻塞=》就绪
处于阻塞态的进程,如果等待的时间发生,则从阻塞态变成就绪态
2、查看进程
1、ps aux
1、ps aux是常用组合,查看进程用户、PID、占用CPU百分比、占用内存百分比、状态、执行命令等。
-a
-u
-x
[root@localhost ~]
查看结果显示
USER:运行进程的用户
PID:进程ID
%CPU:cpu占有率
%MEM:内存占有率 =》 memory size
VSZ:占用虚拟内存,单位:kb =》virtual memory size =与swap没有关系
RSS:占用实际内存,单位:kb =》Resident(居民) Set Size
TTY:进程运行的终端 Teletypewriter
STAT:进程状态
TIME:进程占用CPU的总时间
COMMAND:进程文件、进程名
带[]号的代表内核态进程
不带[]代表用户态进程
2、查看进程树
yum install psmisc
[root@egon ~]
psmisc-22.20-16.el7.x86_64
[root@egon ~]
[root@egon ~]
bash-bash-bash-bash-pstreerpm
3、查看ppid
ps -elf | grep nginx
4、动态的查看top
top
top -d 1
top -d 1 -p
top -d 1 -p `pgrep nginx | head -1`
top -d 1 -p `pgrep sshd | head -1`,33
top -d 1 -u egon
top -b -n 2 > top.txt
fp:su - egon -c "sleep 1000" &
ps aux | grep egon
pgrep -l -u egon
5、windows 系统中查看进程
tasklist | findstr + 某一个进程
6、top显示信息解释
第一部分:系统整体统计信息
load average 0.86.0.56.0.78 cpu平均1分钟的平均负载
us用户态进程占用cpu时间的百分比 user
sys 内核态进程占用cpu时间的百分比
ni 代表优先被调度的进程占用的cpu时间的百分比 nice
id cpu空闲的百分比 idel空闲的
wa cpu等待io的百分比 wait io
hi 硬件中断,处理硬件中断所占用cpu的时间 hard
si 软件中断,处理软件中断占用cpu的时间 soft
st 被偷走的cpu steal
中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的终端处理程序来影响设备的请求。
第一阶段:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作
第二阶段:用来延迟处理第一阶段未完成的工作,通常以内核线程的方式运行。
fp:第一阶段:当你接到第一个配送员电话时,你可以跟他说,你已经知道了,其他事见面再细说,然后就可以挂断电话了。
第二阶段:才是取外卖,然后见面聊发票的处理动作。
如此一来,第一个配送员不会在电话里占用你很长时间,第二个配送员来的时候,照样可以打通电话
平均负载是指,单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
假设现在在一个4、2、1核的cpu上,如果平均负载为2是意味着什么?
核心数 平均负载 含义
4 2 有一半的cpu是空闲的状态
2 2 cpu刚好完全占满内存
1 2 至少一半的进程抢不到cpu
观察cpu的负载情况,由于程序只进行数学运算。发现很快cpu就会被占满
观察cpu的负载情况,cpu有sleep等待,可以运行多个循环。
stress是linux系统压力测试的工具,可用作异常进程模拟平均负载升高的场景,yum inatall stress -y
stress --cpu 4 --timeout 3000
mpstat 是多核cpu性能分析工具,用来实时检查每个cpu的性能指标,以及所有cpu的平均指标。
mpstat -P ALL 3
pidstat 是一个常用的进程性能分析工具,用来实时查看进程的cpu,内存,IO,以及上下文切换等性能指标。
pidstat -u 1 5
7、查看进程状态
命令行选项
top -d 刷新时间s -p pid
top -d 刷新时间s -u 用户
内部命令
s
q
排序:
M 按照内存占用率从大到小排序
P 按照cpu占用率从大到小排序
N 按照PID从大到小排序
配合R代表倒序
shift + >
shift + <
按上下键查看所有进程
f 增加显示字段
k 给进程发信号 kill进程
数字1 :显示所有cpu的信息
z 高亮显示
3、shell管理进程
1、优先级设置
可以在启动进程时用nice命令设置优先级
1、命令
nice -n<优先级> [--help][--verdsion][执行命令]
2、PRI:代表这个进程可被执行的优先级,其值越小越早被执行
NI:代表这个进程的nice值
PRI即进程的优先级,此值越小进程的优先级别越高。而NI,就就是我们所说的nice值。其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变成“PRI(new)=PRI(old)+nice。
所以,nice命令设置的优先级不是程序最终的优先级,而只是优先级的修正数值。
renice命令允许用户修改一个正在运行的进程的优先权。
对已运行的进程设置新的优先级
renice -20 11111
2、给进程发送信号
kill -l
本信号在用户终端连接(正常或非正常)结束发出,通常是在终端的控制进程结束时,通知同一session内的各个作业,这是他们与控制终端不再关联。
登录linux时,系统会分配给登录用户一个终端(session)。在这个终端运行的所有的程序,包括前台进程组合后台进程组,一般属于这个session。当用户退出linux登录时,前台进程和后台有对终端输出的进程将会收到SIGHUP信号。
1、这个信号的默认操作为终止程序,前后台的进程都会中止。不过,可以捕获这个信号,比如wget能捕获SIGHUP信号、并忽略它,即使退出了linux登录,wget也能继续的下载。
2、此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
用来立即结束程序的运行,本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。
终止,是不带参数时kill默认发送的信号,默认是杀死进程,与SIGKILL不同的是该信号可以被阻塞和处理。通常用TERM信号来要求程序自己正常退出,如果进程终止不了,我们才会尝试SIGKILL.
如果父进程没有处理这个信号,也没有等待(wait)子进程。子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程为僵尸进程这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉他,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自由由init(systemd)进程来接管。
(1)kill -1 重新加载配置文件
1、先启动vfstpd服务
systemctl start vfstpd
ls /var/ftp
2、打开浏览器,输入,ftp//:192.168.12.54/,可以看到的是/var/ftp下的内容
3、修改vfstpd的配置文件,默认匿名用户共享目录改为/test
sed -i '$a anon_root=/test'/etc/vsftpd/vsftpd.conf 或者 echo 'anon_root=/test' >>/etc/vsftpd/vsftpd.conf
4、在不启动服务vsftp的情况下让其加载配置文件
ps aux | grep [v]sftpd
kill -1 pid
ps aux |grep [v]sftpd
5、打开浏览器,重新输入ftp//:192.168.12.54/,看到的是/test下的内容。
(2)kill 杀死进程
ps aux |grep [v]sftpd
kill 50695
ps aux |grep [v]sftpd
(3)kill -19 暂停进程与kill -18恢复进程
vim a.txt
ps aux | grep [v]im
kill -stop pid
ps aux | grep [v]im
kill -cont pid pid
(4)杀死所有:根据进程名杀所有
vim egon.txt &
vim egon.txt &
vim egon.txt &
pkill -9 vim
(5)查看某个用户的进程
pgrep -l -u egon