云计算基础: 第四章 Linux 进程管理

第四章 进程

1.进程简介

首先我们要了解,什么是进程?

  • 进程是已启动的可执行程序的运行实例,进程有以下组成部分:
    • 已分配内存的地址空间;
    • 安全属性,包括所有权凭据和特权;
    • 程序代码的一个或多个执行线程;
    • 进程状态。
    程序: 二进制文件,静态 /usr/bin/passwd ,/usr/sbin/useradd
    进程: 是程序运行的过程, 动态,有生命周期及运行状态。
    在这里插入图片描述
    进程的生命周期是指父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。
    每个新进程分配一个,唯一的进程 ID (PID),满足跟踪安全性之需。任何进程都可以创建子进程。所有进程都是第一个系统进程的后代。
    在这里插入图片描述

进程的状态

在这里插入图片描述在这里插入图片描述

进程状态产生的原因

在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。

2. 进程管理

2.1 静态查看进程

  • PS,相当于windows系统里的进程管理

在这里插入图片描述

我们以一个进程为例

[root@localhost ~]# ps aux |head -2
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128420  7008 ?        Ss   09:07   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

#ps a 显示现行终端机下的所有程序
#ps u 以用户为主的格式来显示程序状况
#ps x 不以终端机来区分
  • ps aux 输出的字段含义

USER: 运行进程的用户

PID: 进程ID (我们云工程师靠PID,“杀死”他)

%CPU: CPU占用率

%MEM: 内存占用率

VSZ: 占用虚拟内存

RSS: 占用实际内存

TTY: 进程运行的终端

STAT: 进程状态 [常见]:R运行 S睡眠Sleep T停止的进程 Z僵尸进程 X死掉的进程

START: 进程的启动时间

TIME:进程占用CPU的总时间 单位 hh:mm:ss

COMMAND: 进程文件,进程名

动态查看进程top

使用信号控制进程kill

进程优先级nice

  • 进程排序

语法: ps aux – sort %cpu 以CPU占比升序排列

​ ps aux – sort -%cpu 以CPU占比降序排列

  • 进程的父子关系

#我们通过 ps -ef 查看进程的父子关系。 请观察PID和PPID

[root@localhost ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 1月22 ?       00:00:07 /usr/lib/systemd/systemd 
root          2      0  0 1月22 ?       00:00:00 [kthreadd]
root          3      2  0 1月22 ?       00:00:06 [ksoftirqd/0]

#root3是root2的子进程
  • 自定义显示字段
#通过 ps axo来自定义显示字段
[root@localhost ~]# ps axo user,pid,ppid,%mem,command |head -3
USER        PID   PPID %MEM COMMAND
root          1      0  0.3 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0.0 [kthreadd]

2.2 动态查看进程Top

[root@localhost ~]# top
top - 19:45:51 up 10:37,  7 users,  load average: 0.81, 0.73, 0.66
top - 19:46:13 up 10:38,  7 users,  load average: 0.98, 0.77, 0.68
Tasks: 246 total,   2 running, 244 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.8 us, 21.2 sy,  0.0 ni, 70.6 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  1863012 total,    99480 free,   919400 used,   844132 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   734732 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                    
 86054 root      20   0  161416   6072   4356 S  2.3  0.3   4:05.10 sshd                                                       
  6253 root      20   0  161420   6096   4360 S  1.7  0.3   5:11.78 sshd                                                       
111219 root      20   0  161420   6076   4356 S  1.7  0.3   3:55.57 sshd                                                       
 86639 root      20   0  162968   3156   1580 S  1.0  0.2   1:18.13 top                                               
  • 在这里对TOP命令进行说明

上半部分

第一行:在这里插入图片描述

第二行:在这里插入图片描述

第三行:在这里插入图片描述

第四行:在这里插入图片描述

第五行:在这里插入图片描述

下半部分

VIRT:virtual memory usage 虚拟内存(需要这些内存,但并没有占满。)

RES:resident memory usage 常驻内存(用了多少内存)

SHR:shared memory 共享内存

  • 1、除了自身进程的共享内存,也包括其他进程的共享内存
  • 2、共享内存大小公式:RES – SHR

常用内部指令

h|?帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序

< 向前 >向后 z 彩色,Z设置彩色,使用数字调整

#动态查看进程 top,像windows的任务管理器
[root@localhost ~]# top     //回车,立刻刷新。按z彩色显示,按F,通过光标设置列的顺序。
[root@localhost ~]# top -d 1  //每1秒刷新。
[root@localhost ~]# top -d 1 -p 10126  //查看指定进程的动态信息
[root@localhost ~]# top -d 1 -p 10126,1    //查看10126和1号进程

2.3使用信号控制进程kill

  • 信号种类
[root@localhost ~]# 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   
#常用的信号种类
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断Ctrl+C
3) SIGQUIT 键盘退出Ctrl+\,类似SIGINT
9) SIGKILL 强制终止,无条件
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 暂停
20)SIGTSTP 键盘暂停Ctrl+Z
  • 我们使用信号9和15为例

    #创建两个文件,查看终端号。
    [root@localhost ~]# touch file1 file2
    #通过一个终端打开一个vim
    [root@localhost ~]#vim file1
    #通过另一个终端,打开一个vim
    [root@localhost ~]#vim file2
    #用其他终端查询两个进程
    [root@localhost ~]# ps aux |grep vim
    root     112817  0.3  0.2 149816  5436 pts/0    S+   20:00   0:00 vim file1
    root     113325  0.2  0.2 149816  5436 pts/2    S+   20:00   0:00 vim file2
    root     114165  0.0  0.0 112824   976 pts/4    R+   20:01   0:00 grep --color=auto vim
    #送信号15和信号8,观察两个终端程序的状态
    [root@localhost ~]# kill -15 112817
    [root@localhost ~]# kill -9 113325
    #终端113325
    已杀死
    [root@localhost ~]# 
    #终端112817
    [root@localhost ~]# vim file1
    Vim: Caught deadly signal TERM
    Vim: Finished.
    
    已终止
    [root@localhost ~]# 
    #观察两个终端,一个正常终止,一个非法杀死
    
    
    
    • 进程优先级nice

    简介:Linux 进程调度及多任务。每个CPU在一个时间点上只能处理一个进程,通过时间片技术,来同时运行多个程序。

    优先级范围和特性在这里插入图片描述

    在top中显示的优先级有两个,PR值和nice值

    NI: 实际nice值
    PR(+20): 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39

    nice 值越大: 表示优先级越低,例如+19
    nice 值越小: 表示优先级越高,例如-20

    查看进程的nice级别

    [root@localhost ~]# ps axo pid,command,nice --sort=-nice 
    #使用sort将nice降序输出
    

    启动具有不同的nice级别的进程

    启动进程时,通常会继承父进程的 nice级别,默认为0。

    [root@localhost ~]# nice -n -5 sleep 6000&
    [1] 110606
    [root@localhost ~]# nice -n -10 sleep 7000&
    [2] 111181
    [root@localhost ~]# ps axo command,pid,nice |grep sleep
    sleep 6000                  110606  -5
    sleep 7000                  111181 -10
    sleep 60                    112246   0
    sleep 1                     112393   0
    sleep 1                     112408   0
    sleep 1                     112423   0
    grep --color=auto sleep     112425   0
    
    

    更改现有进程的nice级别

    #使用shell更改nice级别
    #1  创建一个睡眠示例程序。
    [root@localhost ~]# sleep 888&
    [4] 120991
    [root@localhost ~]# ps axo command,pid,nice |grep sleep
    sleep 6000                  110606  -5
    sleep 7000                  111181 -10
    sleep 60                    118799   0
    sleep 60                    118837   0
    sleep 888                   120991   0
    sleep 1                     121109   0
    sleep 1                     121124   0
    sleep 1                     121139   0
    grep --color=auto sleep     121141   0
    #2  修改他的nice值。
    [root@localhost ~]# renice -20 120991
    120991 (进程 ID) 旧优先级为 0,新优先级为 -20
    

3.作业控制jobs(了解)

3.1简介

作业控制是一个命令行功能,也叫后台运行。

关键词介绍:

  • foreground fg 前台进程:是在终端中运行的命令,占领终端。

  • background bg 后台进程:没有控制终端,它不需要终端的交互。看不到,但是在运行。

3.2 后台程序控制示例

[root@localhost ~]# sleep 20
#运行一个睡眠程序当前终端无法输入。观察占领前台的现象,发现大部分命令行输入已经无效。
#使用ctrl+c终止进程

#运行后台程序,该程序不影响前台的命令行输入
[root@localhost ~]# sleep 30 &
[1] 24066
#ps查看后台进程
[root@localhost ~]# jobs
[1]+  运行中             sleep 30 &
#调动后台程序至前台
[root@localhost ~]# fg 1
sleep 300    //此时命令行又无法输入命令
#此时通过ctrl+C中断命令,查看
[root@localhost ~]# sleep 300
^C
[root@localhost ~]# jobs
[1]+  已停止               sleep 300
#我们使用bg命令运行后台进程
[root@localhost ~]# bg 1
[1]+ sleep 300 &    //此时命令重新开始在后台运行
#消灭后台进程
[root@localhost ~]# kill %1
[root@localhost ~]# jobs
[1]+  已终止               sleep 300

# !!!注意,“kill 1”和“kill %1”不同,前者终止PID为1的进程,后者杀死作业序号为1的后台程序!!!

小结:& 后台运行程序、jobs 查询后台、kill %1 停止后台进程

4.拟文件系统proc(了解)

  • 简介

虚拟文件系统:采集服务器自身 内核、进程运行的状态信息

  • CPU /proc/cpuinfo

    [root@localhost ~]# cat /proc/cpuinfo 
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 94
    model name      : Intel(R) Core(TM) i5-6300HQ CPU @ 2.30GHz
    stepping        : 3
    microcode       : 0xc6
    cpu MHz         : 2304.001
    cache size      : 6144 KB
    physical id     : 0
    siblings        : 1
    core id         : 0
    cpu cores       : 1
    apicid          : 0
    initial apicid  : 0
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 22
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu 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 fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec arat
    bogomips        : 4608.00
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 43 bits physical, 48 bits virtual
    power management:
    
  • 内存 /proc/meminfo

    [root@localhost ~]# less /proc/meminfo 
    MemTotal:        1863012 kB
    MemFree:           98184 kB
    MemAvailable:     734784 kB
    Buffers:             136 kB
    Cached:           768536 kB
    SwapCached:            0 kB
    Active:           901060 kB
    Inactive:         497768 kB
    Active(anon):     628132 kB
    Inactive(anon):    42448 kB
    Active(file):     272928 kB
    Inactive(file):   455320 kB
    Unevictable:           0 kB
    Mlocked:               0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Dirty:                 8 kB
    Writeback:             0 kB
    AnonPages:        630132 kB
    Mapped:           177184 kB
    Shmem:             40424 kB
    
  • 内核 /proc/cmdline

    [root@localhost ~]# cat /proc/cmdline 
    BOOT_IMAGE=/vmlinuz-3.10.0-1127.13.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
    

猜你喜欢

转载自blog.csdn.net/weixin_44898311/article/details/107676639