目录
1.进程介绍
2.查看进程
3.发送信号
4.进程优先级
1.进程介绍
在 Windows中打开任务管理器就可以查看到系统中的所有进程,如下图所示
这里列出了系统中所有的进程,不过也可以使用命令行工具来查看进程。每个进程都会有一个 Process ID,简称为PID。
2.查看进程
也可以使用ps命令来查看系统中的进程,当执行不加任何选项的ps命令时,显示的是当前终端的进程,命令如下。
[root@Hal55 ~]# ps
PID TTY TIME CMD
1775 pts/0 00:00:00 bash
2236 pts/0 00:00:00 ps
[root@Hal55 ~]#
使用ps命令查看当前终端的进程,如图18-2所示。
有很多进程不属于任何终端,这些进程都是后台进程。如图18-2所示,在终端1中运行了A、B两个进程,当在终端1中执行ps命令时只能看到终端1上的三个进程(包括ps本身),看不到其他终端及后台进程。如果想查看系统中的所有进程,就需要加上选项了。
基本上不同版本的UNIX系统上都有自己的ps命令,但是这些命令却没有一个统一的选项约定,Linux中的ps命令应尽可能地包括所有的这些选项以适应不同UNIX背景的人群。所以,Linux中 ps包括了UNIX风格和Linux风格的选项,最常见的用法包括ps aux 和 ps -ef。
ps aux可以列出系统中所有进程,如下图所示
这里每列的含义如下
(1)USER:进程所属用户。
(2)PID:进程ID。
(3)%CPU:进程占用CPU百分比。
(4)%MEM:进程占用内存百分比。
(5)VSZ:虚拟内存占用大小(单位:KB)。
(6) RSS:实际内存占用大小(单位:KB)。
(7)TTY:终端类型。
(8)STAT:进程状态。
(9)START:进程启动时刻。
(10)TIME:进程运行时长。
(11)COMMAND:启动进程的命令
关团一个正在运行的程序时,本质上是系统给此程序对
应的进程发送一个关闭信号。不同的关闭方式,信号是不一样的,查看系统有多少信号可以使用kill -l命令进行查看,如下所示。
[root@Hal55 ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
也可以使用kill命令手动给进程发送信号,这里介绍3个常用的信号:15号信号、9号信号和2号信号
15号信号,当单击右上角的【关闭】按钮去关闭一个程序时,系统发送的就是15号信号,这也是默认信号。在命令行中使用kill命令时,如果不指定信号,则是15号信号。
在后台运行sleep命令,同时也显示了进程的PID,如下所示。
[root@Hal55 ~]# sleep 1000 &
[1] 2314
[root@Hal55 ~]#
可以看到,sleep进程的PID是2314。下面给这个进程发送一个9号信号,命令如下
[root@Hal55 ~]# kill 2314
[root@Hal55 ~]# kill 2314
-bash: kill: (2314) - 没有那个进程
[1]+ 已终止 sleep 1000
[root@Hal55 ~]#
2号信号,当我们按【Ctrl+C】组合键时,本质上就是发送了一个2号信号。运行 sleep命令,后面没有加&就是放在前台运行,命令如下。
[root@Hal55 ~]# sleep 1000
^C
[root@Hal55 ~]#
按【Ctrl+C】组合键会终止正在运行的程序,即对对应的进程发送2号信号
再次运行sleep命令,并把它放在后台运行,命令如下。
[root@Hal55 ~]# sleep 1000 &
[1] 2334
[root@Hal55 ~]#
这里sleep进程的PID是2334,给这个进程发送一个2号信号,命令如下
[root@Hal55 ~]# kill -2 2334
[root@Hal55 ~]# kill -2 2334
-bash: kill: (2334) - 没有那个进程
[1]+ 中断 sleep 1000
[root@Hal55 ~]#
当一个程序关不掉时,需要强制关闭,此时可以对进程发送9号信号,命令如下。
[root@Hal55 ~]# sleep 1000 &
[1] 2343
[root@Hal55 ~]# kill -9 2343
[root@Hal55 ~]# kill -9 2343
-bash: kill: (2343) - 没有那个进程
[1]+ 已杀死 sleep 1000
[root@Hal55 ~]#
这样就强制关闭了
使用kill命令后面需要跟上进程的PID,这里还需要查找出进程的PID,如果想直接杀死某个运行的程序,则可以使用killall命令。先在后台运行几个程序
[root@Hal55 ~]# sleep 1000 &
[1] 2352
[root@Hal55 ~]# sleep 1000 &
[2] 2353
[root@Hal55 ~]# sleep 1000 &
[3] 2354
[root@Hal55 ~]# sleep 1000 &
[4] 2355
[root@Hal55 ~]#
[root@Hal55 ~]# killall -9 sleep
[1] 已杀死 sleep 1000
[2] 已杀死 sleep 1000
[3]- 已杀死 sleep 1000
[4]+ 已杀死 sleep 1000
[root@Hal55 ~]#
4.进程优先级
系统中所有的进程都要消耗CPU的资源,CPU 会为每个进程分配一个时间片,轮到某进程时CPU会处理这个进程的请求,时间片到期,则会把进程暂停放回队列等待下一轮的时间片。在同一颗CPU上如果运行了太多的程序就会导致CPU的资源不够,可以调整进程的优先级,让指定进程获取更多的资源,更优先地去执行
好比在驾校学车时,教练车就是CPU资源,每个学员就是一个个等待的进程。每个学员上车练习10分钟(时间片),10分钟过了之后就要下车让下一个学员上车练习,再次练习需要等待下一轮。如果学员太多,等待的时间就会很久。如果想多练习一会,可以让教练设置一下优先级,别人练习一次10分钟,我练习一次2小时。
进程的优先级由两个值决定:优先顺序(priority)和优先级(niceness))。其中优先顺序由内核对它进行动态地更改,我们不需要做太多干预,对用户而言,只需要通过nice来修改。nice值的取值范围是 -20~19 ,nice值越小,进程就越优先执行。
多个进程如果运行在不同的CPU上是互不干扰的,不会发生抢资源的情况,进程只有运行在同一颗CPU上才会发生资源抢占的情况。所以,做实验时要确保多个进程是运行在同一颗CPU上的。首先查看一下CPU 的情况,命令如下。
[root@Hal55 ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 2
在线 CPU 列表: 0,1
每个核的线程数: 1
每个座的核数: 2
座: 1
NUMA 节点: 1
厂商 ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
CPU 系列: 6
型号: 154
型号名称: 12th Gen Intel(R) Core(TM) i5-12500H
BIOS Model name: 12th Gen Intel(R) Core(TM) i5-12500H
步进: 3
CPU MHz: 3110.401
BogoMIPS: 6220.80
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 48K
L1i 缓存: 32K
L2 缓存: 1280K
L3 缓存: 18432K
NUMA 节点0 CPU: 0,1
标记: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
[root@Hal55 ~]#
可以看到,现在有两颗CPU(一颗CPU有两个核被认为是两颗CPU),编号分别是0和1.。现在关闭1号CPU,命令如下
[root@Hal55 ~]# echo "0" >> /sys/devices/system/cpu/cpu1/online
[root@Hal55 ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 2
在线 CPU 列表: 0
离线 CPU 列表: 1
每个核的线程数: 1
每个座的核数: 1
座: 1
NUMA 节点: 1
厂商 ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
CPU 系列: 6
型号: 154
型号名称: 12th Gen Intel(R) Core(TM) i5-12500H
BIOS Model name: 12th Gen Intel(R) Core(TM) i5-12500H
步进: 3
CPU MHz: 3110.401
BogoMIPS: 6220.80
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 48K
L1i 缓存: 32K
L2 缓存: 1280K
L3 缓存: 18432K
NUMA 节点0 CPU: 0
标记: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
[root@Hal55 ~]#
这样就可以看到1号CPU已经离线了,注意/sys/devices/system/cpu/cpu1/online中的值如果是0则表示CPU离线,如果是1则表示CPU在线。
下面运行两个cat进程命令如下
[root@Hal55 ~]# cat /dev/zero > /dev/null &
[1] 2018
[root@Hal55 ~]# cat /dev/zero > /dev/null &
[2] 2019
[root@Hal55 ~]#
然后再打开一个终端用 top进行查看, 如下图所示
可以看到,两个cat进程消耗的CPU是差不多的,因为它们的nice值相同,可以平等地消耗CPU资源。下面使用renice修改进程2018的nice值,改为-10,命令如下。
[root@Hal55 ~]# renice -n -10 2018
2018 (process ID) 旧优先级为 0,新优先级为 -10
[root@Hal55 ~]#
这样进程2018会比2019占用更多的cpu资源再次查看top如下图所示
可以看到2018占用的cpu资源比2019多了很多很多
刚才讲nice值越小越可得到更多的CPU资源,越大越不容易抢到资源,这里改成最大值19,命令如下。
[root@Hal55 ~]# renice -n 19 2018
2018 (process ID) 旧优先级为 -10,新优先级为 19
[root@Hal55 ~]#
然后再次到top查看进程,结果如下图所示
可以看到,2018只获取到了很少的CPU资源。关闭cat进程,命令如下。
[root@Hal55 ~]# killall -9 cat
[root@Hal55 ~]#
开启一号cpu命令如下
[root@Hal55 ~]# echo "1" >> /sys/devices/system/cpu/cpu1/online
[1]- 已杀死 cat /dev/zero > /dev/null
[2]+ 已杀死 cat /dev/zero > /dev/null
[root@Hal55 ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 2
在线 CPU 列表: 0,1
每个核的线程数: 1
每个座的核数: 2
座: 1
NUMA 节点: 1
厂商 ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
CPU 系列: 6
型号: 154
型号名称: 12th Gen Intel(R) Core(TM) i5-12500H
BIOS Model name: 12th Gen Intel(R) Core(TM) i5-12500H
步进: 3
CPU MHz: 3110.401
BogoMIPS: 6220.80
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 48K
L1i 缓存: 32K
L2 缓存: 1280K
L3 缓存: 18432K
NUMA 节点0 CPU: 0,1
标记: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
[root@Hal55 ~]#