Linux进程管理

一、程序与进程      

    1、程序

        程序是为了达到特定的目的,可以被计算机运行并且由命令代码组成的语句序列。

        程序由指令和数据组成。

        指令:用于调度CPU工作,使CPU可以处理所需要的数据。

    2、进程

        进程是指运行中的程序。

    3、程序的工作模式

        所有对于硬件的操作用户都无权访问,如果用户运行的程序需要访问硬件时,需要进行系统调用,通过内核来完成对硬件的操作,此时程序将由用户模式转入内核模式。比如:我们想在目录中新建一个文件夹,因为要对磁盘进行写操作,当使用mkdir命令时,就会进行系统调用由内核来完成此操作后再将结果返回给用户。                   CPU在其内部的不同区域完成不同的功能:ring0分配给内核(kernel),ring3分配给用户程序(user program)。

二、Linux的多用户,多任务环境

    1、内存的分配

        Linux对内存采用分段、分页的机制。    

        物理内存每4k划分成一个页框;页框为物理内存的最小单位。

        应用程序运行在自己的地址空间内,这个地址空间称为线性地址空间,所有数据在线性地址空间内部表现为页面的形式存放,而不是分页的数据无法交换至swap空间。

        进程访问数据是从线性地址访问,内核将线性地址转换成物理地址,使得进程得以访问到数据。

        线性地址与物理地址的对应关系存放在一张表中,这引表在MMU(Memory Management Unit)中进行维护。

        内核借助MMU来使得各个进程使用内核时好像是独立的状态;MMU完成线性地址到物理地址的转换。

        内核精心编造了一个数据结构,假如内存如果有4G的话,1G分配给内核使用,3G分配给进程使用;这个数据结构使用得每个进程都认为自己独占3G内存。

     2、进程调度

        调度就是挑选进程到CPU中运行的过程。

        进程调度采用的O(1)的算法复杂度,即时间恒定的算法。

        CFS:完全公平调度器

    3、进程的分类

        CPU-Bound(CPU密集型):对于CPU占用率高的进程。

        I/O-Bound(I/O密集型):等待I/O时间长的进程

    4、进程优先级

        CPU挑选进程是根据进程的优先级进行的,进程优先级的取值范围为0-139。

        实时优先级:0-99,数字越大,优先级越高;

        静态优先级:100-139,数字越小,优先级越高。

        用户可以通过调整nice值来改变进程的优先级。

            nice值:-20-19 调整静态优先级

            进程启动时,默认nice值为0,优先级对应为120。

        动态优先级:由内核维护,动态调整。

        Linux使用抢占式多任务:当时钟信号到达时,高优先级进程可以抢占CPU。

    5、进程状态

        运行态:runnnig

        睡眠态:sleeping

            可中断睡眠:interruptable

            不可中断睡眠:uninterruptable,等待外部条件满足之前无法继续运行。       

        停止态:stopped,不会再被内核调度并运行。

        僵死态:zombie,父进程先于子进程结束了,子进程再也不能被停掉的进程。

    6、子进程  

        进程运行是单线运行的,进程中的指令必须顺序执行。             

        子进程:父进程有无法完成的任务时,启用子进程来执行,此时父进程进入睡眠,子进程执行完成后,返回父进程继续执行。

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

    7、进程间通信(IPC:Inter Process Communication)

        同一主机:

            singnal:信号。

            shm:共享内存。

            semerphor:旗语。

        不同主机:

            rpc:remote procedure calling,远程过程调用。

            socket:IP:port,套接字。

    8、CPU虚拟化

        就是将CPU切割为时间片(timeslice)。

        保存现场:将未执行完成进程状态保存在状态表中。

        恢复现场:将状态表中未执行完的进程调出继续执行。

    9、线程

        线程是比进程更小的可以被单独调度的单位。

        线程将进程的任务指令拆分,分配到不同的CPU上同时运行。

        不过Linux中的进程都是轻量级进程,已经相当于线程的级别了。

三、Linux进程管理工具

    1、查看进程树:pstree

1.1.png

    2、显示进程状态:ps

        ps命令的选项参数有很多,下面只介绍常用的选项。

        因为开源的原因,ps的也存在众多的版本,CentOS6的ps命令支持两种风格:SysV和BSD

            SysV:一般带“-”

            BSD:不带“-”

        选项:

            a:与终端相关的进程;

            x:与终端无关的进程;

            u:显示用户。

        组合选项:aux

1.png

        上图中各字段的含义如下:

            USER:进程的发起者;

            PID:进程的PID;

            %CPU:CPU的占用率;

            %MEM:内存的占用率;

            VSZ:Virtual memory size,虚拟内存空间大小(线性地址空间大小);

            RSS:常驻内存集;不能被交换到swap空间中的所有数据;

            TTY:终端;

            STAT:进程状态, 包括:

                R:running;

                S:可中断眨睡眠;

                D:不可中断睡眠;

                T:Stopped;

                Z:Zombie;

                s:session leader;

                t:前台进程;

                l:多线程进程;

                N:低优先级进程;

                L:高优先级进程。

            COMMAND:包含在方括号中的进程表示为内核线程。

        组合选项: -ef

              -e:显示所有进程;

              -f:显示完整格式的信息。

2.png

        组合选项:-eFH

              -F:显示额外信息;

              -H:显示进程的层次结构。

3.png

            -o:自定义要显示的信息。

4.png

                ni:nice值;

                pri:优先级;

                psr:运行的CPU。

    3、显示指定进程的进程号:pgrep

        常用选项:

              -u USERNAME:仅显示由指定用户启动的进程;

              -U UID:仅显示由指定用户启动的进程;

              -G GID:仅显示由指定组启动的进程;

              -t terminal:仅显示指定终端相关的进程;

              -l:同时显示进程号和程序名。

5.png6.png7.png8.png

    4、显示指定命令所启动的进程的ID:pidof

9.png

    5、实时监控进程:top

        直接输入top命令,出现以下界面:

10.png

        可以在上面的界面中直接使用命令来对显示内容进行控制:

            M:根据内存百分比进行降序排序,对应的列为%MEM;

            P:根据CPU百分比进行降序排序,对应的列为%CPU;

            T:根据累积占用的CPU时间降序排序,对应的列为TIME+;

            l:显示或不显示负载信息,即上图中第一行的内容,如下图所示:

12.png

            这一行的内容表示:

                10:32:08:当前系统时间;

                up 18:42:服务器连续运行的时长为18小时42分钟;

                4 users:当前登录系统的用户数;

                load average:过去1分钟、5分钟、15分钟的平均负载

            t:显示或不显示进程及CPU相关的信息,如下图所示:

13.png

                上图为不显示进程及CPU信息的结果。              

            1:数字,分别显示各CPU的相关信息;

14.png

            使用数字1可以查看不同的CPU的信息,下面说明各字段具体的含义:                     

                us:user space,用户运行程序时间百分比;

                sy:system,用于运行内核所占用CPU的百分比;

                ni:nice,用户进程空间内改变过优先级的进程占用CPU百分比;

                id:idle,空闲CPU百分比;

                wa:wait io,等待IO花费的时间;

                hi:hardware interrupt,硬中断占用CPU的百分比;

                si:software interrupt,软中断占用CPU的百分比;

                st:stolen,偷走的时间百分比。

            m:显示或不显示物理内存和交换内存信息,如下图所示:

1.1.png

            各字段含义如下:

                Mem:物理内存;

                Swap:交换分区; 

                buffers:缓冲区,用于减少进程之间的等待时间;

                cache:CPU与内存之间的高速缓存,用于减少CPU的等时间。                           

            k:终止指定进程;

1.png

2.png3.png           s:修改刷新时间间隔;

1.1.png

            q:退出。

        常用选项:

            -d #:指定刷新时间间隔;   

            -b:以批次的方式显示top刷新;

            -n #:显示的批次;

            -p PID:监控指定进程。

1.1.png

            查看指定进程:

1.1.png1.png

    6、显示虚拟内存统计信息:vmstat

1.1.png

        各字段含义如下:       

            procs:

                r:运行队列的长度;

                b:被阻塞(等待IO完成)队列的长度。

            memory:

                swpd:从物理内存交换至swap中的数据量;

                free:空闲物理内存;

                buffer:缓冲,与写相关,加速写操作;

                cache:缓存,与读相关,加速读操作。

            swap:

                si:swap in,数据进入swap中的数据速率,单位kb/s;

                so:swap out,数据离开swap中的数据速率。

            io:

                bi:block in,从块设备读入的数据速率,单位kb/s;

                bo:block out,保存至块设备的数据速率。

            system:

                in:interrupt,中断速率;

                cs:context switch,进程切换速率。

            CPU:

                各字段含义与top中所表示的含义相同,此处不再赘述。

        常用选项:

            -s:显示内存统计数据。

1.1.png

    7、系统资源统计工具:dstat

        命令选项:       

            -c:查看cpu的统计数据

            -d:显示磁盘的统计数据;

            -D DISK:只显示指定disk的统计数据;

            -g:显示page的统计数据;

            -i:显示中断的统计数据;

            -m:显示内存的统计数据;

            -l:显示系统负载的统计数据;

            -n:显示网络接口相关统计数据;

            -N INTERFACE:显示指定网络接口的统计数据;

            -s:显示交换内存统计数据;

            –ipc:显示ipc消息队列、信息和共享内存的使用状况;

            -y:显示系统状态数据;

            -cdngy:相当于不带参数的dstat,也相当于-a

            -t:显示时间;

        网络连接状态统计:

            –tcp:显示tcp的个数及状态;

            –udp:显示udp的个数及状态;

            –unix:本地通信时unix文件的个数;

            –raw:raw sockets;

            -f:以完整格式显示所有信息

            -v:类似于vmstat命令;

1.1.png
        命令用法比较简单,就不做过多的演示了。

四、调整nice值

    只有管理员可以使用小于0的nice值,普通用户调整nice值时只能增加,即只能把优先级调低。

    1、直接启动一个进程,并指定其nice值:

1.1.png1.png

    2、调整已运行的进程nice值

1.1.png

1.png

五、进程间通信

    1、显示常用信号:kill -l 

1.1.png

    2、查看各个信号的作用:man 7 signal

    3、信号的调用方式

        每个信号都可以使用三种方式之一在kill中进行调用:

            1)数字代称:1,2,9,15;

            2)信号完整名称:SIGHIP,SIGINT,SIGKILL,SIGTERM;

            3)信号简称:HUP,INT,KILL,TERM;

        常用信号的含义:

            1) SIGHUP:让程序重读配置文件,而无需重启程序;

            2) SIGINT:interrupt,相当于ctrl+c,打断正在运行中的前台程序;

            9) SIGKILL:强制终止进程;

            15) SIGTERM:正常终止进程,默认选项。

    4、信号调用的格式       

        1、kill [-SIGNAL] PID

1.1.png

        终止所有httpd的进程。

    2、killall [-SIGNAL] COMMAND

1.png

五、Linux作业控制

    前台作业:通过终端启动,并在终止之前一直占据着终端;

    后台作业:作业启动之后即运行于后台,释放前台;

    交互式模式:手动启动的非守护进程类的程序,一般都运行于前台。

    将作业运行于后台:

        1、将运行中的作业送往后台

            Ctrl+z:将作业送往后台,并处于停止状态。

        2、将尚未启动的作业直接在后台运行

            COMMAND &

            这种手动方式控制的作业与终端相关,如果正在运行作业的终端被退出了,作业会被终止;如果想要在终端退出后作业依然在后台运行,则需要使用下面的命令:

            nohup COMMAND &

    查看当前正在运行的作业:

1.1.png

    三个字段从左至右分别代表:作业号、作业状态、作业命令。

    作业控制命令:

        fg [[%]jobnum]]:将指定的作业调回前台;

        bg [[%]jobnum]]:让送往后台的作业在后台继续运行;

        kill %jobnum:终止指定的作业。

原创文章,作者:petmaster,如若转载,请注明出处:http://www.178linux.com/2606

评论列表(1条)

  • stanley
    stanley 2015-05-18 17:34

    字体,内容,样式,主次,样样具全,不得不赞