Linux 进程及作业管理

一 进程、线程、程序概念

1、进程(Process)

什么是进程,简单的说,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本;程序是放置于磁盘的,而运行中的程序是位于内存中的。

2、线程(Thread)

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

3、程序(Program)

程序由指令和数据组成。

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

程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(Executable Image)中,所以,程序是一个静态的实体。

二 进程相关知识

1.虚拟地址空间

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

2.内核模式与用户模式

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

3.进程的状态:

        运行态:runnnig

        睡眠态:sleeping

        可中断睡眠:interruptable,随时来请求,随时能唤醒,比如处理完当前请求后暂时还没有更多请求下,这种sleep就是可                                    中断 

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

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

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

4.进程的优先级

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

        实时优先级:0-99,数字越大,优先级越高;(内核控制)

        静态优先级:100-139,数字越小,优先级越高。(用户可控制的优先级)

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

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

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

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

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

5.进程间通信方式(IPC: Inter Process Communication)

同一主机:

            singnal:信号。

            shm:共享内存。

            semerphor:旗语。

不同主机:

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

            socket:IP:port,套接字。

6.进程的分类:

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

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

7.子进程

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

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

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

8.线程

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

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

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

三 进程管理相关命令

1.pstree    # 显示进程树

  pstree -p

blob.png

2.ps:process state,查看当前进程状态

  备注:实际上是查看/proc/ *目录下内核中的状态信息

    SYNOPSIS

           ps [options]

            

        a:显示所有与终端有关的进程

        x:显示所有与终端无关的进程

        u:显示运行进程的用户

        -e:显示所有进程

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

        o  field1, field2,…:自定义要显示的字段列表,以逗号分隔

常用组合:aux、ef、axo

 ps -aux

blob.png

   USER:运行该进程的用户

   PID:进程的ID号码

   %CPU:CPU的占用百分比

   %MEM:内存空间占用比率,占用整个内存空间的比例

   VSZ:虚拟内存集;占用的虚拟内存大小,真正用来占用的内存

        每个内存占用的内存有两种:线性内存空间、物理内存空间

        线性内存:会映射到物理内存,在线性内存空间角度看是连续的内存占用

        物理内存:实际上是以内存页框保存,可能一个进程占用的不连续的页框

   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:使用进程、线程

ps -ef

blob.png

   UID:启动进程用户

   PID:运行进程号

   PPID:父进程的进程号,0在内核启动init之前存在,init启动后终止,存在过渡,一般为swap的进程

   C:cpu utilization,CPU的占用百分比

   STIME:启动时间

   TTY:与其终端相关

   TIME:累计运行CPU时间

   CMD:启动此进程的命令

ps axo  显示自定义字段列表

 o field1, field2,…:自定义要显示的字段列表,以逗号分隔,o要写在后面,因为要带参数

    常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio

    ni:nice值;

    priority:priority,优先级;

    rtprio:realtime priority,实时优先级;

3.pgrep,pkill:基于进程名字或者其他属性对相关进程发起查询、发送信号

  SYNOPSIS

         pgrep [options]  [pattern]

        

        -o:仅显示找到的最小(起始)进程号

        -n:仅显示找到的最大(结束)进程号

        -l:显示进程名称

        -P:指定父进程号

        -g:指定进程组

        -t:指定开启进程的终端

        -u:指定进程的有效用户ID

   blob.png

4.pidof:根据进程名获取取其pid;

    SYNOPSIS

           pidof [-s] [-c] [-x] [-o omitpid] [-o omitpid..]  program [program..]

            

        -s:仅显示一个

blob.png

5.top:- display Linuxprocesses,动态显示进程信息

   SYNOPSIS

        top  [OPTION]

   (1)选项:

       -d #:指定刷新时间间隔,默认为3秒;

         -b:以批次方式显示;

       -n #:显示多少批次;

   (2)在top显示过程中通过交互式命令指定排序(默认CPU):

           P:以占据CPU百分比排序;

           M:以占据内存百分比排序;

           T:累积占用CPU时间排序;

   (3)首部信息关闭

          uptime信息:l命令

          tasks及cpu信息:t命令

          内存信息:m命令

   (4)退出命令:q

   (5)修改刷新时间间隔:s

   (6)终止指定的进程:k

 top

blob.png

blob.png

  这一行的内容表示:

                23:11:04:当前系统时间;

                up  1:00:服务器连续运行的时长为1小时;

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

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

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

blob.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,偷走的时间百分比。

blob.png

各字段含义如下:

                Mem:物理内存;

                Swap:交换分区; 

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

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

 top -p 1727

blob.png

6.uptime命令:显示系统时间、运行时长及平均负载  

去1分钟、5分钟和15分钟的平均负载;等待运行的进程队列的长度;

blob.png

7.htop命令

这个工具默认没有安装 需要第三方源才可以安装

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum install htop

(1)选项:

    -d#:指定延迟时间间隔;

    -uUserName:仅显示指定用户的进程;

    -sCOLUME:以指定字段进行排序;

(2)子命令:

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

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

    t:以层级关系显示各进程状态;

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

(3) 显示叙述

blob.png

左上方数据:表示每颗CPU、内存、交换内存的使用率

右上方数据:

    Tasks当前的任务数量,用户空间进程

    thr:线程数量

    running:运行的数量

    Load average :过去一分钟、五分钟、十五分钟的平均负载

8.vmstat命令    # 显示虚拟内存统计信息

 vmstat

blob.png

procs:

    r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;

    b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;

memory:

    swpd:交换内存使用总量;

    free:空闲的物理内存总量;

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

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

swap

    si:数据进入swap中的数据速率(kb/s)

    so:数据离开swap的速率(kb/s)

io

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

    bo:保存数据至块设备的速率(kb/s)

system

    in:interrupts,中断速率;

    cs:contextswitch, 上下文 切换的速率;

cpu

    us:user space

    sy:system

    id:idle

    wa:wait

    st:stolen

9.dstat命令    #系统资源统计工具

    SYNOPSIS

        dstat [-afv][options..] [delay [count]]

 常用选项:

        -c,–cpu:显示cpu相关信息;

        -C #,#,…,total  显示第几颗CPU,total总共的

        -d,–disk:显示磁盘的相关信息

        -D sda,sdb,…,tobal  指明具体的磁盘信息

        -g:显示page相关的速率数据;

        -m:Memory的相关统计数据

        -n:Interface的相关统计数据;

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

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

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

        –tcp、–udp、–raw 、–socket 网络连接相关

        –ipc 进程相关

        –top-cpu:显示最占用CPU的进程;

        –top-io:最占用io的进程;

        –top-mem:最占用内存的进程;

        –top-lantency:延迟最大的进程;

 dstat

blob.png

10.kill命令:      

kill  [-s signal|-SIGNAL]  pid…     向进程发信号

kill -l [signal]:显示当前系统可用信号:

 blob.png    

常用信号:

1) SIGHUP: 无须关闭进程而让其重读配置文件;

2) SIGINT: 中止正在运行的进程;相当于Ctrl+c;

9) SIGKILL: 杀死正在运行的进程;

15) SIGTERM:终止正在运行的进程;

18) SIGCONT:继续

19) SIGSTOP:停止,将进程送后台,停止状态

指定信号的方法:

(1) 信号的数字标识;1, 2, 9

(2) 信号完整名称;SIGHUP

(3) 信号的简写名称;HUP

11.killall

 killall [-SIGNAL]  program  对所有与program相关的进程发信号

四 系统作业控制命令

1.系统作业job

      (1)job种类:

                前台作业(foregroud):通过终端启动,且启动后会一直占据终端;

                后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端);

      (2)让作业运行于后台

                1) 运行中的作业:Ctrl+z

                   送往后台后,作业会转为停止态;相当于发送kill -19 信号

                2) 尚未启动的作业:  # COMMAND &

                   此类作业虽然被送往后台,但其依然与终端相关;如果希望把送往后台的作业剥离与终端的关系:

                   # nohup COMMAND &

      (3)查看所有的作业:#jobs命令

         +/- 表示优先级;当调用时不加作业号会默认调用+的命令

       (4)可实现作业控制的常用命令:

          #fg  [[%]JOB_NUM]:把指定的作业调回前台;

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

          #kill  %JOB_NUM:终止指定的作业;

blob.png

2.调整进程优先级: 

可通过nice值调整的优先级范围:100-139;分别对应于:-20, 19。进程启动时,其nice值默认为0,其优先级是120;

    注意:仅管理员可调低nice值;

(1)nice命令:

    以指定的nice值启动并运行命令:# nice  [OPTION] [COMMAND [ARGU]…]

     选项:-nNICE

            nice -n -5 echo "hello world"

(2)renice命令:

    #renice  [-n]  NICE PID…

    renice -10 1589

(3)查看Nice值和优先级:ps  axo pid, ni, priority, comm 

    ps axo pid,ni,command | grep "bash"

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

(0)
上一篇 2016-03-14 14:51
下一篇 2016-03-18 12:35

相关推荐

  • 马哥教育千万级PV实战大揭秘

    又到了激动人心的架构实战项目实践时间,马哥教育面授班的学员都很期待这一刻的到来,因为经过此次洗礼,能让自己成长更多! 上周二,马哥教育张Sir带领18期面授班的学员们做千万PV级别的电商架构实战项目!新增的多台R710企业级服务器设备,轻松搭建大数据、云计算等高端实验环境,让实战,更加真实!相信经过这场实战的洗礼,小伙伴们架构技能会有更大提升! 【张Sir生…

    2016-06-30
  • bonding

    boding制作        问题:一个网卡一个IP没有容错性     bonding是LINUX中将多网卡绑定虚拟成一块网卡,实现多网卡共同拥有一个IP,这项技术早在Sun和Cisco中被称为Trunking和Etherchannel技术。   …

    2017-03-22
  • Linux基础知识(一)-linux哲学思想,基础命令,FHS

    1.描述计算机的组成及其功能 2.按系列罗列Linux 的发行版,并描述不通发行版之间的联系和区别. 3.描述Linux的哲学思想,并按照自己的理解对其进行解释 4.说明Linux系统命令的使用格式,详细介绍ifconfig,echo,tty,startx,export.pwd,history,shutdown,poweroff,reboot,hwclock…

    Linux干货 2016-09-22
  • 推荐-常用RAID级别详解

    一、RAID是什么       RAID(Redundant Arrays of Indent Disks)的名称是独立磁盘冗余阵列,是一种通过将多块硬盘按照某种特定的结构组织起来当做一块硬盘来使用的技术,多块硬盘不同的组织结构我们称之为RAID的级别。而RAID技术的特性主要表现在两个方面: (1)提高硬盘…

    Linux干货 2016-03-27
  • rsync+inotify实现数据实时同步备份

    定时备份和实时备份        说到备份,无疑于定时备份和实时同步备份。定时备份可以通过脚本或者Crontab来实现,而实时同步备份可以通过某些接口监控文件的各种变化情况来实现的(比如内核接口inotify);通过对比可以发现对数据信息要求高的环境使用实时同步备份可以更好更有利的保护数据的安全性。 软件介绍之rsyn…

    Linux干货 2015-02-28
  • shell脚本循环及函数

    16.循环执行                 将代码段重复运行多次           &nbsp…

    Linux干货 2016-08-24