进程管理

一、程序与进程

1、程序和进程
程序:是一组指令及参数的组合,按照既定的逻辑控制计算机运行用来完成特定任务。
进程:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程,动态,有生命周期及运行状态。

2、程序和进程的区别:

  • 程序是静态的,它只是一组指令的集合,不具有任何的运行意义;而进程是程序运行的动态过程
  • 进程和程序并不是一一对应关系,相同的程序运行在不同的数据集上就是不同的进程
  • 程序是封闭的,进程具有并发性和交往性。进程之间可以通信,方式:共享内存;消息队列

3、进程和线程是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行;
在linux系统上,对于进程或线程都将拥有一套完整的资源集。(资源集:CPU资源---->时间片;mem资源---->虚拟内存;I/O资源---->复用技术)

二、进程基础

1、进程的生命周期

sleep
ruuning
stop
zombie

2、子进程与父进程

在这里插入图片描述

父进程复制自己的地址空间(fork)创建一个新的子进程结构。
每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。
PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是
第一个系统进程的后代。
父进程终止子进程自然终止。
通常,父进程在子进程运行期间处于睡眠(sleeping)状态。
当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,
剩余的部分称之为僵停(僵尸Zombie)。
父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

三、进程管理工具

1、pstree命令

用于查看进程树之间的关系

[root@localhost ~]# yum provides pstree
[root@localhost ~]# yum install psmisc
[root@localhost ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash
        │      ├─2*[sshd───sftp-server]
        │      └─sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}
选项功能
-A各进程树之间的连接以ASCII码字符来连接,当终端不支持UTF-8(中文),显示乱码,此时用该参数
-U各进程树之间的连接以utf-8字符来连接,某些终端可能会有错误
-p同时列出每个进程的PID
-u同时列出每个进程的所属账号名称
2、ps命令
选项功能
-A同-e,所有的进程均显示出来
-a显示终端机下的进程,包括其他用户
-u以用户为主的进程状态
x通常与-a一起使用,可列出较完整信息
l较长,较详细的将该PID的信息列出
j工作的格式
-f打印完整输出
[root@localhost ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.5  0.6 127968  6564 ?        Ss   18:30   0:01   /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    18:30   0:00 [kthreadd]

USER:进程的发起者
PID:进程的ID号
%CPU:CPU使用百分比
%MEM:内存使用百分比
VSZ:虚拟内存
RSS:固定内存
TTY:终端
STAT:状态(S,T,R,Z)--R 运行;S 可中断睡眠 Sleep;D 不可中断睡眠;T 停止的进程;
      Z 僵尸进程;X 死掉的进程;Ss s进程的领导者,父进程;S< <优先级较高的进程;
      SN N优先级较低的进程;R+ +表示是前台的进程组;Sl以线程的方式运行
START:启动时间
TIME:该进程实际使用CPU运作的时间
COMMAND:程序的实际指令
3、pgrep命令

获得正在被调度的进程的相关信息

选项功能
-l同时显示进程名和PID
-o当匹配多个进程时,显示进程号最小的那个
-n当匹配多个进程时,显示进程号最大的那个
4、killall,kill,pkill

1、killall—用于杀死指定名字的进程

选项功能
-z只杀死拥有scontext的进程
-e要求匹配进程名称
-I忽略小写
-g杀死进程组而不是进程
-i交互模式,杀死进程前先询问用户
-l列出所有的已知信号名称
-q不输出警告信息
-s发送指定的信号
-v报告信号是否成功发送
-w等待进程死亡

杀死所有同名进程:
killall nginx
killall -9 bash

向进程发送指定信号:
killall -TERM nginx
killall -KILL nginx

2、kill—用来终止指定的进程的运行

kill命令是通过向进程发送指定的信号来结束相应进程的。
在默认情况下,采用编号为15的TERM信号。

选项功能
-l列出全部的信号名称
-s指定发送信号
-a当处理当前进程时,不限制命令名和进程号的对应关系
-p指定kill命令只打印相关进程的进程号,而不发送任何信号
-u指定用户

[N] :1.kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15)。
2.kill可以带有进程ID号作为参数。
3.可以向多个进程发信号或终止它们。
4.当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。
5.应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态,因此,要慎用kill信号(9)。
6.kill 0不发送任何信号,常用来检测进程是否存在,在脚本中echo $?,存在返回0,不存在返回1。

常用的信号:
HUP     1      终端断线
INT     2      中断(同Ctrl+c)
QUIT    3      退出(同Ctrl+\)
TERM    15     终止
KILL    9      强制终止
CONT    18     继续(与STOP相反,fg/bg命令)
STOP    19     暂停(同Ctrl+z)

3、pkill—ps命令和kill命令的结合,按照进程名来杀死指定进程

5、top、htop

(1)top
在这里插入图片描述
top命令各参数详解:

前五行--系统整体的统计信息
“16:55:22”--当前时间
“up 7:10”--系统运行时间,格式为:时:分
“3 users”--当前登录用户数
“load average:0.00,0.01,0.05”--系统负载,即任务队列的平均长度;三个数值分别为
 1分钟、5分钟、15分钟前到现在的平均值
 “Tasks:107 total”--进程总数
 “3 running”--正在运行的进程数
 “104 sleeping”--睡眠的进程数
 “0 stopped”--停止的进程数
 “0 zombie”--僵尸进程数
“%Cpu(s)”:0.0 us--用户空间占用CPU百分比
          0.0 sy--内核空间占用CPU百分比
          0.0 ni--用户进程空间内改变过优先级的进程占用CPU百分比
          100.0 id--空闲CPU百分比
          0.0 wa--等待输入输出的CPU时间百分比
          0.0 hi--CPU服务于硬中断所耗费的时间总额
          0.0 si、0.0 st--CPU服务于软中断所耗费的时间总额、Steal Time
“Mem:995896 total”--物理内存总量
“697328 free”--空闲内存总量
“139672 used”--使用的物理内存总量
“158896 buff/cache”--用作内核缓存的内存量
“swap:2097148 total”--交换区总量
“2097148 free”--空闲交换区总量
“0 used”--使用的交换区总量
“682740 avail Mem”

各个进程详细信息各列的含义:
“PID”--进程id
“USER”--进程所有者的用户名
“PR”--优先级
“NI”--nice值.负值表示高优先级,正值表示低优先级
“VIRT”--进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
“RES”--进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
“SHR”--共享内存大小,单位kb
“S”--进程状态:D=不可中断的睡眠状态; R=运行;S=睡眠; T=跟踪/停止;Z=僵尸进程
“%CPU”--上次更新到现在的CPU时间占用百分比
“%MEM”--进程使用的物理内存百分比
“TIME+”--进程使用的CPU时间总计,单位1/100秒
“COMMAND”--命令名/命令行

(2)htop

安装htop:
fedora epel 网站:https://fedoraproject.org/wiki/EPEL
RHEL/CentOS 6:
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
RHEL/CentOS 7:
#yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
或安装阿里云的yum文件:
#wget -O /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-7.repo

#yum  install epel*
#yum install htop

在这里插入图片描述

6、vmstat
  • 常见的linux监控工具

  • 可以展现给定时间间隔的服务器的状态值,包括CPU使用率,内存使用,虚拟内存交换和IO读写情况

  • 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采用的时间间隔数(单位是秒),第二个参数是采样的次数

    [root@localhost ~]# vmstat 2 3
    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 380696   3116 470000    0    0     5     8   31   51  0  0 100  0  0
    0  0      0 380548   3116 470000    0    0     0     0   26   39  0  0 100  0  0
    0  0      0 380548   3116 470000    0    0     0     0   28   38  0  0 100  0  0
    

字段含义:

类别选项含义说明
Processr等待执行的任务数展示了正在执行和等待cpu资源的任务个数,当这个值超过了CPU个数,就会出现CPU瓶颈
B等待IO的进程数量
Memoryswpd正在使用虚拟的内存大小,单位k值大于0表示物理内存已经不足,需要考虑升级内存
free空闲内存大小指物理内存
buff已用的buff大小,对块设备的读写进行缓冲
cache已用的cache大小,文件系统的cache指的是page cached内存大小
nact非活跃内存大小,即被表明可回收的内存,区别于free和active
active活跃的内存大小
Swapsi每秒从交换分区写入内存的大小(单位:kb/s)表示有磁盘调入内存,也就是内存进入内存交换分区的内存大小;通俗的讲就是每秒从磁盘读入内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄漏了,要查看内存进程解决掉
so每秒从内存写到交换分区的大小表示由内存进入磁盘,也就是由内存交换区进入内存的内存大小
IObi每秒读取的块数(读磁盘)现在的linux版本块的大小为1024bytes
bo每秒写入的块数(写磁盘)如果bi+bo的值过大,且wa值较大,则表示系统磁盘IO瓶颈
Systemin每秒中断数,包括时钟中断值越大,会看到由内核消耗的CPU时间会越多
cs每秒上下文切换数值越大,会看到由内核消耗的CPU时间会越多
CPUUs用户进程执行消耗CPU时间us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施
Sy系统进程消耗CPU时间sys的值过高时,说明系统内核消耗的CPU资源多,这不是良性的表现,我们应该检查原因。一般来说us+sy应该小于80%,如果大于80%,说明内存可能存在CPU瓶颈
id空闲时间(包括IO等待时间)
wa等待IO时间wa过高时,说明IO等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈

如果评估CPU,需要重点关注Process项的 r 列值和CPU项的us,sy,wa列的值

四、进程前后台与状态

1、前台进程和后台进程

前台进程:在shell提示处理打入命令后,创建一个子进程,运行命令,shell等待命令退出,
然后返回到对用户给出提示符。这条命令与shell异步同行,即在前台运行,用户在它完成
之前不能执行别的命令。

后台进程:在shell提示处打入命令,若后随一个 & ,shell创建子进程运行此命令,但不等
待命令退出,而直接返回到对用户给出提示。这条命令与shell同步运行,即在后台运行。
“后台进程必须是非交互式的”
前台作业同一时刻只能运行一个,后台作业同时可以运行多个。

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

在这里插入图片描述

(1)sleep:
S:可中断睡眠,条件:硬件要求,系统资源访问,信号。比如:键盘输入。
D: 不可中断睡眠, 比如:系统进程(不可中断),如中断可能会引起系统的异常 -->用户进程
K:可退出的睡眠

(2)running:
在CPU上运行的进程或者是准备运行的进程(队列(高速缓存));
user的日常任务,kernel的日常任务
运行:---->进程占用cpu时间片
等待:---->等待某个条件成熟
就绪:---->分配好所有资源,等待cpu时间片
(3)stop
(4)zombie:Z: —>exit----task_struct(PID,返回状态码,父进程需要状态)
X: —>exit----将没有数据
在这里插入图片描述
3、进程优先级
在这里插入图片描述

(1)进程调度及多任务
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的印象

(2)相对优先级nice
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),但还有其他一些调度策略用于不同的目的。SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值,可以有40中不同级别的nice值

(3)nice值

nice值越高:表示优先级越低,例如+19,该进程容易将CPU使用量让给其他进程
nice值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU

(4)查看进程的nice级别方法

  • 使用top查看
    NI:实际nice级别
    PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
    在这里插入图片描述

  • 使用ps查看

    [root@localhost ~]# ps axo pid,command,nice --sort=-nice
     PID COMMAND                      NI
      32 [khugepaged]                 19
    
    [root@localhost ~]# ps axo pid,command,nice,cls --sort=-nice
     PID COMMAND                      NI CLS
      32 [khugepaged]                 19  TS
    

(5)启动具有不同nice级别的进程
启动进程时,通常会继承父进程的nice级别,默认是0
语法:#nice -n <优先级> command

(6)更改现有进程的nice级别方法

  • 使用top
    r 调整进程的优先级(Nice Level)(-20高)—— 0 ——(19低)
  • 使用shell
    #renice [-n] <优先级> [-p|–pid] …
    #renice [-n] <优先级> -g|–pgrp …
    #renice [-n] <优先级> -u|–user <用户>…

五、作业控制

一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,shell可以同时运行
一个前台作业和任意多个后台作业,这称为作业控制。

1、进程和作业:

  • 区别:进程是一个程序在一个数据集上的一次执行,而作业是用户提交给系统的一个任务
  • 关系:一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。
  • 用户提交作业后,当作业被调度,系统会为作业创建进程,一个进程无法完成时,系统会为这个进程创建子进程。

作业是正对于终端而言,在哪个终端上启动的作业,在哪个终端上jobs
在这里插入图片描述
对于终端上的作业,有内容输出时,当终端断开后,该作业进程将会接收到中断信号;导致进程被杀死。
在这里插入图片描述
终端断开后重启,后台作业仍存在
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值