Linux 进程及作业管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程及作业管理相关的知识,希望对你有一定的参考价值。

Linux 进程及作业管理



概述:


一、进程的相关概念:


1.相关定义:


  • 内核的功用:
      进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等;  
     

  • 通俗的来说进程是运行起来的程序。唯一标识进程的是进程描述符(PID),在linux内核中是通过task_struck和task_list来定义和管理进程的 ;


  • 进程 Process:
     运行中的程序的一个副本,是被载入内存的一个指令集合;
       ˙进程ID(Process ID,PID)号码被用来标记各个进程;
       ˙UID、GID、和SELinux语境决定对文件系统的存取和访问权限;
       ˙通常从执行进程的用户来继承;
       ˙存在生命周期;
       

  • task struct:Linux内核存储进程信息的数据结构格式;


  • task list:多个任务的的task struct组成的链表;


2.进程创建  


  • init:第一个进程
            父子关系
           

  • 进程:都由其父进程创建,COW(写实复制)
            fork(), clone()
           

  • 创建过程:


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

3.进程优先级


  • 进程的优先级是用数字0-139来表示的,分为两类:
     
         99-1:实时优先级,由内核维护(数字越大,优先级越高)
           

        100-139:静态优先级,使用nice值来调整(数字越小,优先级越高);
       

  • Nice值
        -20,19对应静态优先级100-139
       

  • Big O
        时间复杂度,用时和规模的关系
          O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
           


4.进程内存  


  • Page Frame: 页框,用存储页面数据,存储Page 4k;


  • LRU:Least Recently Used 近期最少使用算法,释放内存;


       注:内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,          操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。


  • 物理地址空间和线性地址空间;


  • MMU(内存管理单元):负责转换线性和物理地址


       注:MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)      中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,        以及 提供硬件机制的内存访问授权,多用户多进程操作系统。


5.IPC: 进程间通信 Inter Process Communication 


  • 在计算机网络体系中,主机与主机之间的通信,实质上是主机进程与主机进程之间的通信,也就是进程间的通信;


  • 同一主机上
          signal:信号指令;
          shm: shared memory 共享内存空间
          semophore:信号量,一种计数器
         

  • 不同主机上:
          rpc: remote procedure call
          socket: 套接字,IP和端口号

6.Linux内核抢占式多任务


7.进程类型:     


根据进程与终端的关系可以分为:

  • 守护进程: daemon,在系统引导过程中启动的进程,和终端无关的进程;

  •  前台进程:跟终端相关,通过终端启动的进程;
     注意:两者可相互转化

8.进程状态:


进程被内核调度的过程中的状态可以分为:

  • 运行态:running

  • 就绪态:ready


  • 睡眠态:

     可中断:interruptable
     不可中断:uninterruptable,
         
通常是指被IO阻塞的过程,等待IO满足之前无法继续运行。


  • 停止态:stopped,暂停于内存中,但不会被调度,除非手动启动;


  • 僵死态:zombie,结束进程,父进程结束前,子进程不关闭

9.进程的分类:


  • CPU-Bound:CPU密集型,非交互;

  • IO-Bound:IO密集型,交互;


  • 根据在linux不同模式下运行分为:

       核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)。
       用户态:这类进程工作在用户模式下,执行用户指令(Ring 3)。          
         

  • 如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。

10.进程与线程的关系:


  • 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位


  • 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。


  • 进程——资源分配的最小单位,线程——程序执行的最小单位


  • 从函数调用上来说,进程创建使用fork()操作;线程创建使用clone()操作


参考资料:《Linux内核设计与实现》《深入理解Linux内核》




二、进程的系统管理工具


  • Linux系统状态的查看及管理工具
        pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill     pkill, job, bg, fg, nohup
       

  • CentOS 5:SysV init

   CentOS 6:upstart

   CentOS 7:systemd
   
   /sbin/init

1.pstree命令

   pstree-display a tree of processes(显示查看进程树)

   以下为CentOS 6 和 CentOS 7 的区别

[[email protected] ~]# pstree
init─┬─abrtd           #可以看到都是有init生成的
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─bonobo-activati───{bonobo-activat}
     ├─clock-applet
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─2*[dbus-daemon]
     ├─2*[dbus-launch]
     ├─devkit-power-da
     ├─dhclient
     ├─gconf-im-settin
     ├─gconfd-2
[[email protected] ~]# pstree
systemd─┬─NetworkManager─┬─2*[dhclient]
        │                └─2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─alsactl
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─chronyd
        ├─crond
        ├─cupsd
        ├─dbus-daemon
        ├─gssproxy───5*[{gssproxy}]
        ├─login───bash
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]

2./proc:内核中的状态信息

   Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中   


  • Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。


  • 内核参数:
        可设置其值从而调整内核运行特性的参数,在/proc/sys/下;
        状态变量:其用于输出内核中统计信息或状态信息,仅用于查看;
         

  • 参数:模拟成文件系统;
     

  • 进程:
         /proc/#:
              #:PID
      

技术分享


2.启动进程的方式:

   系统启动过程中自动启动:与终端无关的进程;

      用户通过终端启动:与终端相关的进程




三、显示系统当前进程的运行情况

ps: process state 

     ps-report a snapshot of the current processes  


1.使用ps来查看进程信息

  • 语法:ps[OPTION]...


  • 支持三种选项:
       UNIX选项 如 -a
       BSD选项  如 a
       GUN选项  如 --help
       

  • 选项和参数

      默认显示当前终端中的进程;
      a 所有与终端相关的进程
      x 所有与终端无关的进程
     
    u 显示进程所有者的信息;

      f 显示进程的父进程;
      o属性… 选项显示定制的信息


示例:如下

[[email protected] 1]# ps a
   PID TTY      STAT   TIME COMMAND
  2024 tty2     Ss+    0:00 /sbin/mingetty /dev/tty2
  2026 tty3     Ss+    0:00 /sbin/mingetty /dev/tty3
  2028 tty4     Ss+    0:00 /sbin/mingetty /dev/tty4
  2030 tty5     Ss+    0:00 /sbin/mingetty /dev/tty5
  2032 tty6     Ss+    0:00 /sbin/mingetty /dev/tty6
  2105 tty1     Ss+    0:00 -bash
  3922 pts/1    Ss+    0:00 /bin/bash
  4864 pts/2    Ss     0:00 -bash
  5142 pts/2    R+     0:00 ps a
[[email protected] 1]# ps
   PID TTY          TIME CMD
  4864 pts/2    00:00:00 bash
  5144 pts/2    00:00:00 ps
[[email protected] 1]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19344  1632 ?        Ss   08:27   0:01 /sbin/init
root          2  0.0  0.0      0     0 ?        S    08:27   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    08:27   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    08:27   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    08:27   0:00 [stopper/0]
root          6  0.0  0.0      0     0 ?        S    08:27   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    08:27   0:18 [events/0]
root          8  0.0  0.0      0     0 ?        S    08:27   0:00 [events/0]
root          9  0.0  0.0      0     0 ?        S    08:27   0:00 [events_long/0]
root         10  0.0  0.0      0     0 ?        S    08:27   0:00 [events_power_ef]
root         11  0.0  0.0      0     0 ?        S    08:27   0:00 [cgroup]
root         12  0.0  0.0      0     0 ?        S    08:27   0:00 [khelper]

2.常用组合之一:aux

VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSidentSize, 常驻内存集
STAT:进程状态
    R:running
    S: interruptable sleeping 可中断睡眠
    D: uninterruptable sleeping 不可中断睡眠
    T: stopped 停止状态
    Z: zombie  僵死态
    +: 前台进程
    l: 多线程进程
    N:低优先级进程
    <: 高优先级进程
    s: session leader,会话(子进程)发起者

3.常用组合之二:-ef

   -e: 显示所有进程

    -f: 显示完整格式程序信息

[[email protected] 1]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 08:27 ?        00:00:01 /sbin/init
root          2      0  0 08:27 ?        00:00:00 [kthreadd]
root          3      2  0 08:27 ?        00:00:00 [migration/0]
root          4      2  0 08:27 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 08:27 ?        00:00:00 [stopper/0]
root          6      2  0 08:27 ?        00:00:00 [watchdog/0]
root          7      2  0 08:27 ?        00:00:20 [events/0]
root          8      2  0 08:27 ?        00:00:00 [events/0]
root          9      2  0 08:27 ?        00:00:00 [events_long/0]
root         10      2  0 08:27 ?        00:00:00 [events_power_ef]
root         11      2  0 08:27 ?        00:00:00 [cgroup]
root         12      2  0 08:27 ?        00:00:00 [khelper]
root         13      2  0 08:27 ?        00:00:00 [netns]
root         14      2  0 08:27 ?        00:00:00 [async/mgr]


4.常用组合之三:-eFH

    -F: 显示更完整格式的进程信息

            C:cpu utillization

            PSR:运行于哪颗cpu之上

    -H: 以进程层级格式显示进程相关信息

[[email protected] 1]# ps -eFH
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          2      0  0     0     0   0 08:27 ?        00:00:00 [kthreadd]
root          3      2  0     0     0   0 08:27 ?        00:00:00   [migration/0]
root          1      0  0  4836  1632   0 08:27 ?        00:00:01 /sbin/init
root        581      1  0  2709   952   0 08:27 ?        00:00:00   /sbin/udevd -d
root       2033    581  0  2708   940   0 08:27 ?        00:00:00     /sbin/udevd -d
root       2034    581  0  2708   920   0 08:27 ?        00:00:00     /sbin/udevd -d
root       1525      1  0  6899   868   0 08:27 ?        00:00:00   auditd
root       1559      1  0 62288  1696   0 08:27 ?        00:00:00   /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc        1610      1  0  4745   892   0 08:27 ?        00:00:00   rpcbind
dbus       1630      1  0  5559  1700   0 08:27 ?        00:00:00   dbus-daemon --system
rpcuser    1652      1  0  5838  1380   0 08:27 ?        00:00:00   rpc.statd
root       1687      1  0 47243  3360   0 08:27 ?        00:00:00   cupsd -C /etc/cups/cupsd.conf


常用组合之四 :-eo axo

 o field1,field2...:自定义要显示的字段,以逗号分隔;

 常用的字段:pid,ni,pri,pcpu,stat,comm,tty,ppid

      ni: nice值

      pri: priority,优先级

      psr: processor, CPU编号

      rtprio: 实时优先级

[[email protected] 1]# ps -eo pid,tty,ni,comm
   PID TT        NI COMMAND
     1 ?          0 init
     2 ?          0 kthreadd
     3 ?          - migration/0
     4 ?          0 ksoftirqd/0
     5 ?          - stopper/0
     6 ?          - watchdog/0
     7 ?          0 events/0
     8 ?          0 events/0
     9 ?          0 events_long/0
    10 ?          0 events_power_ef
    11 ?          0 cgroup



    







以上是关于Linux 进程及作业管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux自学笔记——linux进程及作业管理

Linux基础之进程及作业管理

Linux基础之进程及作业管理

Linux的进程及作业管理知识(上)

Linux进程管理及作业控制的启动进程

2016-10-5 linux基础学习——进程及作业管理