进程管理

发布时间 2023-11-23 21:47:02作者: 辞瑾

一、初始进程

1.进程、线程和程序的区别

(1)进程:进程是程序在处理机上的一次执行过程,是一个动态的概念。

进程具有创建其他进程的功能,它由程序段、数据段和进程控制块三部分组成。

进程具有独立性、并发性和相互制约性。同一程序可以对应多个进程,也就是说同一程序可以同时执行于若干个数据集合上。在传统的操作系统中,程序并不能独立运行,作为资源分配和独立执行的基本单元都是进程。

每个进程都有唯一的进程标识PID,一个PID只能标识一个进程,PPID为父进程ID,需要该进程分配系统资源。

(2)线程线程是操作系统能够进行运算调度的最小单位。

线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

和进程一样,同样具有就绪、阻塞和运行三种基本状态。线程之间可以并发执行,从而提高了程序的并发性。
(3)程序:程序是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念。它是一个软件资料,可以长期存在。

(4)总的来说,程序是静态的软件资料,可以长期存在;进程是动态的概念,是程序在处理机上的执行过程,具有独立性、并发性和相互制约性;线程是进程中的实际运作单位,是操作系统能够进行运算调度的最小单位,线程之间可以并发执行。

 

2.进程的6种状态

(1)就绪状态(Ready) :该进程满足被CPU调度的所有条件但此时并没有被调度执行,只要得到CPU就能够直接运行。意味着该进程已经准备好被CPU执行,当一个进程的时间片到达操作系统调度程序会从就绪态链表中调度一个进程。

(2)运行状态(Running) :指该进程当前正在被CPU调度运行,处于就绪态的进程得到CPU调度就会进入运行。

(3)阻塞状态(Blocked) :也叫等待状态,表示进程正在等待某种条件成立,等待某种资源,或者等待I/O操作完成。即使处理器空闲,该进程也不能运行。

(4)可中断睡眠状态(Interruptible Sleep) :可中断睡眠也称为浅度睡眠,表示睡的不够“死”,还可以被唤醒,一般来说可以通过信号来唤醒。

(5)不可中断睡眠状态(Uninterruptible Sleep) :可中断睡眠称为深度睡眠,深度睡眠无法被信号唤醒,只能等待相应的条件成立才能结束睡眠状态。

(6)僵尸状态(Zombie) :表示一个进程即将死亡的状态。

二、查看进程

1.静态查看进程

(1)ps aux 命令:查看当前目录的进程(查看静态进程)

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.6  0.1 193936  7096 ?        Ss   21:44   0:02 /usr/lib/syste
root          2  0.0  0.0      0     0 ?        S    21:44   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   21:44   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    21:44   0:00 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    21:44   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    21:44   0:00 [rcu_bh]
root          9  0.1  0.0      0     0 ?        S    21:44   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   21:44   0:00 [lru-add-drain
root         11  0.0  0.0      0     0 ?        S    21:44   0:00 [watchdog/0]
root         12  0.0  0.0      0     0 ?        S    21:44   0:00 [watchdog/1]
root         13  0.0  0.0      0     0 ?        S    21:44   0:00 [migration/1]
root         14  0.0  0.0      0     0 ?        S    21:44   0:00 [ksoftirqd/1]
root         16  0.0  0.0      0     0 ?        S<   21:44   0:00 [kworker/1:0H]
root         17  0.0  0.0      0     0 ?        S    21:44   0:00 [watchdog/2]
root         18  0.0  0.0      0     0 ?        S    21:44   0:00 [migration/2]
root         19  0.0  0.0      0     0 ?        S    21:44   0:00 [ksoftirqd/2]
root         21  0.0  0.0      0     0 ?        S<   21:44   0:00 [kworker/2:0H]
root         22  0.0  0.0      0     0 ?        S    21:44   0:00 [watchdog/3]
……
示例

 

(2)ps -ef命令:可以查看UID、PID、PPID等信息

[root@localhost ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 21:44 ?        00:00:02 /usr/lib/systemd/systemd --swi
root          2      0  0 21:44 ?        00:00:00 [kthreadd]
root          4      2  0 21:44 ?        00:00:00 [kworker/0:0H]
root          6      2  0 21:44 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 21:44 ?        00:00:00 [migration/0]
root          8      2  0 21:44 ?        00:00:00 [rcu_bh]
root          9      2  0 21:44 ?        00:00:00 [rcu_sched]
root         10      2  0 21:44 ?        00:00:00 [lru-add-drain]
root         11      2  0 21:44 ?        00:00:00 [watchdog/0]
root         12      2  0 21:44 ?        00:00:00 [watchdog/1]
root         13      2  0 21:44 ?        00:00:00 [migration/1]
root         14      2  0 21:44 ?        00:00:00 [ksoftirqd/1]
root         16      2  0 21:44 ?        00:00:00 [kworker/1:0H]
root         17      2  0 21:44 ?        00:00:00 [watchdog/2]
root         18      2  0 21:44 ?        00:00:00 [migration/2]
root         19      2  0 21:44 ?        00:00:00 [ksoftirqd/2]
root         21      2  0 21:44 ?        00:00:00 [kworker/2:0H]
root         22      2  0 21:44 ?        00:00:00 [watchdog/3]
……
示例

 

(3)ps axo命令:可自定义显示字段

[root@localhost ~]# ps axo pid,ppid,user,%cpu
   PID   PPID USER     %CPU
     1      0 root      0.3
     2      0 root      0.0
     4      2 root      0.0
     6      2 root      0.0
     7      2 root      0.0
     8      2 root      0.0
     9      2 root      0.0
    10      2 root      0.0
    11      2 root      0.0
    12      2 root      0.0
    13      2 root      0.0
    14      2 root      0.0
    16      2 root      0.0
……
示例

 

(4)ps aux --sort -%cpu命令:用户在查看CPU占用率时,可让进程按照CPU占用百分比的降序排列

[root@localhost ~]# ps aux --sort -%cpu
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       2215  1.9  5.3 3449720 215284 ?      Sl   21:45   0:15 /usr/bin/gnome
ciji       3183  1.3  5.1 3653284 209000 ?      Sl   21:45   0:09 /usr/bin/gnome
root       1678  0.9  1.4 366776 59340 tty1     Ssl+ 21:44   0:07 /usr/bin/X :0 
root       4239  0.6  0.9 766720 37216 ?        Sl   21:50   0:02 /usr/libexec/g
root       2665  0.5  1.1 342060 48076 tty2     Ssl+ 21:45   0:04 /usr/bin/X :1 
root          1  0.2  0.1 193936  7096 ?        Ss   21:44   0:02 /usr/lib/syste
root        578  0.2  0.1  49100  5540 ?        Ss   21:44   0:02 /usr/lib/syste
polkitd     827  0.2  0.3 616564 15196 ?        Ssl  21:44   0:01 /usr/lib/polki
dbus        790  0.1  0.1  71928  5820 ?        Ssl  21:44   0:01 /usr/bin/dbus-
root        805  0.1  0.0  90652  3212 ?        Ss   21:44   0:01 /sbin/rngd -f
root        813  0.1  0.1 295564  5304 ?        Ssl  21:44   0:01 /usr/bin/vmtoo
root       2479  0.1  0.6 608672 25480 ?        Sl   21:45   0:01 /usr/bin/vmtoo
root       2490  0.1  1.5 1446360 63444 ?       Sl   21:45   0:01 /usr/bin/gnome
……
示例

 

 

 

(5)cat命令pidof命令pgrep命令:均可查看指定进程PID

[root@localhost ~]# cat /run/sshd.pid
1275
[root@localhost ~]# pidof sshd
1275
[root@localhost ~]# pgrep sshd
1275
示例

 

(6)基本权限的意义

列名 说明
USER 运行进程的用户
  PID 进程ID
%CPU CPU占用率
%MEM 内存占用率
  VSZ 占用虚拟内存
  RSS 占用实际内存
  TTY 进程运行的终端
 STAT 进程状态
 TIME 进程累计占用CPU时间
COMMAND 进程发起者

 

2.动态查看进程

(1)top命令:实时动态地显示进程(动态查看进程,系统默认更新时间为3秒,也可按回车键立即更新)

 

 

 

top -d命令:设置刷新时间,以秒为单位。示例:# top -d n(n表示更新时间)

-p参数:可以查看一个或多个进程的动态信息

-u参数:查看指定用户进程

-n参数:设置刷新次数,完成后自动退出

(2)键盘输入指定字母或数字进行操作:

按M键以内存占用率排序

 

 

 

按P键以CPU占用率排序

 

 

 

按N键以PID数值大小排序

 

 

 

按R键对排序进行反转

 

 

按1键显示所有CPU的负载

 

(3)系统整体统计信息(部分),具体解释如下:

load avera:CPU最近1分钟、5分钟、15分钟负载值

Tasks:进程个数

running:正在使用CPU的进程个数

sleeping:进程休眠个数

stopped:进程停止个数

zombie:进程僵死个数

三、信号控制进程

1.kill命令

(1)功能:用于发送指定的信号到指定进程,以终止该进程。

(2)命令格式:kill [options] pid...

(3)参数设置:

-s signal:指定要发送的信号,既可以是信号名也可以是对应数字

-p:模拟发送信号,既指定kill命令只是显示进程的pid,并不真正送出结束信号

-l:指定信号的名称列表

(4)示例用法:

优雅地终止进程ID为2343的进程:kill 2342

强行终止进程ID为2343的进程: kill -9 2343

列出所有已知信号的列表:kell -l

2.killall命令

(1)功能:用于终止某个指定名称的服务所对应的全部进程。

(2)命令格式:killall [options] name [signal]

(3)参数设置:

-e:只终止匹配name的进程

-i:在终止进程前进行确认

-l:列出所有己知信号的列表

-p:终止进程组

-r:使用正则表达式匹配name

-s:使用指定的信号代替默认的SIGTERM

-u:终止指定用户的所有进程

(4)示例用法:

终止所有名为“firefox”的进程:killall firefox

强制终止所有名为“firefox”的进程:killall -s SIGKILL firefox

终止所有名为“firefox”“的进程前进行确认:killall -i firefox

列出所有已知信号的列表:killall -l

终止指定用户的所有进程(例如:终止用户“john”的所有进程):killall -u john

四、进程优先级

(1)在Linux系统中,进程优先级是操作系统用来确定在多任务环境中哪个进程应该得到更多计算资源(如CPU时间)的一种方式。

(2)进程优先级可以根据不同的标准进行设置,其中最常见的两种方式是Priority (PRI) 和Nice (NI) 。

(3)PRI是进程的优先级值,由内核动态调整。较高的PRI值表示较高的优先级,这意味着进程将获得更多的CPU时间。PRI值的范围是0到139,其中0表示最低优先级,139表示最高优先级。

(4)NI是用户可以调整的进程优先级值。它表示进程可被执行的优先级的修正数值。NI值的范围是-20到19,其中-20表示最高优先级,19表示最低优先级。当NI值为负值时,进程的优先级将变高,这意味着它将被更快地执行。

(5)PRI和NI之间的关系可以表示为:PRI (最终值) =PRI (原始值) + NI。因此,我们可以

通过修改NI的值来间接修改PRI,进而达到修改进程优先级的目的。

(6)在Linux系统中,可以使用nice命令来设置进程的NI值。例如,使用"nice -n 10 <command>"命令可以将<command>命令的优先级设置为10。

五、作业控制

(1)作业控制是Linux系统中的一个重要功能,它允许用户同时运行和管理多个命令或进程。通过作业控制,用户可以暂停、恢复以及异步运行命令,从而让Shell可以在子进程运行期间返回接受其他命令。
(2)作业控制主要涉及前台进程和后台进程。前台进程是在终端中运行的命令,该终端为进程的控制终端。前台进程接收键盘产生的输入和信号,并允许从终端读取或写入到终端。后台进程则没有控制终端,它不需要与终端交互。