Linux进程管理

Linux进程管理

进程是已启动的可执行程序的运行中实例。/proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID。

1.1 进程的组合部分

  • 已分配内存的地址空间
  • 安全属性,包括所有权凭据和权限
    [En]

    Security attributes, including ownership credentials and privileges*

  • 程序代码的一个或多个执行线程
    [En]

    one or more execution threads of program code*

  • 进程状态

1.2 进程的环境

  • 本地和全局变量
  • 当前调度上下文
  • 分配的系统资源,如文件描述符和网络端口
    [En]

    assigned system resources, such as file descriptors and network ports*

1.3 进程的产生

现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。
每个新进程分配有一个唯一的进程ID(PID),满足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。
任何进程可创建子进程。所有进程都是第一个系统进程的后代。RHEL7上,第一个系统进程是systemd。

Linux进程管理

通过fork例程,子进程继承安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec其自己的程序代码。通常,父进程在子进程运行期间处于睡眠状态,设置一个在子进程完成时发出信号的请求(wait)。在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称作僵停。父进程在子进程退出时收到信号而被唤醒,清理剩余结构,然后继续执行其自己的程序代码。

1.4 进程的分类

  • 前台进程:与终端相关的进程,终端发起的进程
    [En]

    foreground process: a process related to a terminal, a process initiated by a terminal*

  • 注意:也可把在前台启动的进程送往后台,以
    守护模式运行
  • 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程

  • 进程的状态

Linux进程管理
Excuting //运行态
Ready //就绪态,也可以称作睡眠态
Uninterruptible sleep //不可中断的睡眠。不可随时唤醒,只有当IO资源加载成功后才能唤醒
Interruptible sleep //可中断的睡眠。可随时唤醒
Zombie //僵尸进程。正常运行结束了,但是不释放占据的内存
Stopped //停止态,暂停于内存中,但不会被调度,除非手动启动之进程睡眠的原因:
当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间
在多任务处理操作系统中,每个CPU(或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。

Linux进程状态

标志 内核定义的状态名称和描述 R TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪 S TASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中 D TASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态 K TASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态 T TASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复) T TASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志 Z EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放 X EXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到 < 高优先级进程 N 低优先级进程 + 前台进程组中的进程 l 多线程进程 s 会话进程首进程

  1. 进程的优先级

3.1 Linux进程调度与多任务

现代计算机系统中既包含每次只能执行一个指令的低端处理器,也包含高性能超级计算机,这些超级计算机每台配备数百个CPU,每个CPU上具有多个核心,它们可以并行执行数以百计的指令。但是所有这些系统往往具有一个共同点:它们需要运行的进程数量总是超出实际具有的核心数。
通过时间分片技术,Linux(和其他操作系统)实际能够运行的进程数(和线程数)可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。
执行此切换的Linux内核部分称为进程调度程序。

3.2 进程优先级

  • 进程优先级范围:0-139,数字越小,优先级越高
  • 0-99:实时优先级,内核调整
  • 100-139:静态优先级,用户可控制
  • 进程优先级高的特点:
  • 获得更多的CPU运行时间
  • 更优先获得CPU运行的机会

要修改进程的优先级可以通过调整进程的nice值来实现,nice值越小,优先级越高:
nice值的范围是(-20,19),-20对应100,19对应139

3.3 相对优先级

由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。
由于并非所有进程都以同样的方式创建,可为采用SCHED_NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值。一个进程可以有40种不同级别的nice值。
这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0

nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间

3.4 nice级别与权限

为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。
普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别

3.5 进程优先级调整

进程优先级调整:调整nice值//调整已经启动的进程的nice值:
renice NI PID(例:renice 3 3704)
//在启动时指定nice值:(-20,19)
nice -n NI COMMAND

[root@mr ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.6 244948 13852 ?        Ss   Jul05   0:04 /usr/lib/systemd/systemd
root           2  0.0  0.0      0     0 ?        S    Jul05   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   Jul05   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   Jul05   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   Jul05   0:00 [kworker/0:0H-kblockd]
root           9  0.0  0.0      0     0 ?        I<   Jul05   0:00 [mm_percpu_wq]

...

root        4013  0.0  0.0      0     0 ?        I    21:37   0:01 [kworker/3:3-events_powe
root        4016  0.0  0.0      0     0 ?        I    21:49   0:00 [kworker/0:0-ata_sff]
root        4023  0.0  0.0      0     0 ?        I    21:52   0:00 [kworker/1:3-memcg_kmem_
root        4024  0.0  0.0      0     0 ?        I    21:55   0:00 [kworker/0:1-ata_sff]
root        4026  0.0  0.5 153356 10196 ?        Ss   21:58   0:00 sshd: root [priv]
root        4030  0.0  0.2 153356  5548 ?        R    21:58   0:00 sshd: root@pts/1
root        4031  0.0  0.1  26212  3880 pts/1    Ss   21:58   0:00 -bash
root        4052  0.0  0.1  58688  3872 pts/1    R+   21:59   0:00 ps aux
[root@mr ~]#

[root@mr ~]# nice -n 15 sleep 2000

[root@mr ~]# ps aux | grep sleep
root        4094  0.0  0.0   7280   812 pts/1    SN+  22:06   0:00 sleep 2000
root        4100  0.0  0.0  12108  1032 pts/2    S+   22:07   0:00 grep --color=auto sleep
[root@mr ~]#
[root@mr ~]# ps aux | head -5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.6 244948 13852 ?        Ss   Jul05   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root           2  0.0  0.0      0     0 ?        S    Jul05   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   Jul05   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   Jul05   0:00 [rcu_par_gp]
[root@mr ~]# ps -el | head -3
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 61237 do_epo ?        00:00:04 systemd
1 S     0       2       0  0  80   0 -     0 -      ?        00:00:00 kthreadd
[root@mr ~]#

[root@mr ~]# ps -elf | head -2
F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root           1       0  0  80   0 - 61237 do_epo Jul05 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
[root@mr ~]# ps -el | head -2
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 61237 do_epo ?        00:00:04 systemd
[root@mr ~]# ps -el | grep sleep
0 S     0    4094    4031  0  95  15 -  1820 hrtime pts/1    00:00:00 sleep
[root@mr ~]#
[root@mr ~]# renice -20 1202
renice: failed to get priority for 1202 (process ID): No such process
[root@mr ~]# ps -elf | grep sleep
0 S root        4094    4031  0  95  15 -  1820 hrtime 22:06 pts/1    00:00:00 sleep 2000
0 S root        4126    4070  0  80   0 -  3027 -      22:29 pts/2    00:00:00 grep --color=auto sleep
[root@mr ~]#
  1. 进程管理命令

Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

4.1 ps

ps(process state)命令用于列出当前的进程。可以显示详细的进程信息,包括:

  • 用户识别符(UID),它确定进程的特权
  • 唯一进程识别符(PID)
  • CPU和已经花费的实时时间
  • 进程在不同位置分配的内存量
    [En]

    the amount of memory allocated by the process at various locations*

  • 进程的位置STDOUT,称为控制终端
  • 当前的进程状态

ps支持三种选项格式:

  • UNIX(POSIX)选项,可以分组但必须以连字符开头
  • BSD 选项,可以分组但不可与连字符同用
  • GNU 长选项,以双连字符开头
    ps(process state),显示进程信息。注意事项:
  • 括号在[]中表示内核线程,通常位于顶部
    [En]

    parenthesized in [] indicates the kernel thread, usually at the top*

  • exiting或defunct表示僵尸进程
    //常用选项:
    a //显示所有与终端有关的进程
    u //显示进程是由哪个用户启动的
    x //显示所有与终端无关的进程

-e //显示所有进程,与-A效果相同
-l //以长格式显示
-F //显示更详细的完整格式的进程信息
-f //显示更详细的完整格式的进程信息
-H //以进程层级格式显示进程相关信息
-o //根据自己的需要选择要显示的字段

[root@localhost ~]# ps -o pid,comm,ni //表示只显示进程号,命令,nice值三个字段
PID COMMAND NI
8828 bash 0
9844 ps 0

//aux结果解析:
VSZ //Virtual memory SiZe,虚拟内存集
RSS //ReSident Size,常驻内存集
STAT //进程状态
TIME //运行时的累积时长

//ps命令结果解析:
NI //nice值
PRI //优先级
PSR //进程运行在哪个CPU核心上
RTPTRIO //实时优先级
C //运行的CPU编号
STIME //进程的启动时间
VSZ //Virtual memory SiZe,虚拟内存集
RSS //ReSident Size,常驻内存集
STAT //进程状态
TIME //运行时的累积时长

4.2 pstree

安装pstree

`bash
[root@mr ~]# dnf -y install psmisc
Last metadata expiration check: 1:29:24 ago on Wed 06 Jul 2022 09:09:28 PM CST.

Dependencies resolved.

==========================================================================================================================
Package Architecture Version Repository Size
==========================================================================================================================
Installing:
psmisc x86_64 23.1-5.el8 baseos 151 k

Transaction Summary

Install 1 Package

Total download size: 151 k
Installed size: 483 k
Downloading Packages:
psmisc-23.1-5.el8.x86_64.rpm 62 kB/s | 151 kB 00:02

Original: https://www.cnblogs.com/marymary/p/16453366.html
Author: 溜溜威
Title: Linux进程管理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523179/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球