linux进程管理

linux进程管理

1.进程的概念

1.进程是一个程序启动的一种状态(运行的),进程是已启动的可执行程序的运行的状态。

2.proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID

[root@SYL2 ~]# ls /proc/
1     204  231   4784  55   769        consoles     mounts
10    205  232   4790  550  8          cpuinfo      mpt
1008  206  233   4791  552  810        crypto       mtrr
1009  207  234   48    553  811        devices      net
200   228  46    540   672  buddyinfo  mdstat
201   229  47    541   673  bus        meminfo
202   23   4775  542   674  cgroups    misc
203   230  4781  549   675  cmdline    modules
[root@SYL2 ~]# 

3.进程的组成:

  • 进程运行中分配内存所在的地址空间
  • 安全属性,包括所有权凭据和特权等权限
  • 程序代码的一个或多个执行线程(程序可多次打开)
  • 进程状态(运行,停止)

4.系统是多用户(多用户同时在使用计算机),多任务(登录系统可以打开多个程序)的系统

5.进程环境:

  • 本地和全局变量
  • 当前调度上下文,让一个进程先运行一会,让另一个运行,给记录下的过程
  • 分配的系统资源,如文件描述符和网络端口

6.进程的产生:

  • 现有的(父)进程ppid复制自己的地址空间来创建一个新的子进程pid结构。

  • 每个新进程分配有一个唯一的进程ID(PID),满足跟踪和安全性之需。PID与父进程ID(PPID)是新进程环境的元素。

  • 一个父进程分离(分叉)一个子进程,子进程运行执行命令(会分离另一个子进程)完成后发出信号,退出会回到父进程,在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称作僵停。而在子进程运行时父进程会处于休眠状态,父进程在等待子进程发出信号被唤醒,清理剩余结构,然后继续执行其自己的程序代码.

7.分类:

  • 前台进程:与终端相关的进程,通过终端启动的进程
  • 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程

2.进程状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ww6ZIxy-1657286759617)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220331161745211.png)]

1.进程睡眠的原因:当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间.

2.进程状态

2.1 T(运行状态)–TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪

2.2 Z(僵停状态)—EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放,用defunct或者exiting

3.进程优先级

3.1进程调度程序:通过时间分片技术,Linux和其他操作系统实际能够运行的进程数可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。cpu需要运行的进程数量总是超出实际具有的核心数。

3.2优先级:

  • 进程优先级范围:0-139,数字越小,优先级越高
    • 0-99:实时(绝对)优先级,内核调整
    • 100-139(-20到19):静态优先级,普通用户可控制,-20对应100优先值最大,19对应139最小
    • nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
      nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
  • 进程优先级高的特点:
    • 获得更多的CPU运行时间
    • 更优先获得CPU运行的机会

3.3为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。可以提高(-20到-1)不能降低

普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别。可以设置(1-19)降低,不能提高

4.进程管理命令

4.1 进程优先级调整:调整nice值

  • 调整已经启动的nice值 — renice

  • [root@SYL2 ~]# ps -elf|grep sleep
    0 S root        5058    5035  0  80   0 -  1828 hrtime 16:51 pts/1    00:00:00 sleep 6000  //原先nice为80
    0 S root        5073    5003  0  80   0 -  3035 -      16:54 pts/0    00:00:00 grep --color=auto sleep
    [root@SYL2 ~]# renice -10 5058
    5058 (process ID) old priority 0, new priority -10
    [root@SYL2 ~]# ps -elf|grep sleep
    0 S root        5058    5035  0  70 -10 -  1828 hrtime 16:51 pts/1    00:00:00 sleep 6000  //nice调成70
    0 S root        5076    5003  0  80   0 -  3035 -      16:55 pts/0    00:00:00 grep --color=auto sleep
    [root@SYL2 ~]# 
    
    
  • 在启动时指定nice值 — nice

  • [root@SYL2 ~]# nice -n -8 sleep 800
    
    [root@SYL2 ~]# ps -elf|grep sleep
    4 S root        5077    5003  0  72  -8 -  1828 hrtime 16:58 pts/0    00:00:00 sleep 800
    0 S root        5081    5035  0  80   0 -  3035 -      16:58 pts/1    00:00:00 grep --color=auto sleep
    [root@SYL2 ~]# 
    

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

  • 用户识别符(UID),它确定进程的特权
  • 唯一进程识别符(PID)
  • CPU和已经花费的实时时间
  • 进程在各种位置上分配的内存数量
  • 进程的位置STDOUT,称为控制终端
  • 当前的进程状态

4.3 ps显示进程信息:

  • 加了[]中括号的,表示内核线程,通常位于顶部

  • exiting或defunct表示僵尸进程

  • [root@SYL2 ~]# ps -ef
    UID          PID    PPID  C STIME TTY          TIME CMD
    root           1       0  0 13:28 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deseria
    root           2       0  0 13:28 ?        00:00:00 [kthreadd]
    root           3       2  0 13:28 ?        00:00:00 [rcu_gp]
    root           4       2  0 13:28 ?        00:00:00 [rcu_par_gp]
    root           6       2  0 13:28 ?        00:00:00 [kworker/0:0H-events_highpri]
    root           8       2  0 13:28 ?        00:00:00 [kworker/u256:0-events_unbound]
    root           9       2  0 13:28 ?        00:00:00 [mm_percpu_wq]
    

4.4 ps命令

a       //显示所有与终端有关的进程
u       //显示进程是由哪个用户启动的
x       //显示所有与终端无关的进程

-e      //显示所有进程,与-A效果相同
-l      //以长格式显示
-F      //显示更详细的完整格式的进程信息
-f      //显示更详细的完整格式的进程信息
-H      //以进程层级格式显示进程相关信息

-o      //根据自己的需要选择要显示的字段 
[root@SYL2 ~]# ps -o pid,comm,nice
    PID COMMAND          NI
   5035 bash              0
   5111 ps                0

  • ps aux

  • [root@SYL2 ~]# ps aux|head -2
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root           1  0.0  0.7 240444 13380 ?        Ss   13:28   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
    VSZ     //Virtual memory SiZe,虚拟内存集
    RSS     //ReSident Size,常驻内存集
    STAT    //进程状态
    TIME    //运行时的累积时长
    
  • ps -ef 显示进程前两行

  • ps -elf 查看线程数

  • [root@SYL2 ~]# ps -ef|head -2
    UID     PID             PPID     C     STIME             TTY         TIME      CMD
    root 1(系统第一个进程)   0(父进程) 0(CPU)13:28(启动时间) ?(启动位置)  00:00:02       /usr/lib/systemd/systemd --switched-root --system --deserialize 18(执行的任务)
    
    [root@SYL2 ~]# ps -elf|head -2
    F           S  UID     PID  PPID PRI  NI     ADDR           SZ WCHAN  STIME TTY          TIME CMD 
    4(文件描述符) S(状态)  root   1    0    0  80(在内存中得位置)   0 - 60111 do_epo 13:28 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
    NI      //nice值
    PRI     //优先级
    PSR     //进程运行在哪个CPU核心上
    RTPTRIO //实时优先级
    C       //运行的CPU编号
    STIME   //进程的启动时间
    VSZ     //Virtual memory SiZe,虚拟内存集
    RSS      //ReSident Size,常驻内存集
    STAT    //进程状态
    TIME    //运行时的累积时长
    
  • pstree用于显示当前系统上的进程树

  • [root@SYL2 ~]# pstree
    systemd─┬─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─agetty
            ├─auditd───{auditd}
            ├─crond
            ├─dbus-daemon───{dbus-daemon}
            ├─firewalld───{firewalld}
            ├─irqbalance───{irqbalance}
            ├─polkitd───7*[{polkitd}]
            ├─rsyslogd───2*[{rsyslogd}]
            ├─sshd─┬─sshd───sshd───bash
            │      └─sshd───sshd───bash───pstree
            ├─sssd─┬─sssd_be
            │      └─sssd_nss
            ├─systemd───(sd-pam)
            ├─systemd-journal
            ├─systemd-logind
            ├─systemd-udevd
            ├─tuned───4*[{tuned}]
            └─vmtoolsd───3*[{vmtoolsd}]
    [root@SYL2 ~]# 
    
    
  • pgrep取进程号

  • [root@SYL2 ~]# pgrep sleep
    5120
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5120    5003  0 17:44 pts/0    00:00:00 sleep 700
    root        5123    5035  0 17:44 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
    
  • pidof取进程号

  • [root@SYL2 ~]# ps -ef|grep sleep
    root        5120    5003  0 17:44 pts/0    00:00:00 sleep 700
    root        5123    5035  0 17:44 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# pidof sleep
    5120
    [root@SYL2 ~]# 
    
  • vmstat虚拟内存状态查看命令

  • [root@SYL2 ~]# vmstat
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 1201684   4204 375340    0    0     5     1   39   58  0  0 100  0  0
    [root@SYL2 ~]# 
    
    
  • [root@SYL2 ~]# vmstat 2 2   //表示每2秒刷新一次,刷新2次后退出
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     2  0      0 1201564   4204 375380    0    0     5     1   39   58  0  0 100  0  0
     0  0      0 1201444   4204 375380    0    0     0     0  160  219  0  0 100  0  0
    
    procs:进程
        r(running)  //表示等待运行的队列长度,也即等待运行的进程的个数
        b(block)    //表示阻塞队列长度,也即处于不可中断睡眠态的进程个数
    memory:内存
        swpd        //交换内存的使用总量,把不经常用的程序先暂停放的空间
        free        //空闲物理内存总量,真实运行还有多少可用
        buffer      //用于buffer的内存总量(缓冲)
        cache       //用于cache的内存总量(缓存)
    swap:交换分区,把不常运行的程序放进去
        si(swap in//表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
        so(swap out//表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
    io:硬盘
        bi(block in//从硬盘读入数据到系统的速率(kb/s)
        bo(block out//从系统保存数据到硬盘的速率(kb/s)
    systemin( interrupts)     //表示中断的个数,也即中断速率(kb/s)
    cs(context switch)  //表示上下文切换的次数,也即进程切换速率(kb/s)上下文切换次数多表示CPU数量不够处理不过来,cs越小说明上下文切换少,CPU够用
    
    CPU:
        us      //表示用户空间
        sy      //表示内核空间
        id      //表示空闲百分比
        wa      //表示等待IO完成所占据的时间百分比
        st      //表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)
    

5.控制作业

5.1 Linux作业分为前台作业与后台作业两种。其各自的特点如下:

  • 前台作业:通过终端启动,且启动后一直占据了命令提示符

  • [root@SYL2 ~]# sleep 700  //一直在前台运行
    
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5149    5003  0 18:11 pts/0    00:00:00 sleep 700
    root        5162    5035  0 18:20 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    [root@SYL2 ~]# ps -ef|grep sleep   //直接关闭就没了
    root        5224    5035  0 18:21 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
    [root@SYL2 ~]# sleep 900 &  //在后台运行
    [1] 5253
    [root@SYL2 ~]# ps -ef|grep sleep 
    root        5253    5035  0 18:23 pts/1    00:00:00 sleep 900
    root        5255    5035  0 18:23 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# ps -ef|grep sleep //把终端关闭,后台运行还是没有
    root        5346    5170  0 18:25 pts/2    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
  • 后台作业:可以通过终端启动,但启动之后,释放命令提示符,后续的操作在后台完成

    • 此类作业虽然被送往后台运行,但其依然与终端相关。如果希望送往后台后,剥离与终端的关系需要执行(nohup COMMAND &

    • [root@SYL2 ~]# nohup sleep 9000 & //加个nohup 在后台运行退出还能运行别的命令
      [1] 5350
      [root@SYL2 ~]# nohup: ignoring input and appending output to 'nohup.out'
      
      [root@SYL2 ~]# ls
      1.1.txt  abc  anaconda-ks.cfg  nohup.out  ttt
      [root@SYL2 ~]# 
      [root@SYL2 ~]# ps -ef|grep sleep
      root        5350       1  0 18:27 ?        00:00:00 sleep 9000
      root        5414    5390  0 18:28 pts/0    00:00:00 grep --color=autosleep
      [root@SYL2 ~]# 
      
      

5.2 在后台作业

  • [root@SYL2 ~]# sleep 600 & //在命令后跟上&符号可以生成一个后台作业
    [1] 5444
    [root@SYL2 ~]# jobs //用于显示当前所有的后台作业
    [1]+  Running                 sleep 600 &
    [root@SYL2 ~]# fg  //fg命令用于将后台作业调至前台运行
    sleep 600
    ^Z  //使用ctrl+z可将前台进程发送到后台,此时作业将处于停止状态
    [1]+  Stopped                 sleep 600
    [root@SYL2 ~]# jobs
    [1]+  Stopped                 sleep 600
    [root@SYL2 ~]# bg  //在后台继续运行
    [1]+ sleep 600 &
    [root@SYL2 ~]# jobs
    [1]+  Running                 sleep 600 &
    
  • kill停止命令

  • [root@SYL2 ~]# sleep 1000 &
    [2] 5447
    [root@SYL2 ~]# sleep 2000 &
    [3] 5448
    [root@SYL2 ~]# sleep 3000 &
    [4] 5449
    [root@SYL2 ~]# jobs
    [1]   Running                 sleep 600 &
    [2]   Running                 sleep 1000 &
    [3]-  Running                 sleep 2000 &
    [4]+  Running                 sleep 3000 &
    [root@SYL2 ~]# kill %2  //停止第二个命令
    [root@SYL2 ~]# jobs
    [1]   Running                 sleep 600 &
    [2]   Terminated              sleep 1000
    [3]-  Running                 sleep 2000 &
    [4]+  Running                 sleep 3000 &
    jobs命令的结果中
        +     //命令将默认操作的作业
        -     //命令将第二个默认操作的作业
    
  • [root@SYL2 ~]# jobs
    [1]   Running                 sleep 1000 &
    [2]   Running                 sleep 2000 &
    [3]-  Running                 sleep 3000 &
    [4]+  Running                 sleep 5000 &
    [root@SYL2 ~]# fg
    sleep 5000
    ^C  //终止
    [root@SYL2 ~]# jobs
    [1]   Running                 sleep 1000 &
    [2]-  Running                 sleep 2000 &
    [3]+  Running                 sleep 3000 &
    [root@SYL2 ~]# 
    
    

6.进程通信

进程间通信(IPC:Inter Process Communication)

进程间通信方式:

  • 同一主机

    • 共享内存

    • 信号:Signal

    • [root@SYL2 ~]# kill -l
      1) SIGHUP  挂起
      2) SIGINT  键盘中断
      9) SIGKILL 发送信号立刻终止进程,中断,无法拦截
      15) SIGTERM 发送信号要等待运行完成才终止进程,终止,默认
      
      
  • kill命令根据ID向进程发送信号,可用于发送任何信号,终止程序的信号

  • 指定一个信号的方法:

    信号号码(数字标识):kill -2
    信号完整名称:kill -SIGINT
    信号简写名称:kill -INT
    
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5350       1  0 18:27 ?        00:00:00 sleep 9000
    root        5455    5421  0 18:40 pts/1    00:00:00 sleep 2000
    root        5456    5421  0 18:40 pts/1    00:00:00 sleep 3000
    root        5480    5421  0 19:03 pts/1    00:00:00 grep --color=autosleep
    [1]   Done                    sleep 1000
    [root@SYL2 ~]# kill -9 5350
    [root@SYL2 ~]# !ps
    ps -ef|grep sleep
    root        5455    5421  0 18:40 pts/1    00:00:00 sleep 2000
    root        5456    5421  0 18:40 pts/1    00:00:00 sleep 3000
    root        5484    5421  0 19:04 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
    
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5455    5421  0 18:40 pts/1    00:00:00 sleep 2000
    root        5456    5421  0 18:40 pts/1    00:00:00 sleep 3000
    root        5487    5421  0 19:05 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# killall sleep     //删除所有的进程
    [2]-  Terminated              sleep 2000
    [3]+  Terminated              sleep 3000
    [root@SYL2 ~]# !ps
    ps -ef|grep sleep
    root        5490    5421  0 19:05 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5491    5421  0 19:06 pts/1    00:00:00 sleep 125
    root        5492    5421  0 19:06 pts/1    00:00:00 sleep 150
    root        5493    5421  0 19:07 pts/1    00:00:00 sleep 500
    root        5495    5421  0 19:07 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# pkill sleep  //根据·pid·删除进程
    [1]   Terminated              sleep 125
    [2]-  Terminated              sleep 150
    [3]+  Terminated              sleep 500
    [root@SYL2 ~]# ps -ef|grep sleep
    root        5498    5421  0 19:07 pts/1    00:00:00 grep --color=autosleep
    [root@SYL2 ~]# 
    
    
  • 基本进程管理信号

  • 信号编号名称定义用途
    1HUP挂起让一个进程不用重启就可以重读配置文件,并让新的配置信息生效
    2INT键盘中断中断一个前台进程。ctrl+c就是用的SIGINT信号
    9KILL中断,无法拦截导致立即终止程序。无法被拦截、忽略或处理
    15(默认)TERM终止导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理
    • 用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。
  • 不同主机

    • rpc:remote procecure call
      ------- | ------------------------------------------------------------ |
      | 1 | HUP | 挂起 | 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 |
      | 2 | INT | 键盘中断 | 中断一个前台进程。ctrl+c就是用的SIGINT信号 |
      | 9 | KILL | 中断,无法拦截 | 导致立即终止程序。无法被拦截、忽略或处理 |
      | 15(默认) | TERM | 终止 | 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理 |

    • 用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。

  • 不同主机

    • rpc:remote procecure call
      • 基于socket实现进程间通信
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值