Linux进程管理

Posted

tags:

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

Linux进程管理详解

   我们的计算机在启动起来之后,计算机上的操作系统,尤其对现代的操作系统来说,其实操作系统就是由内核(kernel)和运行在内核之上的众多进程(process)来实现的,因此一个启动起来的计算机就是由底层的硬件和在硬件之上直接管理硬件的内核以及运行在内核之上的进程来共同管理的,进程其实就是运行起来的程序而已,程序没有运行起来的时候是保存在我们的磁盘上面的,运行起来之后就会被载入到我们的物理内存中去,但是简单的依靠物理内存去管理多个同时运行起来的程序是非常不便的,因为任何一个内存中进程的bug都有可能会覆盖其他进程的内存空间,为了避免这种情况的出现,我们引入了内存地址的概念,每一个内存中的进程,都有属于自己的内存空间,而且这些空间是有地址的,其他进程无法占用这些空间。

    我们的内核是一个程序,当它在我们的计算机硬件上面运行起来的时候可以负责完成的工作有文件系统的管理、网络功能的管理、驱动程序的管理、安全功能的管理以及进程管理等等,假设此时我们的CPU只有一颗,内存地址也只有一段,但是我们此时需要三个程序同时运行该怎么办?在我们看来它们是同时运行的,事实上它们必须得轮流的去使用计算机资源,CPU就类似于我们人类的大脑,一心不可以二用,同一时间不可以去想多件事情,要想同时想多件事情那么就只有将事件交替着进行三个程序都要运行起来,意味着这三个进程在内存中都得有数据,因为数据只有在载入到内存中之后才可以被我们的CPU访问,最终我们需要修改的数据可以从内存中同步到我们的硬盘中去,我们的硬盘属于I/O设备,我们计算机的所有运行过程其实都是在我们的CPU和内存中完成的,因此三个进程运行起来了就意味着这三个进程必须在物理内存中有空间保存着当前进程运行时所需要的所有数据,因为我们的CPU只有一颗,所以在某一时刻可以在CPU上运行的进程只有一个,这一个有可能三个进程当中的一个,也有可能是我们的内核,x86系列的CPU的执行是由所谓得执行环的,所谓的执行环就是CPU的特权级别,最内层的环叫做0环(也叫做级别0),最外层的环叫做三环,0环也叫做特权层,所有可执行的特权命令,尤其是操作硬件的命令(比如清空一个缓存,清空一个寄存器等等,这些都是和直接操作硬件相关的,只有我们的内核才能够去执行这些操作),所以只有我们的内核进程才能运行在CPU的0环上,而基于操作系统所设计的历史上的原因,我们的用户进程(比如word文档等等),只能运行在CPU的第三环上,CPU的一环和二环是没有被使用的,那因此对于我们整个操作系统的内存空间来讲,内核进程所运行的位置我们称之为内核空间,而用户进程所运行的位置被称为用户空间,但凡是涉及到一些敏感操作的时候,都是由内核进程来控制完成的,比如说当我们执行一个我们再熟悉不过的命令mkdir的时候,当我们发起这个命令的时候,其实就是启动了一个进程,mkdir这个命令本身是位于磁盘上的一个可执行文件,当我们执行这个命令的时候,这个程序就会被装载进内存,而且会在内存中给它启动一段区域,它所需要的指令和数据都在那段区域里面,这就是启动了一个进程的过程,所以说进程是一个逻辑概念,进程这个东西不是实际存在的,因此当mkdir这个程序运行起来的时候,它的功能是创建一个目录,而创建目录那就意味着一定会和硬件进行通信,只由内核进程才具有和硬件通信的权限,所以说当我们在某一时刻执行mkdir这个命令的时候,这个命令开始在CPU上面运行,而支持该进程的指令会被一次一个的从内存中拿到CPU上面去运行,当运行到需要访问硬盘的指令时,这个时候mkdir这个进程就会向内核发起操作硬盘的申请,当我们的内核接收到该申请的时候,就会立即转入内核模式,这个时候mkdir这个进程就会处于一种无法中断的睡眠状态,等待内核操作完硬件之后再次被唤醒,其实这个过程可以做这样的一个比喻,比如说有一个讲台(CPU),大家在上面轮流做演讲,当你(mkdir)演讲到一半的时候,主席(kernel)突然出来把你打断要上去讲话,但是当mkdir这个进程被打断之后并不会退出,因为它的任务还没有完成,它只是暂时睡眠了(它会归队,到它本来应该呆的地方的最前面排队),还会被再次唤醒,还可以从它上次中断的地方开始重新在CPU上运行,这就意味着mkdir这个进程必须记录下自己上次是执行到哪一条指令的时候中断的,这个记录的过程我们称之为保存现场,但是作为人来讲我们有脑子可以记录下自己上次是什么时候被打断的,但是对于进程来说,它是如何记录下自己的上次是在哪里中断的呢?这个进程的执行状态信息其实是由我们的内核来负责记录的,内核可以管理我们当前系统上的每一个进程(某一时刻该哪一个进程到CPU上去运行了、下一个到CPU上运行的进程是谁以及某个进程可以在CPU上运行多长时间,还有如果一个进程没有运行完就从CPU上退出了,它的原状态信息的记录等等这些功能都是由内核来实现完成的),我们的内核必须负责去追踪每一个进程的执行状态信息,而且还必须明确知道当前系统上一共运行了多少个进程,那么我们的内核是如何追踪系统上的所有进程的执行状态信息的呢?其实我们的内核在内存的内核空间中维持有一个内核数据结构,这个结构被称为task structure->任务结构,我们当前系统上运行的所有进程信息都保存在task structure这个纵向的表里,所以接下来该哪个进程到CPU上运行了以及上次被中断运行的进程这一次得从什么地方开始运行,这些信息都保存在task structure里面,其实对于我们的计算机来讲只有所谓的CPU和内存,在某一时刻,我们的内存是被分为两段的,一段叫做内存空间,另一端叫做用户空间,用户空间中存在着多个用户进程,而且用户空间中的进程信息都是保存在内核空间中的,而且是一一对应的,在我们需要继续运行上次被中断的用户进程的时候,内核会把相对应的用户进程的信息装载进CPU的寄存器当中,这样我们的CPU就知道该如何继续运行该用户进程了,这个过程叫做恢复现场,然后CPU依靠这些信息开始继续运行上次被中断的那个进程,运行的过程中,保存在CPU寄存器当中的进程的执行状态信息也会实时更新,当再次需要中断该进程的时候,会再次将该进程中断那一刻的执行状态信息保存在task structure当中,这又是一次保存现场的过程,然后等到再次需要唤醒此进程的时候,就会再次恢复现场,知道该进程运行结束,它在内存用户空间的中的内存空间就会被释放,在task structure中保存的相关信息也会被清除,这就是进程运行的全部过程。

    每一个进程在内存中占据的空间大小未必是一样的,但是某个进程可能会随着程序的运行所占据的内存空间逐渐变大从而会占据其他进程的内存空间,也有可能是程序员恶意操作导致某个进程的内存空间覆盖掉其他进程的内存空间,还有一种情况,如果内存中先前运行的进程的内存空间比之后进程申请的内存空间小的话,那么在先前的的那段内存空间在释放之后就会浪费掉,为了避免以上的两种情况的出现,我们把内存空间分为线性地址空间和物理地址空间,也就是我们常说的线性内存和物理内存,我们以32位的系统为例,系统中的每一个进程都认为自己是4G内存可用,我们把底端的1G空间分给内核空间,系统上的任何一个进程从自己的角度来看当前系统只有两个进程,一个是自己,另一个是内核进程,这只是一个逻辑上的假象,在真正的物理内存当中,是由多个用户进程和一个内核进程共处于同一个硬件之上的,要想实现这种共处机制,CPU必须将内存的用户空间分为一个一个的页框(页面),每一个页面都是一个固定大小的存储单元,假设一个进程需要10k大小的运行空间,进程本身是由内核启动的,内核接收申请后负责在内存中找三个页面,假设一个页面的大小为4k,然后将这个三个页面大小的用户空间给该进程,故这个进程就占据了三个页面大小的用户空间,此时这个进程才可以正常的运行起来,但是这三个页框在物理内存中很有可能是不相邻的,因为进程看到的信息是内核空间中的task structure提供的,虽然我们给上面那个进程提供了三个页框大小的用户空间,但是进程很有可能根本用不了这么大的空间,比如就像上面刚刚说过的那个例子,所以说一个进程需要多少的内存空间,我们的内核才会给它在线性地址空间中分配多少空间,这样就避免了空间的浪费,每个进程在线性内存中占据的内存空间,和它在物理内存中占据的实际页框是一一对应的,这个对应关系的信息保存在task structure结构中的一个子结构中,内存中除了有页框视图外,还可以有下午中的视图方法:

                 技术分享

    forbidden段:禁止用户进程使用,属于内核空间

    program text(.text)段:叫做文本段,里面保存的是指令

        ->程序是由指令+数据组成的,text指的就是指令,指令是不允许被修改的,故该段也叫做只读段,每一个段所需的数据空间可能是一个页框,也可能是多个页框

    initialized data(.data)段:叫做初始化了的数据段,该段一般被初始化为0或1,并且很有可能称为全局变量

    uninitialized data(.bss)段:叫做未初始化的数据段,bss段也表示变量,但是没有被正常的初始化

    以上两段统称为数据(data)段

    runtime heap段:heap指的是堆,所以这一段叫做堆内存

        ->堆内存指的是随着进程的运行而不断扩大的进程的内存空间,进程刚开始运行的时候堆内存可能会很小,但是随着进程的运行,堆内存会逐渐的变大,堆内存空间是一种可以动态变化的内存空间

    user stack段:stack指的是栈,所以这一段也叫做栈内存

        ->栈内存主要用来存储本地变量,堆内存和栈内存的空间增长方向是相向而行的,堆栈内存段中间的段叫做共享库,共享库可以被多个程序同时使用,但是一个库文件只有在载入到内存中之后才能被一个进程所调用,库文件在物理内存中也会占据一定的页框,故线性内存中的这一段就是将库文件所占据的物理内存中的页框数据映射到了虚拟内存中

    由以上可知当我们的物理内存很大的时候,内核空间中的记录进程在虚拟内存中占据的空间对应物理空间的中的页框这样的对应关系会非常多,这样我们的内核在查找这种相关信息的时候也会变的非常慢,为了加速这个过程,我们的CPU中有一个专门的设备叫做MMU(Memory Management Unit->内存管理单元),每一个任何一个进程的在线性内存中的页面数据需要找到对应物理内存中的页框的时候,都由MMU来负责完成转换,MMU是内存中的一个子芯片,专门负责完成该转换过程,任何一个进程在线性内存中页面数据被访问的时候,都要和所对应的物理内存中的页框数据完成地址转换,这个就是由MMU来完成的,MMU加速该过程的原理是因为有TLB这个缓存的存在,当下一次需要查找同样的页面所对应的页框的时候,直接在缓存中查找即可,这样就可以加速这个查找的过程,当缓存空间不够的时候,TLB就会把命中次数少的缓存数据清空。

    当一个进程在CPU上运行结束,或者是本次运行时间结束的时候,就需要切换下一个进程到CPU上面去运行,进程的切换叫做进程的上下文切换(Context Switch),上下文可以理解为进程执行所需要的执行环境,所以进程的上下文切换也可以叫做进程的执行环境的切换,所以执行环境的切换就包含了将一个要退出的进程的现场保存到task structure中去,再将下一个要上来运行的进程的现场载入到CPU的寄存器当中去,这样循环往复,依次类推。

·进程管理

    所谓的进程管理包括:

    ->查看进程的进程号(PID:Process ID)

    ->查看内存所占据的内存空间的大小

        这种大小一般分为两种

        1,VSZ(Virtual Size),虚拟内存集,逻辑上的大小,加上进程运行时所需要的共享库文件的大小

        2,RSS(Resident Size),常驻内存集,位于物理内存当中,不可以进行交换(swap)

    ->查看当前进程的属主

    ->查看当前进程的父进程

    ->查看当前进程在CPU上运行了多长时间

        这种时间一般分为两种

        1,挂钟时长,指的是一个进程从启动到结束所使用的总时间

        2,该进程在CPU上实际运行所积累的时间

    等等

    CPU的计算能力是和时间流逝相关的,我们的程序是有指令和数据组成的,程序位于硬盘上,是死的,只有当它被内核在task structure中创建了一个数据结构,并且分配了CPU资源和内存资源之后而处于活动状态才有真正的执行价值,从而它的指令才会被拿来一个一个的运行,硬盘上的程序是没有意义的,只有被真正的运行起来,它才有真正的意义,既然程序是由指令和数据组成的,那么我们的指令可不可以两条并行执行,对单核CPU来说,某一时刻,CPU上面只能执行一条指令,不可能并行执行指令,就算我们的CPU是双核的也不可以同时运行一个进程的两条指令,进程中的两条不同的指令是不可以同时被运行的,必须按顺序去执行,不同的CPU核心只可以运行不同的进程而已,不过我们有一种方法可以使得同一个进程在不同的CPU核心上运行,这种方法可以在我们的进程内部实现多个执行流,一般情况下,一个进程被称为是一个执行流,但是我们可以在编写一个软件的时候,可以使用并行编程模型的方法,把一个进程在它的内部分为多个小的执行实体,每一个实体内部都有自己的指令和数据,这样就可以把一个进程分成为多个执行流,不同的执行流可以在不同的CPU上运行,这样就实现了同一个进程在不同的CPU上面运行的结果,这样一个个的执行实体是比进程还要小的单位,而且每一个单位都可以单独在CPU上面运行,所以这种情况下CPU上面运行的就不再是进程了,而是这样一个一个的小实体,这些小实体叫做线程(thread),所以只有在多线程的情况下,同一个进程才能运行在不同的CPU上面,如果一个软件在编写的时候没有使用并行编程模型的话,那么CPU核心再多也是没有意义的,这就是所谓的多线程编程方法,线程之间不会重叠,多个线程可以共享一个进程,所以当我们需要在计算机上同时干多件事情的时候,就有两种模型了:

        1,多进程模型->每当有一个用户访问的时候,就给它返回一个进程

        2,单进程多线程模型->只启动一个进程,每当有一个用户来访问的时候,就在这个进程里面给它启动一个线程,这种方式会更节省内存空间,事实上在一个进程中间维护多个线程,我们需要在多个线程之间同步平均这些资源,而且还得监控每个线程是否被加锁了

·进程的状态

    操作系统上的进程的所有状态如下图:

        技术分享

    ->Stopped:停止态,指的是该进程不会再次被内核调度了,再也不会在CPU上面运行了,只有在施加外力的情况下才有可能被再次运行

    ->Ready:就绪态,排队等待被调度到CPU上面去运行

    ->Executing:正在运行的状态,即获得了CPU

    ->Uninterruptible:可中断的睡眠态,当一个运行中的进程需要加载额外的I/O资源的时候,由于I/O设备的速度太慢,所以它一定会转入睡眠状态,此时它一定会交出CPU由其他程序运行,免的浪费自己的剩余的执行时间,之所以会睡眠,是因为它所需要的资源没有被正常获取到,或者是它没有其他更多的事情要干了,即空闲状态,可随时被唤醒,故称为可中断的睡眠态

    ->Interruptible:可中断的睡眠态,进程需要调度的外部资源还没有被满足的时候,就算被调度到CPU上面也无法继续执行,这种进程的睡眠状态称为不可中断的睡眠状态,因为就算中断了也没有意义

    以上两种状态均被称为睡眠态(sleep)

    ->Zombie:僵尸态,指的是程序正常运行了,也正常的结束了,但是内存所占据的内存空间没有被释放

·进程的父子关系

    进程之间是有父子关系的,在Linux操作系统上,所有的进程都是一个进程的子进程,这个进程叫做init(上帝进程),这个进程是有内核负责生成的,是我们当前系统上的第一个进程,此外的所有进程都是由这个进程负责生成的,负责生成其他具体任务的进程

·进程的优先级关系

    一台主机上的进程可以有多个,我们的系统会按需的将资源分配给这些进程,但是这些所有的进程当中必然有些进程的优先级或者它所要实现的功能的紧急性是高于其他进程的,所以我们必然要优先满足这些进程对于资源的需求,比如,我们的主机上有一块网卡,突然,这块网卡上面接收到了一个ping请求,而此时我们的CPU上面正在运行着其他进程,当ping请求到达的时候,意味着一个数据报文到达了,如果我们的CPU继续处理其他进程的话,当我们处理完这个进程的时候,ping信号有可能就已经消失了,我们的网卡上面是有控制芯片的,当网卡接收到外部的ping请求的时候,该芯片会向我们的CPU发起DMA请求,这个时候我们的CPU会立即终止当前进程的运行,而后开始运行内核进程,由内核控制着CPU去把这个ping信号接收进来,并保存在内存当中去,当这个请求被保存下来之后,CPU也未必会立即响应这个请求,而是要和之前运行在CPU上面的进程做优先级比较,如果该信号没有之前进程的运行优先级高的华话,CPU会立即将之前的进程放到CPU上面运行,然后再去响应该ping请求,无论怎么样,当有请求的时候,我们必须优先处理,再比如,当我们的某个进程正在CPU上面运行的时候,这个时候系统突然断电了,但是我们的计算机有外挂的UPS电源,这个时候无论CPU在运行着什么进程都必须立即终止,而优先执行,通知系统上的所有用户计算机即将断电的进程,由以上可知,我们进程与进程之间是有优先级关系的,但是我们内存中等待运行的进程是有所谓的队列的,那么进程在队列中是如何进行排队的呢?Linux系统中的优先级分为0-139一共140个优先级的,数字越小,优先级越高,在这么多的优先级当中,100-139号优先级是用户可以控制的,而0-99号优先级是由内核来进行控制的,一般来讲,我们应该先满足优先级高的那个进程先运行,但是我们如何从大量的待运行的进程挑选出优先级高的那个进程先运行呢?从Linux2.6内核开始引入了一种独特的机制来解决这个问题,这种机制类似于O(1)标准,无论进城队列有多长,从中挑选一个进程的时间是不变的

·O标准

    在计算机的程序设计上,衡量一个程序或者是一个算法面对不同长度队列的时候的性能如何有一种衡量标准,这种衡量标准就称为O标准,O标准指的是,我们从队列中挑选一个元素的时间曲线,随着队列长度的增大呈现为括号内部的函数图像的形式

    ->O(1):无论队列多长,从中挑选一个元素的时间是不变的,性能最好

    ->O(n):从队列中挑选一个元素的时间正比于队列长度,并且是线性增长的,故时间的变化可预测,也可接受

    ->O(logn)

    ->O(n^2)

    ->O(2^n)


    一个进程的优先级高了一般会有两种特性:

    1,它会获得更多的CPU运行时间

    2,它会更有限获得CPU的运行机会

    用户可控制的优先级别为100-139号优先级,我们的系统为每一个进程都分配了一个从-20--+19的nice值,可用于调整优先级,并且分别对应于100-139号优先级,我们可以通过调整进程的nice值来调整的进程的优先级,默认情况下每一个进程的nice值都是0,也就是说每一个进程的优先级都是一样的,普通用户的仅能够将进程的nice值调高,即只可以使得进程的优先级降低,而管理员则不受此限制


    我们的内核为了追踪系统上的每一而用户,会给每一个用户一个UID,同样内核为了追踪每一个系统上的进程也是依靠数字来进行追踪的,故每一个进程都会有一个进程号(PID->Process ID),每一个进程都会有父进程,除了init进程,当前系统上的每一个进程的相关属性信息都保存在/proc目录下面,所有命名为数字的目录都为进程的PID,每一个PID都是唯一的,就算进程退出了,其他进程也不会占用之前的那个PID,init进程的PID永远为1,因为它是第一个进程

     技术分享  

    /proc目录里面其实是没有任何文件的,该目录下面的所有信息都是当前内核信息的映射,我们访问到的该目录下面的信息其实都是内核的信息,进程目录下的文件其实也都不是文件,而是内核中的某个参数,而内核参数的名字就是文件的名字,内核参数在这里只是被映射成了文件,所以我们说/proc目录是一个伪文件系统,它里面的信息压根就不是文件,而是被展现成了文件的形式而已

    技术分享    我们进城目录中的内核参数如上图:

        ->cmdline这个参数表示的是发起该进程的命令是什么

          技术分享

        ->stat这个参数表示的是该进程的状态信息

            技术分享        ->mem这个参数表示的是该进程使用的内存信息

            技术分享

        ->cpuset这个参数指的是可以运行的CPU的编号

            技术分享

·查看进程属性的命令

    1,ps(process state)命令

        进程状态,用于查看进程的相关信息的一个专用命令,该命令有多种使用风格

        我们的进程还可以被分为两类:

        1,与终端有关的进程,在终端中启动的进程

        2,与终端无关的进程,系统启动时自动启动的进程

        我们的unix操作系统有两大分支:

        ->BSD风格,命令的每一个选项都不用加-

            常见选项:

            a选项->显示所有和终端有关的进程,但是也不一定都和终端有关

                技术分享            u选项->可以显示进程是有哪个用户启动的

                技术分享

            x选项->显示所有和终端无关的进程,但也不一定都是和终端无关的进程

                技术分享

                上图中TTY字段下的?表示的就是和终端无关的进程

            我们一般将ax选项结合起来使用:

            技术分享

        STAT字段表示进程的状态信息:

            D表示不可中断的睡眠态

            R表示运行或就绪态

            S表示可中断的睡眠态

            T表示停止态

            Z表示僵尸态

            <是一种BSD风格,表示高优先级的进程

            N表示低优先级的进程

            +表示前台进程组(从命令行启动的和终端相关的进程)中的进程

            l表示多线程进程

            s表示会话进程(比如ssh)的领导者进程,无论杀死哪一个领导者进程,它的所有子进程都会全部退出

        TIME字段表示的是进程真正占据CPU的总时长

        COMMAND字段表示的是启动进程的命令,如果COMMAND加了中括号,表示这是一个内核线程,凡是加了中括号的进程就表示一个内核线程

        START字段表示启动该进程的时间

        ->SysV(Syetem V)风格,命令的每一个选项都要加-来引导

            -e选项表示显示所有进程

            技术分享

            -F选项表示显示更多的字段

            技术分享

      

            -l选项表示长格式

            技术分享

        

        PRI(priority)表示优先级

        NI表示nice值

        SZ表示进程的大小

            o选项表示可以手动指定显示哪些字段

            格式:ps o 字段...

            技术分享

        ps命令默认只显示前台进程,所以o选项可以和ax选项配合使用

        技术分享

        ps命令还可以配合grep命令来使用

        技术分享

    2,pstree命令

        显示进程树的命令

        技术分享

    3,pgrep命令

        以grep命令的风格来指定显示某些进程,但是只显示PID

        技术分享

        -u(euid)选项,表示显示属于某个用户的进程

            euid表示的是有效的uid,表示的是该进程真正是以哪个用户的身份运行的

            技术分享

        -U(uid)选项,表示的是显示该进程的发起者

            技术分享

        类似于我们的SUID所描述的功能

        3,pidof命令

            根据进程的名字找出进程的id号

            技术分享

        4,top命令

            实时监控当前系统上所有进程的命令,类似于我们windows上面的任务管理器

            技术分享

        上图中的详细字段解释:

        第一行从左至右依次是

            ->当前系统的时间

            ->up后面的时间表示的是运行时长

            ->登录的用户个数

            ->load average表示CPU的平均负载

                后面的三个字段表示的进程队列的平均长度,依次表示过去1分钟,5分钟,15分钟CPU的平均队列长度,队列长度越小,表示CPU的负载越低

        第二行从左至右依次是

            ->Tasks表示所有进程的相关信息

            ->进程总数

            ->处于运行状态的进程数

            ->处于睡眠状态的进程总数

            ->处于停止状态的进程数

            ->处于僵尸态的进程数

        第三行从左至右依次是

            ->Cpu(s)表示的是CPU的平均负载,如果计算机上面有多颗CPU的话,按1键可以展开显示每一个CPU的负载

            技术分享

            ->us(user space)表示的是用户空间的用户进程占据的CPU的百分比

            ->sy(system)表示内核进程所占据的CPU的百分比

            ->ni(nice)表示nice值

            ->id表示CPU的空闲百分比

            ->wa(wait)表示等待I/O完成的进程所占据的CPU的百分比

            ->hi(hard interrupt)表示硬件中断所占据的CPU的百分比

            ->si(soft interrupt)表示软中断所占据的CPU的百分比

            ->st(stolen)表示的是被偷走的CPU所占据的百分比,在虚拟化场景中,CPU有可能被偷走

        第四行表示的内存的使用情况,从左至右依次是

            ->内存总空间大小

            ->内存已用空间大小

            ->内存空闲空间大小

            ->内存缓冲区空间大小

        第五行表示的是交换空间的使用情况,从左至右依次是

            ->swap总空间大小

            ->swap已用空间大小

            ->swap空闲空间大小

            ->swap缓存区空间大小

            缓冲区(buffers)和缓存区(cached)都存在于物理内存当中

        接下来的字段从左至右依次是:

            ->PID:进程号

            ->USER:进程启动者

            ->PR(priority):进程的优先级

            ->NI:进程的nice值

            ->VIRT:表示虚拟内存集,其实就是VSZ

            ->RES(resident size):表示常驻内存集

            ->SHR(shared):表示的是共享内存的大小

            ->S:表示当前进程的状态

                S表示睡眠态

                R表示运行态

            ->%CPU:表示进程所占的CPU百分比

            ->%MEM:表示进程所占的内存百分比

            ->TIME+:表示进程真正占据CPU的总时长

            ->COMMAND:表示进程名

        top命令还有一些交互式的子命令:

            top命令默认是按照%CPU来对显示的进程进行排序的,哪个进程的%CPU高就显示在前面

        但是我们可以使用一些交互式的子命令来改变这种排序方法

        ->M键,可以使得按照%MEM来进行排序

            技术分享

       ->P键,可以使得按照%CPU来进行排序

            技术分享         ->T键,可以使得按照TIME+来进行排序

            技术分享

        ->l键,表示是否显示load average和启动时间

        技术分享 

        ->t键,表示是否显示进程和CPU状态的相关信息

        技术分享
        ->m键,表示是否显示内存和swap相关信息

        技术分享

        ->c键,表示是否显示完整的COMMAND信息

        技术分享

        ->q键,表示退出top

        ->k键,表示杀死某个进程

        技术分享

    -d选项,表示可以指定刷新时长

            可以指定top命令的信息隔多长时间显示一次

            使用格式:top -d #(秒)

       -b选项,表示以批处理模式显示top命令的相关信息

        技术分享

        -n选项,表示在批处理模式下只显示#批相关信息,显示完成后退出top命令

        

        6,kill命令

            杀死一个进程的命令

            在Linux系统上进程与进程之间,是意识不到其他进程的存在的,进程之间只有在互相通信的情况下才可以意识到对方的存在

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

            1,共享内存法

            某一个进程往内存中写入的数据,让另一个进程去读取,这样就可以实现通信

            2,信号(signal)

                kill -l命令可以显示当前系统上所有可用的信号

                技术分享

            但是有我们只需要了解几个重要的信号:

            ->1号信号SIGHUP

                该信号可以使得无需重启一个进程,就可以重新读取其配置文件,并让新的配置信息生效

            ->2号信号SIGINT

                INT(interrupt:中断,终止的意思)

                比如说我们的Ctrl+c就是像一个前台进程发送了一个终止信号,用于终止一个前台进程

            ->9号信号SIGKILL

                表示杀死一个进程,强行的暴力终止进程

            ->15号信号SIGTERM

                表示非暴力的终止一个进程的信号,kill命令默认发出的信号就是15号信号

        使用kill命令指定一个信号的方法:

            1,直接使用信号的号码

                格式:kill -#

            2,使用信号名称

                格式:kill -SIGKILL等等

                还可以使用信号名称的简写:

                kill -KILL

                kill -HUP

                kill -INT

                kill -TERM

            3,使用Semaphore(旗语)的方法

        kill命令的主要功能是用来终止一个进程,但是kill命令通常被用来向进程发送信号

        使用kill命令终止进程的格式:

        ->kill PID表示一次终止一个进程

            技术分享

       ->killall命令可以跟上进程名

            表示终止和该进程名有关的所有进程

            技术分享

            killall命令还可以指定信号,这一点和kill命令是一样的

        ->kill %JOBID(作业号)命令可以终止后台作业

     前台作业:

            占据了命令提示符的命令执行的时候叫做前台作业

            技术分享

        后台作业:

            命令在启动的时候就释放命令提示符,后续的操作在后台执行的作业叫做后台作业

            使得作业在后台运行的方法是在命令之后加上&,这种方法表示让命令继续在后台执行

        将正在前台作业的进程打入后台的方法是使用Ctrl+z,表示将正在前台作业的进程打入后台,这种将前台正在作业的进程打入后台的方法是默认给前台正在作业的进程发送了一个终止运行的信号,这个时候被打入后台的进程就默认处于stop状态

        技术分享

        中括号内的数字就表示作业号

        不过我们的bg(back ground)命令可以使得stop的后台进程继续在后台运行,使用格式:bg JOBID(可省,如果省略,表示默认执行带+号的作业)

        技术分享

        技术分享

    jobs命令可以查看后台的所有作业,每一个作业都会有一个作业号(JOBID),作业号不同于进程号,作业号上面有+号的,表示bg命令将默认第一个操作的作业,作业号上面有-号的,表示bg命令默认将第二个操作的作业,而不用特意指定bg命令的作业号,依次类推:

        技术分享

        fg(fore ground)命令表示将后台作业再次调回前台:

        JOBID同样可以省略,和bg命令是一样的

        技术分享

        但是当我们需要使用kill来终止一个后台作业的时候,需要在JOBID前面加上%

        技术分享

        7,free命令

            查看系统内存相关信息

        8,pkill命令

            类似于pgrep命令,杀死系统中的特殊进程

        9,vmstat(virtual memory)命令

            系统状态的查看命令

            技术分享

            该命令的详细字段解释:

            ->procs:表示进程的运行队列长度,b表示阻塞队列长度

            ->memory:swpd表示交换空间的大小

                     free表示空闲内存空间的大小

                     buff表示缓冲区空间的大小

                     cache表示缓存区空间大小

            该字段表示我们的内存统计数据

            ->swap:可以显示swap的动态信息

                    si(swap in)

                    so(swap out)

            ->io:表示I/O的相关信息

                bi(block in),表示有多少磁盘block载入内存中

                bo(block out),表示有多少block放回到磁盘中去

            ->system:

                in(interrupt),表示进程中断的个数

                cs(contact switch),表示进程上下文切换的次数

            ->cpu:

                us:表示用户空间占据CPU的百分比

                sy:表示内核空间占据CPU的百分比

                id:表示空闲进程

                wa:表示等待I/O操作结束的进程占据CPU的百分比

                st:表示被偷走的CPU占据CPU的百分比

        vmstat #:表示每隔#秒钟刷新一次命令的相关信息

            技术分享

        vmstat # #:表示每隔#秒钟并且总共只刷新#次命令的相关信息,然后退出命令

        技术分享

·如何调整进程的nice值,即优先级

    主要方法有两种:

    1,调整已经启动的进程的nice值

        使用renice命令

        格式:renice NI PID

        技术分享

    2,在进程启动的时候就调整它的nice值

        使用nice命令

        格式:nice -n NI COMMAND(启动进程的命令)

        技术分享

·uptime命令

    显示的内容和top命令所显示的第一行内容是一样的

    技术分享

·/proc/meminfo

    该文件里面保存着当前系统的内存相关信息

    技术分享

    我们还可以查看每一个进程所占据的内存的相关信息:

        在/proc目录下的各个进程目录中的mem文件里面保存着

        maps文件里面保存着当前进程所占据的内存地址信息:

        技术分享

            

                

                    

            

            

            

            

本文出自 “菜鸟的技术文档” 博客,请务必保留此出处http://zhubo.blog.51cto.com/11395641/1858929

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

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

Linux性能及调优指南(翻译)之Linux进程管理

linux进程管理

Linux进程管理专题

linux进程管理

Linux 进程管理 进程优先级管理