• Linux 进程管理


    基础知识

    进程

    内核的功能和作用:文件系统管理、网络管理、进程管理、内存管理等,属于linux最基础的功能
    
    进程:process,正在运行中的程序的一个副本。允许有多个进程同时执行。
    
    #操作系统负责分配cpu运行进程的顺序和时间
    
    #副本:把磁盘上的指定文件加载到内存进行运行  运行多次就会有多个副本
    
    #多实例:一个程序生成多个副本,每个副本在内存中独立运行
    
    #进程是资源使用的分配单位,进程存在声明周期
    
    #PID:进程的唯一标号
    
    进程创建过程: #进程的父子关系:写实复制
    1. 操作系统启动的时候有个总进程(系统的第一个进程):centos6--init  centos7及以上--systemd
    
    2. 后续的所有进程都是总进程生成的,一次推类,构成一个树状结构,c语言使用fork()函数创建子进程
    
    #父进程创建子进程的过程:
    父进程在内存中占有一片空间,创建子进程的时候,此时子进程用的内存空间是父进程那一块空间。当子进程产生数据更新以后,就会复制父进程的空间来作为自己独立的空间。
    

    线程

    线程:进程是系统资源分配的单位。进程在处理数据的时候,通过线程来完成任务。
    
    #进程相当于一个组织,线程就相当于这个组织里面干活的员工。进程和线程是包含关系,多个线程共享进程的空间。
    
    #线程在运行的时候的执行顺序由操作系统决定
    
    #一颗CPU同时只能执行一件事,他将时间切成很小的时间片,不同的时间片做不同的任务,所以就感觉在同时做多件事情(实际上是轮流执行程序的)。
    
    使用 pstree -p 可以看到系统中的进程和线程。#只有一个线程后面就不显示了(后面没有花括号)。
    

    协程

    协程:一个协程就相当于一个函数。
    

    进程、线程、协程的区别:

    1.线程是程序执行的最小单位,进程是操作系统分配资源的最小单位;
    
    2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
    
    3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间
    

    进程的结构

    • 任务列表

    • PCB

    任务列表

    任务列表:操作系统允许运行多个进程,进程之间构成了一个进程列表(任务列表),所有进程都放在里面的。

    PCB

    PCB:存放一个具体进程的全部信息(包括进程编号、状态、优先级等),因为系统有多个进程,所以就存在多个PCB,每个PCB之间通过指针变量关联

    页(Page)

    页:进程内存资源的分配的最小单位,类似于文件系统的block,页的默认大小也是4k

    虚拟地址和物理地址

    • 虚拟地址

    • 物理地址

    虚拟地址

    虚拟地址:存放相对地址,位置是变化的。不是固定的。

    应用程序看到的是虚拟地址
    
    物理地址

    物理地址:具体的一个固定地址

    MMU

    MMU:内存管理单元(cpu中的硬件芯片),把虚拟地址转换成物理地址。

    进程访问某个数据的时候,先把请求发送给操作系统,操作系统再交给cpucpu计算为物理地址,然后才能得到真正的数据。
    
    tlb

    tlb:缓存虚拟地址和物理地址的区域

    内存的分配空间

    • 用户空间:进程虚拟内存空间

    • 内核空间:操作系统使用的

    每个进程都包括5种不同的数据段

    • 代码段

    • 数据段

    • BSS段

    代码段:存放可执行文件的操作指令
    
    数据段:存放初始化了的全局变量
    
    BSS段:存放未初始化的全局变量 #Block Started by Symbol”的缩写,意为“以符号开始的块
    
    栈:存放临时变量(比如函数里面使用的变量) #先进后出  队列就是先进先出
    
    堆:存放数组、对象 
    

    进程使用内存问题

    • 内存泄漏

    • 内存溢出

    内存泄露: Memory Leak,分配的空间不释放,一直占用着
    
    内存溢出:Memory Overflow,程序申请的空间不够用。
    
    内存不足:OOM,内存不够用(java中的一种提示)
    

    进程运行的状态

    • 创建

    • 就绪:

    • 执行

    • 终止

    • 阻塞
      image

    使用 ps aux 可以看到进程的状态
    
    进程更多的状态:
    运行态:running #正在运行
    
    就绪态:ready
    
    睡眠态:进程不干活了,可中断:interruptable,不可中断(不能人为打断):uninterruptable
    
    停止态:stopped,进程处于暂停的状态
    
    僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死
    
    态的子进程(这种进程不占用空间)
    
    #结束僵尸态的方法:把它的父进程杀死就没了或者恢复父进程
    

    LRU 算法

    LRU:Least Recently Used 近期最少使用算法(喜新厌旧),用来实现内存的充分利用

    IPC 进程之间的通信

    IPC: Inter Process Communication

    通信方法:

    • 同主机

    • 跨主机

    同一主机上:

    • 管道

    • 套接字

    • 文件映射

    • 共享内存

    • 信号

    管道:cmd1 | cmd2 (管道符的两边就开启了两个进程),单工通信 # | 这属于匿名管道
    
    #命名管道:创建一个管道(pipe)文件,用来实现两个进程之间的通信。 A--->管道文件--->B
    #创建管道文件的命令:mkfifo(fifo:先进先出) 
    #格式: mkfifo pipe_name
    
    
    套接字:进程之间双向通讯
    #查看套接字的方法:find / -type s -ls
    
    文件映射:文件的数据映射到内存的一块空间中,多个进程共享这块内存空间
    
    共享内存:直接在内存中分配一块空间,这块空间大家都能使用。
    
    信号:trap -l 可以查看。发个信号进程收到以后就会按照指定的功能来进行操作。
    

    跨主机通信:

    socket:socket就是ip加上端口号。ip地址确定了设备在网络中的位置。端口号确定了设备上了具体应用程序。(使用tcp、udp协议都会分配要给与众不同的独有端口)

    范例

    范例:利用管道文件实现 IPC
    
    mkfifo /data/test.fifo #创建一个管道文件
    
    ll /data/test.fifo #使用ll查看管道的信息,发现它的大小是0字节,
    
    cat > /data/test.fifo #输入123456
    #在管道文件里面写入数据以后,不会自动退出,且此时文件的大小依然是0,以为这个管道文件是在内存里面的,不是在磁盘里面。
    
    #在另一个终端可以从文件中读取数据
    cat /data/test.fifo  #会读取到123456
    
    进程的优先级
    系统优先级范围:0-139
    
    0-9:实时优先级(一些特殊的系统进程)
    
    100-139:非实时优先级(大部分进程使用的都是这个范围)
    
    #数字越小,优先级越高。
    

    CentOS优先级:
    image

    nice数字范围:-20 -- +19  --对应系统优先级的100-139。 一般进程启动以后,优先级使用nice优先级的0
    
    top显示的优先级是0-39,对应系统优先级的100-139
    

    设置和调整进程优先级

    进程分类

    操作系统分类:
    • 协作式多任务:

    • 抢占式多任务:

    协作式多任务:一个任务得到cpu后,只有它主动放弃cpu,其他进程才能使用
    
    抢占式多任务:CPU的控制权由操作系统控制(由操作系统分配cpu资源)
    
    进程类型
    • 守护进程

    • 前台进程

    守护进程:daemon,计算机启动以后就自动运行,就和终端没关系了。
    
    前台进程:跟终端相关,通过终端启动的进程
    

    进程管理工具

    pstree工具:

    可以显示进程之间的父子关系

    #格式:
    pstree [选项] [pid|user]  #可以查看指定的进程信息,也可以查看所有的进程关系
    
    #选项:
    -p:显示pid
    
    -T:不显示线程
    

    ps工具:

    作用:实现进程信息的查看,默认显示当前终端中的进程(显示的是当前瞬间的状态)

    #ps默认显示的是当前终端中用户运行的进程列表。
    Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
    
    #格式:
    ps [选项]
    
    #三种选项风格:
    UNIX选项 如: -A -e  #单个字母
    
    GNU选项 如: --help  #完整单词
    
    BSD选项 如: a  #只需要一个字母
    
    #常用选项:
    
    a 选项包括所有终端中的进程
    u 显示每个进程是以谁的身份运行等信息
    x 显示和终端有关或无关的进程(和终端无端:随计算机启动就启动了)
    o 属性… 显示指定的属性列 pid、cmd、%cpu、%mem
    
    -e 显示所有进程,相当于-A
    -f 显示完整格式程序信息
    -p pid 显示指pid的进程
    -t ttylist 指定tty,相当于 t
    

    ps命令的输出信息:

    C :  ps -ef 显示列 C 表示cpu利用率
    
    VSZ: 操作系统承诺给进程的空间(虚拟内存占用空间)
    
    RSS: 操作系统实际给进程的空间(实际内存占用空间)
    
    TTY:所在的终端,如果是?号表示和终端无关
    
    STAT:进程状态
     R:running #正在运行中的
     S: interruptable sleeping #可中断的睡眠
     D: uninterruptable sleeping #不可中断睡觉
     T: stopped  #停止
     Z: zombie   #僵尸
     +: 前台进程
     l: 多线程进程
     L:内存分页并带锁
     N:低优先级进程
     <: 高优先级进程
     s: session leader,会话(子进程)发起者
     I:Idle kernel thread,CentOS 8 新特性
    
     ni: nice优先级,nice值 #范围-20 --- 19 对应:100-139
    
     pri: priority 系统优先级数字 #数字越大,优先级越高
    
     rtprio: 实时优先级 #对应系统0-99
    
     psr: processor 显示进程和cpu之间的绑定关系 #进程在那颗cpu上运行
    
    折叠

    范例

    #ps -ef  #unix风格
    #ps aux #bsd风格
    这个风格的选项显示的信息没有aux显示的要全
    
    
    ##查看进程的特定属性
    例如:#ps axo pid,cmd,%mem,%cpu
    
    #找到未知进程的执行程序文件路径
    #ps命令显示的只是pid和程序的名称,没有显示程序的文件路径
    ls -l /proc/1272/exe   #1272表示进程的pid  exe是一个软连接,指向程序的路径
    
    #范例:查看优先级和CPU绑定关系
    #ps axo pid,cmd,psr |grep 进程名
    

    prtstat工具:

    查看进程的信息

    #格式
    prtstat [选项] pid
    例如:#prtstat 1026
    
    [root@Centos8 ~]# prtstat 1026
    Process: sshd          		State: S (sleeping)
      CPU#:  1  		TTY: 0:0	Threads: 1
    Process, Group and Session IDs
      Process ID: 1026		  Parent ID: 1
        Group ID: 1026		 Session ID: 1026
      T Group ID: -1
    
    Page Faults
      This Process    (minor major):      718         8
      Child Processes (minor major):    80458        11
    CPU Times
      This Process    (user system guest blkio):   0.05   0.06   0.00   0.00
      Child processes (user system guest):        93.69  11.96   0.00
    Memory
      Vsize:       94 MB
      RSS:         7856 kB    		 RSS Limit: 18446744073709 MB
      Code Start:  0x56188adb7000		 Code Stop:  0x56188ae83f38
      Stack Start: 0x7fffde7c3120
      Stack Pointer (ESP):          0	 Inst Pointer (EIP):          0
    Scheduling
      Policy: normal
      Nice:   0 		 RT Priority: 0 (non RT)
    
    
    折叠

    查看某个进程的方法

    - ps 选项 | grep 'pattern' #查找某个进程
    
    - /sbin/pidof 按确切的程序名称查看pid
    
    - pgrep工具
    

    pgrep

    专门的进程过滤工具

    命令格式:
    pgrep [options] pattern
    
    # 选项:
    -u uid: effective user,进程所有者
    
    -U uid: real user,真正发起运行命令者
    
    -t terminal: 与指定终端相关的进程
    
    -l: 指定进程名 #根据进程名显示进程信息
    
    -a: 显示完整格式的进程名
    
    -P pid: 显示指定进程的子进程
    

    pidof

    知道程序名,用来获取进程pid。

    格式:pidof process _name
    
    #选项:
    -x: 查找脚本的进程id #脚本必须shebang机制开头,以bash的方式来运行找不到,需要加权限来运行才找得到
    

    uptime

    系统负载信息查询

    #和w命令、top命令最上面显示的信息也是一样的。
    
    #显示信息
    当前时间
    
    系统已启动的时间
    
    当前上线人数
    
    系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)
    

    实时进程的查看:

    • htop工具

    • top工具

    top工具

    动态实时查看进程信息

    #选项:
    -d # 指定刷新时间间隔,默认为3秒
    -b 全部显示所有进程
    -n # 刷新多少次后退出
    -H   线程模式
    
    #top命令显示的信息
    us:用户空间
    sy:内核空间
    ni:调整nice时间
    id:空闲
    wa:等待IO时间
    hi:硬中断
    si:软中断(模式切换)
    st:虚拟机偷走的时间
    

    htop工具

    top工具的增强版。

    #选项;
    -d #: 指定延迟时间;
    -u UserName: 仅显示指定用户的进程
    -s COLUME: 以指定字段进行排序
    #子命令
    s:跟踪选定进程的系统调用
    l:显示选定进程打开的文件列表
    a:将选定的进程绑定至某指定CPU核心
    t:显示进程树
    

    CPU相关信息显示:mpstat工具

    来源:sysstat包
    
    显示信息说明:
    CPU:
    %usr:用户空间占用时间
    %nicenice优先级
    %sys:系统内核占用时间
    %iowait:io等待
    %irq:中断	
    %soft:软中断
    %steal:被虚拟机运行占用的时间
    %guest:和虚拟化有关的
    %gnice:虚拟机调整优先级
    %idle:空闲的时间
    
    
     PID(进程id)
     USER(进程发起者)
     PR(top里面的优先级)
     NI(nice优先级)
     VIRT(虚拟内存空间)
     RES(实际内存占用空间)
     SHR(共享内存占用空间)
     S(进程状态)
     %CPU(cpu利用率)
     %MEM(内存)
     TIME+(总的运行时间)
     COMMAND(对应的命令)
    
    折叠

    内存相关信息查看

    free 可以显示内存空间使用状态

    选项:
    -b 以字节为单位
    
    -m 以MB为单位
    
    -g 以GB为单位
    
    -h 易读格式
    
    -o 不显示-/+buffers/cache行
    
    -t   显示RAM + swap的总和
    
    -s n 刷新间隔为n秒
    
    -c n 刷新n次后即退出
    

    缓存的清理方法

    向/proc/sys/vm/drop_caches中写入相应的修改值,会清理缓存
    执行echo 
    1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的
    

    查看进程打开文件 lsof

    lsof:list open files,列出正在打开的文件。

    #选项:
    -a:列出打开文件存在的进程
    -c<进程名>:列出指定进程所打开的文件
    -g:列出GID号进程详情
    -d<文件号>:列出占用该文件号的进程
    +d<目录>:列出目录下被打开的文件
    +D<目录>:递归列出目录下被打开的文件
    -n<目录>:列出使用NFS的文件
    -i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )
    -p<进程号>:列出指定进程号所打开的文件
    -u:列出UID号进程详情
    -h:显示帮助信息
    -v:显示版本信息。
    -n: 不反向解析网络名字
    
    
    

    范例

    查看某个端口是那个进程在使用
    
    #查看所有正在打开的文件:
    lsof 
    
    #找回被误删除的文件  前提是这个文件有人在访问
    1. lsof | grep delete #过滤出被删除的文件,找到正在访问这个文件的进程编号
    
    2. ll /proc/pid/fd #fd:文件描述符
    
    3. cat /proc/pid/fd/文件描述符 > 导出为新文件
    
    

    信号的管理

    kill工具

    用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以
    SIG开头(可省略),不区分大小写

    #显示当前可用的信号:
    trap -l
    
    kill -l
    
    #常用信号:
    1) SIGHUP 无须关闭进程而重新加载配置文件
    
    2) SIGINT 中止正在运行的进程;相当于Ctrl+c 
    
    3) SIGQUIT 相当于ctrl+\ #退出进程
    
    9) SIGKILL 强行关闭某个进程,可能会导致数据丢失(相当于按电源关机)
    
    15) SIGTERM  正常关闭某个进程,默认信号
    
    18) SIGCONT 继续运行
    
    19) SIGSTOP 后台休眠
    
    #信号的描述方法
    数字法:1, 2, 9
    
    全称:SIGHUP,sighup
    
    简称 去掉开头的SIG,HUP,hup
    
    #向进程发送信号
    通过pid的方式:
    kill [-s sigspec | -n signum | -sigspec] pid
    #-s sigspec:指定完整的信号名
    #-n signum:信号的数字表示法
    #-sigspec:信号的简写方法
    
    #根据程序名发送信号
    killall 程序名称
    
    #0信号
    信号为0,没有发送任何信号,仅仅检查进程是否正常工作。
    格式: killall -0 程序名
    
    例如:
    [root@centos8 ~]#killall -0 ping
    [root@centos8 ~]#echo $?
    0
    
    
    
    折叠

    作业管理

    • 前台管理

    • 后台管理

    前台运行管理:

    前台:依赖一个终端,在某个终端运行,启动以后就占用这个终端,在这个终端里面就不能做其他的操作了
    例如: ping 127.0.0.1

    后台运行管理

    后代:不占用终端资源,在进程执行的时候加一个&符号

    例如:ping 127.0.0.1 &
    

    前后台运行的切换

    默认大多数命令是前台执行,前后台是可以切换的。

    CTRL+C就是给前台执行的程序发送终止信号,快捷键支队前台执行的生效。对后台执行的程序无效。需要使用kill命令来发送信号
    

    前--后台切换方法:

    CTRL+Z快捷键 --- 把前台程序放到后台(放到后台以后程序就不运行了),通过bg 作业编号 --把后台停止的作业恢复成后台运行态
    作业编号的查询:jobs命令
    或者 kill -18 %作业编号
    

    后台运行-->后台停止:

    发送19信号: kill -19 %作业编号 作业编号:jobs命令

    后--前切换方法;

    fg 作业编号

    image

    后台执行的作用:

    前台执行都是按照循序执行的,后台执行可以实现并行执行

    后台执行的任务在终端关闭以后也会随之关闭。
    

    实现窗口关闭还继续执行的方法;

    方法一:screen命令
    程序执行之前开启screen:格式:screen
    然后再输入要执行的命令
    
    方法二:nohup命令
    格式:nohhup 要执行的程序 -- 会有输出的信息
    

    并行执行的实现:

    并行执行:让多个进程同时执行

    方法一:把他们都放到后台去执行
    
    方法二:(f1.sh&);(f2.sh&);(f3.sh&) --小括号括起来,分号隔开
    
    方法三:f1.sh&f2.sh&f3.sh&	
    

    范例:扫描ip地址

    net=10.0.0
    for i in {1..254};do
       { 
        if ping -c1 -W1 $net.$i &> /dev/null;then
            echo $net.$i is up
        else
            echo $net.$i is down
        fi
       }&  #若里面有多个命令,就用花括号就是把它作为一个整体 
    done
    wait  #后台执行的进程结束之后,主动退出
    
  • 相关阅读:
    通过动态IP解决网络数据采集问题
    Vue学习(一)之Vue2前端工程化和WenBack
    Python之人机猜拳游戏
    组件 计算属性
    pyTorch——基础学习笔记
    机器学习(四)——Lasso线性回归预测构建分类模型(matlab)
    【计算机基础知识9】前端设计模式与常见类型
    Python-模块系列-zip()函数-range()函数-sum()函数-shuffle() 随机函数
    让Easysearch运行在LoongArch(3C5000L)上
    线性代数中涉及到的matlab命令-第三章:矩阵的初等变换及线性方程组
  • 原文地址:https://www.cnblogs.com/heyongshen/p/16480050.html