zoukankan      html  css  js  c++  java
  • Linux 进程及作业管理

    进程简介:
      内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
      进程(Process):什么是进程,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的;从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位

      线程(Thread):一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上运行,必须得分成互不影响的多个执行流,而后每组单独在各自所分配的CPU上运行,这种分化后的执行流且有着比进程更小资源分配单位称之为线程。线程之间可以共享内存空间,当一个文件需要被打开多次时,线程模型可以节省很大的内存空间,但是得避免因资源征用造成死锁问题。并且线程在运行过程当中,如果某一个线程崩溃或是出现意外情况,会影响同个进程内其它线程,比单进程模型稳定性差。
      线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源

      进程和线程的区别:
      进程——资源分配的最小单位
      线程——程序执行的最小单位
      从函数调用上来说,进程创建使用fork()操作;线程创建使用clone()操作

      程序(Program):程序由指令和数据组成。程序是为了达到特定的目的,可以被计算机运行并且由命令代码组成的语句序列。程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(Executable Image)中,所以程序是一个静态的实体。

      虚拟地址空间:在内存中,每个程序的运行都是孤立的,每个程序只知道当前内存空间只运行了自己和内核,而看不到其它的进程。

      内核模式与用户模式:
      以32bit系统为例,Linux的虚拟地址空间为0~4G。Linux内核将这4G字节的空间分为两部分。将最高位的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为"内核空间"。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为"用户空间"。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。

      进程在Linux不同模式下运行分为:
      核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)
      用户态:这类进程工作在用户模式下,执行用户指令(Ring 3)
      如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。

      进程的分类:
      CPU-Bound(CPU密集型):对于CPU占用率高的进程(交互式不强的进程,如视频播放)。
      I/O-Bound(I/O密集型):等待I/O时间长的进程(交互式强的进程,如文本编辑需要不断的IO操作)

      进程的状态:
      运行态:runnnig
      就绪态:ready
      睡眠态:sleeping
        可中断睡眠(interruptable):随时来请求,随时能唤醒,比如处理完当前请求后暂时还没有更多请求下,这种sleep就是可中断
        不可中断睡眠(uninterruptable):等待外部条件满足之前无法继续运行(例如进程需要读取磁盘信息到内存中才能继续运行,但是还没读取完成)。通常是指被IO阻塞的过程,等待IO满足之前无法继续运行
      停止态:stopped,暂停于内存中,不会被内核调度运行,除非手动启动
      僵死态:zombie,父进程先于子进程结束了,子进程再也不能被停掉的进程。

      进程的优先级:
      CPU挑选进程是根据进程的优先级进行的,进程优先级的取值范围为0-139。
        实时优先级:0-99,数字越大,优先级越高(内核控制,动态调整)
        静态优先级:100-139,数字越小,优先级越高(用户可控制的优先级)
      用户可以通过调整nice值来调整静态优先级。nice值为-20-19(对应优先级100-139),进程启动时默认nice值为0,优先级对应为120。
      Linux使用抢占式多任务:当时钟信号到达时,高优先级进程可以抢占CPU。

      进程间通信方式IPC(Inter Process Communication)
      主机内部:singnal(信号指令)、shm(共享内存空间)、semerphor(旗语,信号量一种计数器)
      不同主机:rpc(remote procedure calling远程过程调用)、socket(IP:Port,套接字)

      子进程:进程运行是单线运行的,进程中的指令必须顺序执行;父进程有无法完成的任务时,启用子进程来执行,此时父进程进入睡眠,子进程执行完成后,返回父进程继续执行。

      进程创建机制:每一个进程都是由其父进程fork(),clone()自身而来。

      进程创建过程:系统首先以fock的方式复制(cow)一个与父进程相同的进程,这个进程与父进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别码PID;然后新产生的进程开始加载实际要运行的程序进行执行。

      线程:线程是比进程更小的可以被单独调度的单位。线程将进程的任务指令拆分,分配到不同的CPU上同时运行。不过Linux中的进程都是轻量级进程,已经相当于线程的级别了。

    进程监控工具:
      pstree display a tree of processes 显示进程树
      -p 显示进程号(可以指定进程号查看指定进程的信息)

      ps process state查看当前进程状态
      ps命令显示的是ps命令执行时系统上进程信息的快照,是静态的结果。Linux运行中内核的相关信息是通过/proc伪文件系统输出的;各进程都有一个其PID命名的子目录,每个子目录中许多文件存储了进程的相关信息。实际是查看/proc/PID/目录下内核中的状态信息
      Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
      内核参数:可设置其值从而调整内核运行特性的参数,在/proc/sys/下
      状态变量:其用于输出内核中统计信息或状态信息,仅用于查看

     ps选项有三种风格:
      UNIX options, which maybe grouped and must be preceded by a dash
      BSD options, which maybe grouped and must not be used with a dash
      GNU long options, which arepreceded by two dashes

      进程启动方式:
      系统启动过程中自动启动:与终端无关的进程;
      通过用户终端启动:与终端相关的进程;ps命令默认显示是本次登陆bash相关的进程(可以加个-l显示详细信息)

      选项:
      a  显示所有与终端有关的进程
      x  显示所有与终端无关的进程
      u  显示运行进程的用户
      -e 显示所有进程(同ax)
      -f 显示完整格式的进程信息
      -H 以进程层级格式显示进程相关信息
      o field1,field2,… 自定义要显示的字段列表,以逗号分隔

      常用组合:aux、-ef、-eFH、-eo、axo
      ps aux 输出信息描述
      USER 运行该进程的用户
      PID  进程的ID号码
      %CPU CPU的占用百分比
      %MEM 内存空间占用比率,占用整个内存空间的比例
      VSZ  Virtual memory SiZe虚拟内存集;占用的虚拟内存大小,真正用来占用的内存
        每个内存占用的内存有两种:线性内存空间、物理内存空间
        线性内存:会映射到物理内存,在线性内存空间角度看是连续的内存占用
        物理内存:实际上是以内存页框保存,可能一个进程占用的不连续的页框
      RSS  ResidentSize,常驻内存集,当前进程常驻内存的大小,即不能被交换出去的空间大小(如程序的指令信息)
      TTY  运行终端(如果是"?"表示非终端进程)
      STAT 当前进程的运行状态,BSD样式
        R:running,运行态
        S:interruptable sleeping,可中断睡眠
        D:uninterruptable sleeping,不可中断睡眠
        T:Stopped,停止状态
        Z:zombie,僵死状态,进程结束后,在被回收之前状态
        +:表示是一个前台进程,占据命令提示符
        l:多线程进程
        N:低优先级进程
        <:高优先级进程
        s:session leader ,会话主导进程,如shell主导其下的进程
      START  进程启动时间
      TIME   累计运行占用CPU时间
      COMMAND 启动此进程的程序(有中括号的是kernel进程)

      ps -ef 输出信息描述
      UID  启动该进程的用户名
      PID  进程号
      PPID  父进程的进程号,如果是0表示在内核启动init之前该进程存在,init启动后被终止了(过渡作用,一般为swap的进程)
      C    cpu utilization,CPU的占用百分比
      STIME 进程的启动时间
      TTY  运行进程的终端
      TIME  累计运行占用CPU时间
      CMD  启动此进程的程序

      ps axo 显示自定义字段列表
      ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
      ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
      o field1,field2,… 自定义要显示的字段列表,以逗号分隔,o要写在后面,因为要带参数
      常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
        ni    nice值
        pri   priority,优先级
        rtprio realtime priority,实时优先级

      pgrep、pkill 基于进程名字或者其他属性对相关进程发起查询、发送信号
      pgrep [options] [pattern]
      -o  仅显示找到的最小(起始)进程号
      -n  仅显示找到的最大(结束)进程号
      -l  显示指定进程名的信息
      -P # 指定父进程号下的进程列表
      -g  指定进程组的信息
      -t  指定开启进程的终端
      -u  指定进程的有效用户ID

      pidof 根据进程名获取其pid

      top display Linux processes 动态显示进程信息
      选项:
      -d #  指定刷新时间间隔,默认为3秒
      -b    以批次方式显示
      -n #  显示多少批次
      -p PID 指定PID来进行观察监测特定进程

      top显示过程中通过交互式命令指定排序(默认CPU):
      P 以占据CPU百分比排序
      M 以占据内存百分比排序
      T 以累积占用CPU时间排序
      N 以PID来排序

      首部信息关闭
      uptime信息   l
      tasks及cpu信息 t
       内存信息    m
      退出命令       q
      修改刷新时间间隔   s
      终止指定的进程    k
      给某个PID设置nice值 r

      top显示信息描述:

      第一行:
      20:17:21  当前系统时间
      up 1 day  系统连续运行的时长为1天
      3 users   当前登录系统的用户数为3个
      load average 过去1分钟、5分钟、15分钟的平均负载(CPU进程运行队列中等待运行进程的个数占整个队列的百分比);值越小表示系统越空闲,如果高于1,就需要注意当前系统负载过高

      第二行:
      显示的是目前进程的总量,不同程序状态(running、sleeping、stopped、zombie)个数,需要注意的是最后的zmobie值,如果不是0就要查看下哪个进程处于僵死状态

      第三行:使用数字1可以查看不同的CPU的信息(多CPU的情况下),下面说明各字段具体的含义:
      us:user space,用户空间进程运行占用CPU百分比
      sy:system,内核空间进程运行占用CPU的百分比
      ni:nice,用户进程空间内改变过优先级的进程占用CPU百分比
      id:idle,空闲CPU百分比
      wa:wait io,等待IO花费的时间
      hi:hardware interrupt,硬中断占用CPU的百分比
      si:software interrupt,软中断占用CPU的百分比
      st:stolen,偷走的时间百分比(虚拟化)

      第四行:表示物理内存的使用情况
      第五行:表示交换分区的使用情况

      第六行:
      PID:进程ID
      USER:进程所属的使用者
      PR:Priority的简写,进程的优先级,越小优先级越高
      NI:Nice的简写,与Priority有关,也是越小越早被运行
      VIRT:进程需要的虚拟内存大小,而非使用的虚拟内存大小
      RES:进程当前使用的内存大小,不包括swap
      SHR:进程与其他进程共享的内存大小,可通过RES-SHR来计算进程所占用的物理内存
      S: 进程状态
      %CPU:CPU的使用率
      %MEM:物理内存使用率
      TIME+:累计运行占用CPU时间

      uptime 显示系统时间、运行时长及平均负载
      选项:
      -a 显示所有系统相关的信息
      -s 显示内核名称
      -r 显示内核版本
      -m 显示系统硬件名称,例如 i686 或 x86_64 等
      -p 显示CPU类型,与 -m 类似,只是显示的是 CPU 的类型
      -i 硬件平台 (ix86)

      htop
      这个工具默认没有安装 需要第三方源才可以安装
      阿里云EPEL源baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
      rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
      yum install htop
      选项:
      -d # 指定延迟时间间隔
      -u UserName 仅显示指定用户的进程
      -s COLUME 以指定字段进行排序

      子命令:
      l 显示选定的进程打开的文件列表
      s 跟踪选定的进程的系统调用
      t 以层级关系显示各进程状态
      a 将选定的进程绑定至某指定的CPU核心

    资源监控工具
      动态显示系统资源的使用情况,这些资源包括:内存、磁盘、网络、cpu等
    vmstat命令:
      vmstat [options] [delay [count]]
      选项:
      -s: 显示内存的统计数据
      vmstat 1 3 每1秒统计一次,共统计3次(第一个参数是间隔多少秒统计一次,第二个参数是统计多少次,如果没指定就一直统计)
      显示信息描述:
      procs:
        r:队列中等待运行的进程的个数
        b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
      memory:
        swpd: 交换内存的使用总量
        free:空闲物理内存总量
        buffer:用于buffer的内存总量
        cache:用于cache的内存总量
      swap:
        si:数据进入swap中的数据速率(kb/s)
        so:数据离开swap中的数据速率(kb/s)
      io:
        bi:从块设备读数据到系统的速率(kb/s)
        bo: 系统保存数据至块设备的速率(kb/s)
      system:
        in: interrupts, 中断速率,每秒被中断的次数
        cs: context switch, 进程上下文切换速率
      cpu:
        us: user space,用户空间进程运行占用CPU百分比
        sy: system,内核空间进程运行占用CPU的百分比
        id: idle,空闲CPU百分比
        wa: wait io,等待I/O花费的时间
        st: stolen,偷走的时间百分比(被虚拟机偷走的CPU)

    pmap命令:pmap - report memory map of a process 查看进程到物理内存的映射信息
      pmap [options] pid [...]
      -x  显示详细格式的信息
      另外一种实现:
      # cat /proc/PID/maps

    glances命令:精细化的系统信息监控工具
      glances是一款用于Linux、BSD的开源命令行系统监控工具。能够监视CPU、负载、内存、磁盘I/O、网络流量、文件系统、系统温度等信息
      这个工具默认没有安装 需要第三方源才可以安装
      阿里云EPEL源baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
      glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
      内建命令:
      a Sort processes automatically l Show/hide logs
      c Sort processes by CPU% b Bytes or bits for network I/O
      m Sort processes by MEM% w Delete warning logs
      p Sort processes by name x Delete warning and critical logs
      i Sort processes by I/O rate 1 Global CPU or per-CPU stats
      d Show/hide disk I/O stats h Show/hide this help screen
      f Show/hide file system stats t View network I/O as combination
      n Show/hide network stats u View cumulative network I/O
      s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
      y Show/hide hddtemp stats

      常用选项:
      -b 以Byte为单位显示网卡数据速率
      -d 关闭磁盘I/O模块
      -f /path/to/somefile 设定输出文件位置
      -o {HTML|CSV} 与-f一起指定输出文件格式
      -m 禁用mount模块
      -n 禁用网络模块
      -t # 延迟时间间隔
      -1 每个CPU的相关数据单独显示

      C/S模式下运行glances命令:用于监控远端服务器
      服务模式:
        glances -s -B IPADDR
        IPADDR: 指明监听于本机哪个地址
      客户端模式:
        glances -c IPADDR
        IPADDR:要连入的服务器端地址

    dstat命令:系统资源统计的通用工具
      dstat [-afv] [options..] [delay [count]]
      常用选项:
      -c 显示cpu相关信息
      -C #,#,...,total 多颗CPU时显示指定CPU相关信息
      -d  显示disk相关信息
      -D total,sda,sdb,... 显示指定块设备相关信息
      -g 显示page相关统计数据
      -m 显示memory相关统计数据
      -n 显示network相关统计数据
      -p 显示process相关统计数据
      -r 显示io请求相关的统计数据
      -s 显示swapped相关的统计数据
      --tcp   显示TCP相关统计
      --udp   显示UDP相关统计
      --unix   显示unix
      --raw   显示裸socket统计
      --socket  显示socket统计
      --ipc    显示内部进程间通信统计
      --top-cpu 显示最占用CPU的进程
      --top-io  显示最占用io的进程
      --top-mem 显示最占用内存的进程
      --top-latency 显示延迟最大的进程

    进程管理工具
    kill命令:向进程发送控制信号,以实现对进程管理
      显示当前系统可用信号:
      kill -l
      man 7 signal
      常用信号:
      1) SIGHUP  无须重启进程而让其重读配置文件
      2) SIGINT  中断正在运行的进程;相当于Ctrl+c
      9) SIGKILL  强制杀死正在运行的进程(直接关闭进程)
      15) SIGTERM 正常方式终止正在运行的进程(会关闭进程打开的文件等再终止进程)
      18) SIGCONT 让后台停止的进程继续在后台运行,相当于bg命令
      19) SIGSTOP 将前台进程转入后台并停止运行,相当于Ctrl+Z
      指定信号的方法:
      信号的数字标识:1、2、9
      信号完整名称:SIGHUP
      信号的简写名称:HUP
      向进程发信号:后面也可以是PID,也可以是作业号(%Job_Number)
      kill [-SIGNAL] PID...
      终止"进程名称"下的所有进程:
      killall [-SIGNAL] Program

    Linux的作业控制
      前台作业:通过终端启动,且启动后一直占据终端
      后台作业:可以通过终端启动,但启动后即转入后台运行(释放终端)
      注意:一个进程通过终端启动,如果终端结束,通过该终端启动的所有进程都被终止
      如何让作业运行于后台
      运行中的作业:Ctrl+Z
      尚未启动的作业:COMMAND &
      此类作业虽然被送往后台运行,但其依然与终端相关;如果希望送往后台后,剥离与终端的关系:nohup COMMAND &
      nohup不支持bash内建的指令

      查看所有作业:jobs
      -l 除了列出 job number 与指令串之外,同时列出 PID 的号码
      -r 仅列出正在背景run的作业
      -s 仅列出正在背景当中暂停 (stop) 的作业
      作业控制:
      fg [[%]JOB_NUM]:把指定的后台作业调回前台运行(可以省略%),
      如果没指定作业号,默认调回带+(最近被放到后台的作业)号的作业,下一个是带-(倒数第二个被放到后台的作业)号的
      bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行(可以省略%)
      kill [%JOB_NUM]:终止指定的作业(作业号前必须加%,因为要与进程号区分);

    进程优先级调整:
      静态优先级:100-139对应nice值-20-19;进程默认启动时的nice值为0,优先级为120;
      nice值可以父进程传递给子进程
     nice命令:启动进程时指定nice值
      nice [OPTION] [COMMAND [ARG]...]
      nice -n 5 htop
      renice命令:修改已启动进程的nice值
      renice [-n] priority pid...
      renice -n 3 htop
      查看进程的nice值:
      ps axo pid,comm,ni,priority

    其它监控命令:sar, tsar, iostat, iftop

  • 相关阅读:
    Bellman-Ford算法
    POJ3468--A Simple Problem with Integers(Splay Tree)
    【组队训练】2014鞍山区域赛
    Educational Codeforces Round 85 (Rated for Div. 2)
    HDU6061 RXD and functions【NTT】
    HDU6434 Count【欧拉函数 线性筛】
    2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)(9/11)
    2015 German Collegiate Programming Contest (GCPC 15) + POI 10-T3(12/13)
    CodeCraft-20 (Div. 2)
    图论题集
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9857768.html
Copyright © 2011-2022 走看看