进程管理

linux进程管理

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

    Pcrocess:运行中的程序的一个副本,是被载入内存中的一个指令集和

        PID:进程ID,用来标记各个进程

        task struct:进程的元数据空间,用来存储进程数据信息和数据结构的格式

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

        MMU:负责转换线性地址和物理地址

       总结:内核为每一个进程保存了一个task struct,记录了线性地址空间和物理地址空间及PID等信息,当一个进程想要访问其线性地址空间中的数据时,内核会每次将其线性地址空间转换为物理地址空间取得数据来进行操作的,该过程有一个专门的硬件潘成就是MMU,memory managerment unit。

    进程的创建:当系统启动后,先去运行内核代码,等内核掌管一切后,创建第一个进程,我们称为INIT进程,内核空间和用户控件创建出来了,后续内核空间所有管理工作都有INIT负责,INIT负责所有进程,进程都由其父进程创建,内核中有一个函数fork()用于创建子进程。

    进程的优先级:

        系统优先级:数字越小,优先级越高

            0-139(centos4,5)

                各有140个运行队列和过期队列

            0-98,99(centos6)

        实时优先级:rtprio 99-0,值越大优先级越过

    

    进程优先级调整:
        静态优先级: 100-139
        进程默认启动时的nice值为0,优先级为120
        只有根用户才能降低nice值(提高优先性)

        nice值:-20,19对应系统优先级100-139或99

        命令:

            nice [option] [Command [arg]…]  让进程已哪个优先级运行(普通用户调整优先级,只能把ni调大)

                    nice -n -10 ping 127.0.0.1

            renice [-n] priority pid…  更改正在运行进程的优先级(已经运行的程序默认优先级是0)

                    renice -n -10 5168

            查看 ps axo pid,comm,ni

root@cenots6.8  ~ # ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   3108   3104  0  80   0 - 27120 wait   pts/1    00:00:00 bash
4 R     0   3512   3108  0  80   0 - 27033 -      pts/1    00:00:00 ps

        根据ps -l查询到的结果,可以看到PID进程编号,PPID父进程编号,PRI即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高,NI就是前面提到的nice值,其表示进程可被执行的优先级的修正数值。如前面所说,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,因此需要注意的:进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。

    进程相关概念:内核完成资源分配要占用一段空间,剩余的分配给进程使用,为了实现高效分配,把剩余内存切割成固定大小的片段,然后分片段给进程,大小为4K,每个片段就叫做page frame(页框,存储页面数据),分配内存时,发现那个页框空间就分配哪个给进程,,分配的页框可以是连续的,也可以是不连续的,将这些页框分配给进程后,加一个中间层,将这些页框伪装成连续的,每一个进程都是一个虚拟的内存,而不是真正的内存,而每个进程启动时,他认为目前系统运行的只有内核和自己的程序,所有内存空间他都可用,其他进程也认为所有的内存空间他们都可以用,所以他们们以为所有可用的空间称为线性地址空间,而真正占据的才是分配物理空间叫做物理空间。

    进程类型:

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

        前台进程:根终端无关,通过终端启动的进程

            注意:可以把前台进程送往后来运行,以守护模式运行

    进程状态:

        运行态:running

        就绪态:ready

        睡眠态:

            可中断:interruptable

            不可中断:uninterruptable

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

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

        端口:

                0-1023:永久地分配给固定的应用使用,80/http, 21/ftp, 25/smtp, 110/pop3, 143/imap4;仅root有权限使用,特权端口;

                 1024-41951:注册端口,但不严格,3306/mysql, 11211/memcached,

                 41952+:客户端程序使用的随机端口,动态端口,或称为私有端口;

                 /proc/sys/net/ipv4/ip_local_port_range

Linux系统状态的查看及管理工具:

    常用命令:pstree、ps、pidof、pgrep、top、htop、glance、pmap、vmstat、dstat、kill、pkill、job、bg、fg、nohup

    pstree:显示进程树

    pidof processName:根据确切的进程名称查询进程

            pidof passwd

            4121

    ps:process state用于显示命令执行前所有进程的状态

        选项:

            a:选项包括所有终端的进程

            x:选项包括不连接终端的进程

            u:选项显示进程所有者的信息

            f:选项显示进程的父进程

            o:属性…选项显示定制的信息,如:pid、comm、%cpu、%mem、state、tty、euser、ruser

                ps axo pid,comm,%cpu,%mem,state,tty,euser,ruser

                ps aux | grep sleep

            -e:显示所有进程

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

root@cenots6.8  ~ # ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19344  1544 ?        Ss   08:58   0:02 /sbin/init
root          2  0.0  0.0      0     0 ?        S    08:58   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    08:58   0:00 [migration/0]
USER:用户      PID:进程   %CPU:累计使用CPU的时间    %MEM:内存空间占用比率   VSZ:虚拟内存大小,线性内存  RSS:常驻内存级(不能放在swap交换内存上)

            STAT:进程状态

                R:running

                S:interuptable sleeping

                D:uninterruptable sleeping

                T:stopped

                Z:zommbie

                +:前台进程

                I:多线程进程

                N:低优先级进程

                <:高优先级进程 

                s:session leader,会话(子进程)发起者 

    pgrep:按预定的模式查找进程

        pgrep [options] pattern

            -u uid:生效者 有效的是谁

                pgrep -u root

                输出结果是PID

            -U uid:真正发起运行命令者

                例如 wang用户发起passwd命令,发起者是wang,生效者是root 

            -t Terminal:与指定的终端相关的进程

                pgrep -t pts/0 -l

                3014 bash

                4077 sleep

            -l:显示进程名字

                pgrep -l sleep

                3960 sleep

            -a:显示完整格式的进程名

            -P:显示指定的子进程

        uptime:

            root@cenots6.8  ~ # uptime
            16:52:15 up  7:53,  2 users,  load average: 0.01, 0.02, 0.05
            显示当前时间    系统已启动的时间    当前登录的用户    系统平均负载(1、5、10钟的平均负载,一般不会超过1)

        系统平均负载:指在特定时间间隔内运行队列中的平均进程数

        如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。 如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

   

    top:任务查看器,显示linux系统的进程信息,从上往下排序

top - 17:14:54 up  8:16,  2 users,  load average: 0.03, 0.07, 0.05
Tasks: 166 total,   1 running, 165 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.0%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004136k total,   670124k used,   334012k free,    61084k buffers
Swap:  2097148k total,        0k used,  2097148k free,   344384k cached

us:用户空间    sy:内核空间    ni:调整nice时间    id:空闲    wa:等待IO时间    hi:硬中断    si:软中断    st:虚拟机偷走时间

        内置命令:

            P:以占据的CPU百分比,%CPU

            M:占据内存百分比,%MEM

            T:累计占据CPU的时长,TIME+

        首部显示信息:

            uptime信息:l命令

            tasks及cpu信息,t命令

            cpu分别显示:1数字

            memory信息:m命令

        退出命令:q

        修改刷新时间间隔:s

        终止指定进程:k

        保存文件:W

        选项:

            -d #:指定刷新时间间隔,默认3s

            -b:以批次方式显示 top -b

            -n #:显示多少批次

    htop命令:需要从Fedora-EPEL源安装

        选项:

            -d #:指定延迟时间

            -u UserName:仅显示指定用户的进程

            -s COLUME:以指定字段进程排序

        子命令:

            s:跟踪选定进程的系统调用

            l:显示选定进程打开的文件列表

            a:将选定的进程绑定至指定的CPU核心

            t:显示进程数

    

    vmstat命令:虚拟内存信息

        vmstat 2 4 :2s刷新一次 刷新4次

root@cenots6.8  ~ # vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 435712  23792 187208    0    0   227     6  110  125  1  3 96  0  0	

        procs:

            r:等待运行的进程个数,和核心数有关

            b:处于不可中断睡眠态的过程个数(被阻塞的队列长度)   

        memory:

            swpd:交换内存的使用总量

            free:空闲物理内存总量

            buffer:用于buffer的内存总量

            cache:用于cache的内存总量

        swap:

            si:从磁盘交换进内存的数据速率

            so:从内存交换值磁盘的数据速率

        io:

            bi:从块设备读入数据到系统的速率(kb/s)

            bo:保存数据至块设备的速率

        system:

            in:interrupts,中断速率,包括时钟

            cs:context switch ,进程切换速率

        cpu:

            us:Time spent running non-kernel code

            sy: Time spent running kernel code

            id: Time spent idle. Linux 2.5.41前,包括IO-wait time.

            wa: Time spent waiting for IO. 2.5.41前,包括in idle.

            st: Time stolen from a virtual machine. 2.6.11前, unknown

        

        pmap命令:进程对应的内存映射

            pmap [options] pid […]

                -x:显示详细格式的信息

        

        glances命令:需要依赖epel源进行安装

                     cenots6.8 (CentOS 6.8 64bit / Linux 2.6.32-642.el6.x86_64)                     Uptime: 0:20:09

CPU       1.0%             	 Load   4核      Mem    36.4%  active:    241M   Swap    0.0%
user:     0.3%  nice:     0.0%   1 min:   0.01   total:  981M  inactive:  162M   total: 2.00G
system:   0.6%  iowait:   0.0%   5 min:   0.10   used:   357M  buffers:  24.2M   used:      0
idle:    99.0%  irq:      0.0%   15 min:  0.20   free:   623M  cached:    185M   free:  2.00G

网络       Rx/s    Tx/s   Tasks  200 (298 thr),  1 run, 199 slp,  0 oth  自动排序
eth1       320b     9Kb
lo           0b      0b    VIRT   RES  CPU%  MEM%   PID USER        NI S    TIME+ NAME
pan0         0b      0b    206M   12M   4.1   1.2  2884 root         0 R  0:00.51 /usr/bin/python /usr/bin/glances
                            19M    2M   0.0   0.2     1 root         0 S  0:02.19 /sbin/init
Disk I/O   In/s   Out/s       0     0   0.0   0.0     2 root         0 S  0:00.20 kthreadd
sda1          0       0       0     0   0.0   0.0     3 root         0 S  0:00.20 migration/0
sda2          0       0       0     0   0.0   0.0     4 root         0 S  0:00.10 ksoftirqd/0
sda3          0       0       0     0   0.0   0.0     5 root         0 S  0:00.00 stopper/0
sdd1          0       0       0     0   0.0   0.0     6 root         0 S  0:00.00 watchdog/0
                              0     0   0.0   0.0     7 root         0 S  0:00.36 migration/1
Mount      Used   Total       0     0   0.0   0.0     8 root         0 S  0:00.00 stopper/1
/         4.29G    116G       0     0   0.0   0.0     9 root         0 S  0:00.00 ksoftirqd/1
/boot     33.4M    190M       0     0   0.0   0.0    10 root

          a  自动排序                         l  Show/hide logs

          c  根据CPU使用率排序                   b  Bytes or bits for network I/O

          m  根据内存占用比排序                  w  删除警告日志

          p  根据进程名字排序                   x  删除警告和严重级别的日

          i  Sort processes by I/O rate             1  全局CPU或者每个CPU的状态

          d  显示/隐藏硬盘I/O状态                 h  Show/hide this help screen

          f  显示/隐藏文件系统状态                t  View network I/O as combination

          n  显示/隐藏network状态                 u  View cumulative network I/O

          s  显示/隐藏sensors状态                 q  Quit (Esc and Ctrl-C also work)

          y  显示/隐藏hddtemp状态

        常用选项:

            -b: 以Byte为单位显示网卡数据速率

            -d: 关闭磁盘I/O模块

            -f /path/to/somefile: 设定输入文件位置

            -o {HTML|CSV}:输出格式

            -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

            -d: 显示disk相关信息

            -D total,sda,sdb,…

            -g:显示page相关统计数据

            -m: 显示memory相关统计数据

            -n: 显示network相关统计数据

            -p: 显示process相关统计数据

            -r: 显示io请求相关的统计数据

            -s: 显示swapped相关的统计数据

            –tcp

            –udp

            –unix

            –raw

            –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:终止正在运行的进程(不指定选项默认15)

            18:SIGCONT:继续运行

            19:SIGSTOP:后台休眠

                

        指定信号的方法:

            信号的数字标识:1,2,9

            信号完整名称:SIGHUP

            信号的简写名称:HUP

        按PID对进程进行管理:

            kill [-SIGNAL] pid…

        按名称对进程进行管理:

            killall [-SIGNAL] comm…

                killall -9 ping

        按模式对进程进行管理:

            pkill [options] pattern

                -u uid: effective user,生效者
                -U uid: real user,真正发起运行命令者
                -t terminal: 与指定终端相关的进程

                    pkill -t pts/2
                -l: 显示进程名
                -a: 显示完整格式的进程名
                -P pid: 显示父进程为此处指定的进程的进程列表

作业管理控制:

    前台作业:通过终端启动,且启动后一直占据终端

    后台作业:可通过终端启动,但启动后即转入后台运行(释放终端, 后台程序 ctrl+c不能终止)

    终端之间的相互切换:

        例如:ping 127.0.0.1 & 后台运行 –> jobs 查看进程编号 –> fg 编号 就能后台程序转为前台

              ping 127.0.0.1 前台运行 –> ctrl + z 转为后台休眠 –> bg 编号 后台运行

    后台作业虽然被送往后台运行,但其依然与终端相关,退出终端,关闭后台作业,如果希望送往后台后,剥离与终端的关系则可采取以下方法:

        # nohup COMMAND & #screen;COMMAND

    查看所有作业:

        jobs

    同时运行多个进程,提高效率

        有三个脚本:f1.sh f2.sh f3.sh 让其同时运行

        方法1、vim all.sh

                f1.sh&

                f2.sh&

                f3.sh&

         方法2、(f1.sh&);(f2.sh&);(f3.sh&)

         方法3、{ f1.sh& f2.sh& f3.sh& }

                              

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