

Linux 进程管理 - 背对背依靠
source link: https://www.cnblogs.com/heyongshen/p/16480050.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Linux 进程管理
内核的功能和作用:文件系统管理、网络管理、进程管理、内存管理等,属于linux最基础的功能
进程:process,正在运行中的程序的一个副本。允许有多个进程同时执行。
#操作系统负责分配cpu运行进程的顺序和时间
#副本:把磁盘上的指定文件加载到内存进行运行 运行多次就会有多个副本
#多实例:一个程序生成多个副本,每个副本在内存中独立运行
#进程是资源使用的分配单位,进程存在声明周期
#PID:进程的唯一标号
进程创建过程: #进程的父子关系:写实复制
1. 操作系统启动的时候有个总进程(系统的第一个进程):centos6--init centos7及以上--systemd
2. 后续的所有进程都是总进程生成的,一次推类,构成一个树状结构,c语言使用fork()函数创建子进程
#父进程创建子进程的过程:
父进程在内存中占有一片空间,创建子进程的时候,此时子进程用的内存空间是父进程那一块空间。当子进程产生数据更新以后,就会复制父进程的空间来作为自己独立的空间。
线程:进程是系统资源分配的单位。进程在处理数据的时候,通过线程来完成任务。
#进程相当于一个组织,线程就相当于这个组织里面干活的员工。进程和线程是包含关系,多个线程共享进程的空间。
#线程在运行的时候的执行顺序由操作系统决定
#一颗CPU同时只能执行一件事,他将时间切成很小的时间片,不同的时间片做不同的任务,所以就感觉在同时做多件事情(实际上是轮流执行程序的)。
使用 pstree -p 可以看到系统中的进程和线程。#只有一个线程后面就不显示了(后面没有花括号)。
协程:一个协程就相当于一个函数。
进程、线程、协程的区别:
1.线程是程序执行的最小单位,进程是操作系统分配资源的最小单位;
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间
进程的结构
任务列表:操作系统允许运行多个进程,进程之间构成了一个进程列表(任务列表),所有进程都放在里面的。
PCB:存放一个具体进程的全部信息(包括进程编号、状态、优先级等),因为系统有多个进程,所以就存在多个PCB,每个PCB之间通过指针变量关联
页(Page)
页:进程内存资源的分配的最小单位,类似于文件系统的block,页的默认大小也是4k
虚拟地址和物理地址
虚拟地址:存放相对地址,位置是变化的。不是固定的。
应用程序看到的是虚拟地址
物理地址:具体的一个固定地址
MMU:内存管理单元(cpu中的硬件芯片),把虚拟地址转换成物理地址。
进程访问某个数据的时候,先把请求发送给操作系统,操作系统再交给cpu,cpu计算为物理地址,然后才能得到真正的数据。
tlb:缓存虚拟地址和物理地址的区域
内存的分配空间
-
用户空间:进程虚拟内存空间
-
内核空间:操作系统使用的
每个进程都包括5种不同的数据段
代码段:存放可执行文件的操作指令
数据段:存放初始化了的全局变量
BSS段:存放未初始化的全局变量 #Block Started by Symbol”的缩写,意为“以符号开始的块
栈:存放临时变量(比如函数里面使用的变量) #先进后出 队列就是先进先出
堆:存放数组、对象
进程使用内存问题
内存泄露: Memory Leak,分配的空间不释放,一直占用着
内存溢出:Memory Overflow,程序申请的空间不够用。
内存不足:OOM,内存不够用(java中的一种提示)
进程运行的状态
-
阻塞
使用 ps aux 可以看到进程的状态
进程更多的状态:
运行态:running #正在运行
就绪态:ready
睡眠态:进程不干活了,可中断:interruptable,不可中断(不能人为打断):uninterruptable
停止态:stopped,进程处于暂停的状态
僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死
态的子进程(这种进程不占用空间)
#结束僵尸态的方法:把它的父进程杀死就没了或者恢复父进程
LRU 算法
LRU:Least Recently Used 近期最少使用算法(喜新厌旧),用来实现内存的充分利用
IPC 进程之间的通信
IPC: Inter Process Communication
通信方法:
同一主机上:
管道:cmd1 | cmd2 (管道符的两边就开启了两个进程),单工通信 # | 这属于匿名管道
#命名管道:创建一个管道(pipe)文件,用来实现两个进程之间的通信。 A--->管道文件--->B
#创建管道文件的命令:mkfifo(fifo:先进先出)
#格式: mkfifo pipe_name
套接字:进程之间双向通讯
#查看套接字的方法:find / -type s -ls
文件映射:文件的数据映射到内存的一块空间中,多个进程共享这块内存空间
共享内存:直接在内存中分配一块空间,这块空间大家都能使用。
信号:trap -l 可以查看。发个信号进程收到以后就会按照指定的功能来进行操作。
跨主机通信:
socket:socket就是ip加上端口号。ip地址确定了设备在网络中的位置。端口号确定了设备上了具体应用程序。(使用tcp、udp协议都会分配要给与众不同的独有端口)
范例:利用管道文件实现 IPC
mkfifo /data/test.fifo #创建一个管道文件
ll /data/test.fifo #使用ll查看管道的信息,发现它的大小是0字节,
cat > /data/test.fifo #输入123456
#在管道文件里面写入数据以后,不会自动退出,且此时文件的大小依然是0,以为这个管道文件是在内存里面的,不是在磁盘里面。
#在另一个终端可以从文件中读取数据
cat /data/test.fifo #会读取到123456
进程的优先级
系统优先级范围:0-139
0-9:实时优先级(一些特殊的系统进程)
100-139:非实时优先级(大部分进程使用的都是这个范围)
#数字越小,优先级越高。
CentOS优先级:

nice数字范围:-20 -- +19 --对应系统优先级的100-139。 一般进程启动以后,优先级使用nice优先级的0
top显示的优先级是0-39,对应系统优先级的100-139
设置和调整进程优先级
操作系统分类:
-
协作式多任务:
-
抢占式多任务:
协作式多任务:一个任务得到cpu后,只有它主动放弃cpu,其他进程才能使用
抢占式多任务:CPU的控制权由操作系统控制(由操作系统分配cpu资源)
守护进程:daemon,计算机启动以后就自动运行,就和终端没关系了。
前台进程:跟终端相关,通过终端启动的进程
进程管理工具
pstree工具:
可以显示进程之间的父子关系
#格式:
pstree [选项] [pid|user] #可以查看指定的进程信息,也可以查看所有的进程关系
#选项:
-p:显示pid
-T:不显示线程
ps工具:
作用:实现进程信息的查看,默认显示当前终端中的进程(显示的是当前瞬间的状态)
#ps默认显示的是当前终端中用户运行的进程列表。
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
#格式:
ps [选项]
#三种选项风格:
UNIX选项 如: -A -e #单个字母
GNU选项 如: --help #完整单词
BSD选项 如: a #只需要一个字母
#常用选项:
a 选项包括所有终端中的进程
u 显示每个进程是以谁的身份运行等信息
x 显示和终端有关或无关的进程(和终端无端:随计算机启动就启动了)
o 属性… 显示指定的属性列 pid、cmd、%cpu、%mem
-e 显示所有进程,相当于-A
-f 显示完整格式程序信息
-p pid 显示指pid的进程
-t ttylist 指定tty,相当于 t
ps命令的输出信息:
C : ps -ef 显示列 C 表示cpu利用率
VSZ: 操作系统承诺给进程的空间(虚拟内存占用空间)
RSS: 操作系统实际给进程的空间(实际内存占用空间)
TTY:所在的终端,如果是?号表示和终端无关
STAT:进程状态
R:running #正在运行中的
S: interruptable sleeping #可中断的睡眠
D: uninterruptable sleeping #不可中断睡觉
T: stopped #停止
Z: zombie #僵尸
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,CentOS 8 新特性
ni: nice优先级,nice值 #范围-20 --- 19 对应:100-139
pri: priority 系统优先级数字 #数字越大,优先级越高
rtprio: 实时优先级 #对应系统0-99
psr: processor 显示进程和cpu之间的绑定关系 #进程在那颗cpu上运行
#ps -ef #unix风格
#ps aux #bsd风格
这个风格的选项显示的信息没有aux显示的要全
##查看进程的特定属性
例如:#ps axo pid,cmd,%mem,%cpu
#找到未知进程的执行程序文件路径
#ps命令显示的只是pid和程序的名称,没有显示程序的文件路径
ls -l /proc/1272/exe #1272表示进程的pid exe是一个软连接,指向程序的路径
#范例:查看优先级和CPU绑定关系
#ps axo pid,cmd,psr |grep 进程名
prtstat工具:
查看进程的信息
#格式
prtstat [选项] pid
例如:#prtstat 1026
[root@Centos8 ~]# prtstat 1026
Process: sshd State: S (sleeping)
CPU#: 1 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 1026 Parent ID: 1
Group ID: 1026 Session ID: 1026
T Group ID: -1
Page Faults
This Process (minor major): 718 8
Child Processes (minor major): 80458 11
CPU Times
This Process (user system guest blkio): 0.05 0.06 0.00 0.00
Child processes (user system guest): 93.69 11.96 0.00
Memory
Vsize: 94 MB
RSS: 7856 kB RSS Limit: 18446744073709 MB
Code Start: 0x56188adb7000 Code Stop: 0x56188ae83f38
Stack Start: 0x7fffde7c3120
Stack Pointer (ESP): 0 Inst Pointer (EIP): 0
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
查看某个进程的方法
- ps 选项 | grep 'pattern' #查找某个进程
- /sbin/pidof 按确切的程序名称查看pid
- pgrep工具
pgrep
专门的进程过滤工具
命令格式:
pgrep [options] pattern
# 选项:
-u uid: effective user,进程所有者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 指定进程名 #根据进程名显示进程信息
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
pidof
知道程序名,用来获取进程pid。
格式:pidof process _name
#选项:
-x: 查找脚本的进程id #脚本必须shebang机制开头,以bash的方式来运行找不到,需要加权限来运行才找得到
uptime
系统负载信息查询
#和w命令、top命令最上面显示的信息也是一样的。
#显示信息
当前时间
系统已启动的时间
当前上线人数
系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)
实时进程的查看:
-
htop工具
-
top工具
top工具
动态实时查看进程信息
#选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H 线程模式
#top命令显示的信息
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间
htop工具
top工具的增强版。
#选项;
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程
-s COLUME: 以指定字段进行排序
#子命令
s:跟踪选定进程的系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
t:显示进程树
CPU相关信息显示:mpstat工具
来源:sysstat包
显示信息说明:
CPU:
%usr:用户空间占用时间
%nice:nice优先级
%sys:系统内核占用时间
%iowait:io等待
%irq:中断
%soft:软中断
%steal:被虚拟机运行占用的时间
%guest:和虚拟化有关的
%gnice:虚拟机调整优先级
%idle:空闲的时间
PID(进程id)
USER(进程发起者)
PR(top里面的优先级)
NI(nice优先级)
VIRT(虚拟内存空间)
RES(实际内存占用空间)
SHR(共享内存占用空间)
S(进程状态)
%CPU(cpu利用率)
%MEM(内存)
TIME+(总的运行时间)
COMMAND(对应的命令)
内存相关信息查看
free 可以显示内存空间使用状态
选项:
-b 以字节为单位
-m 以MB为单位
-g 以GB为单位
-h 易读格式
-o 不显示-/+buffers/cache行
-t 显示RAM + swap的总和
-s n 刷新间隔为n秒
-c n 刷新n次后即退出
缓存的清理方法
向/proc/sys/vm/drop_caches中写入相应的修改值,会清理缓存
执行echo
1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的
查看进程打开文件 lsof
lsof:list open files,列出正在打开的文件。
#选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-g:列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目录下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-n<目录>:列出使用NFS的文件
-i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件
-u:列出UID号进程详情
-h:显示帮助信息
-v:显示版本信息。
-n: 不反向解析网络名字
查看某个端口是那个进程在使用
#查看所有正在打开的文件:
lsof
#找回被误删除的文件 前提是这个文件有人在访问
1. lsof | grep delete #过滤出被删除的文件,找到正在访问这个文件的进程编号
2. ll /proc/pid/fd #fd:文件描述符
3. cat /proc/pid/fd/文件描述符 > 导出为新文件
信号的管理
kill工具
用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以
SIG开头(可省略),不区分大小写
#显示当前可用的信号:
trap -l
kill -l
#常用信号:
1) SIGHUP 无须关闭进程而重新加载配置文件
2) SIGINT 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT 相当于ctrl+\ #退出进程
9) SIGKILL 强行关闭某个进程,可能会导致数据丢失(相当于按电源关机)
15) SIGTERM 正常关闭某个进程,默认信号
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠
#信号的描述方法
数字法:1, 2, 9
全称:SIGHUP,sighup
简称 去掉开头的SIG,HUP,hup
#向进程发送信号
通过pid的方式:
kill [-s sigspec | -n signum | -sigspec] pid
#-s sigspec:指定完整的信号名
#-n signum:信号的数字表示法
#-sigspec:信号的简写方法
#根据程序名发送信号
killall 程序名称
#0信号
信号为0,没有发送任何信号,仅仅检查进程是否正常工作。
格式: killall -0 程序名
例如:
[root@centos8 ~]#killall -0 ping
[root@centos8 ~]#echo $?
0
前台运行管理:
前台:依赖一个终端,在某个终端运行,启动以后就占用这个终端,在这个终端里面就不能做其他的操作了
例如: ping 127.0.0.1
后台运行管理
后代:不占用终端资源,在进程执行的时候加一个&符号
例如:ping 127.0.0.1 &
前后台运行的切换
默认大多数命令是前台执行,前后台是可以切换的。
CTRL+C就是给前台执行的程序发送终止信号,快捷键支队前台执行的生效。对后台执行的程序无效。需要使用kill命令来发送信号
前--后台切换方法:
CTRL+Z快捷键 --- 把前台程序放到后台(放到后台以后程序就不运行了),通过bg 作业编号 --把后台停止的作业恢复成后台运行态
作业编号的查询:jobs命令
或者 kill -18 %作业编号
后台运行-->后台停止:
发送19信号: kill -19 %作业编号 作业编号:jobs命令
后--前切换方法;
fg 作业编号

后台执行的作用:
前台执行都是按照循序执行的,后台执行可以实现并行执行
后台执行的任务在终端关闭以后也会随之关闭。
实现窗口关闭还继续执行的方法;
方法一:screen命令
程序执行之前开启screen:格式:screen
然后再输入要执行的命令
方法二:nohup命令
格式:nohhup 要执行的程序 -- 会有输出的信息
并行执行的实现:
并行执行:让多个进程同时执行
方法一:把他们都放到后台去执行
方法二:(f1.sh&);(f2.sh&);(f3.sh&) --小括号括起来,分号隔开
方法三:f1.sh&f2.sh&f3.sh&
范例:扫描ip地址
net=10.0.0
for i in {1..254};do
{
if ping -c1 -W1 $net.$i &> /dev/null;then
echo $net.$i is up
else
echo $net.$i is down
fi
}& #若里面有多个命令,就用花括号就是把它作为一个整体
done
wait #后台执行的进程结束之后,主动退出
Recommend
-
28
赣春 魔术贴扎带 背对背式 长钩款 10mm*5米 5色可选 4.6元包邮(需用券),来自什么值得买甄选出的天猫精选优惠产品,汇聚数十万什么值得买网友对该网购产品的点评。
-
36
文/FxWei来源:互联网圈内事(ID:quanneishi)假如把手机市场比做一场舞台剧,在退场的那条通道上,老罗和黄章怕是快要相遇了。在那个略显昏暗的退场过道里,两个桀骜不驯的人擦肩而过。他们谁都没有抬头看对方一眼,仅用余光扫到了彼此相似的尴尬与局促。老罗心想...
-
7
- 行编辑工具: 一行一行处理文件内容 - 全屏编辑工具:一次性将文件所有内容加载到内存中 sed编辑器: Stream Editor 工作原理: 逐行处理文件内容,一次读取一行内容到模...
-
5
Linux 加密安全和私有CA的搭建方法
-
4
Linux ssh协议 ssh:secure shell proto...
-
6
Linux 防火墙 安全技术:
-
12
搭建FTP服务器 FTP的工作原理: FTP:File Transfer Protocol ,文件传输协议。属于NAS存储的一种协议,基于CS结构。...
-
4
NTP 时间同步 NTP(Network Time Protocol)协议,网络时间协议。利用ntp协议可以实现网络中的计算机时间同步。
-
10
Linux文件权限管理介绍 一:Ubuntu 简介 1 、什么是Ubuntu Ubuntu是基于Debian开发的一个开源的Linux操作系统,Ubuntu这个名字名称来⾃⾮洲南部某种语言的一个词语,...
-
4
一:硬盘存储 1、存储类型 根据存储的特性不同,可以将存储分为内存和外存两类。 内存:又叫做主存储器,计算机中所有程序的运行都是在内存中进行。 外存:又叫做辅助存储器,...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK