Linux进程及作业控制

inux进程


进程的概念

当一个系统启动时,刚开机是第一个运行的是内核代码!先把内核放到cpu上运行,等内核控制和掌管了一切,有内核启动进程!然后创建第一个进程 init进程  内核空间 用户空间也都已被创建成功!后期的一切管理工作都由init来负责

init不能代表系统完成一些内核特权的执行!但由他负责向内核提交

他是总的由用户管理的总进程,它会照自己样子创建一个子进程,除了init以外,所有的进程都是由其父进程创建! init是由 上帝(kernel)创造出来的

父进程如何创建子进程,是 fork 自身而来!父进程在创建子进程时是使用同一段内存空间!
  • 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能

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

    • 进程ID(Process ID,PID)号码被用来标记各个进程

    • UID、GID、和SELinux语境决定对文件系统的存取和访问权限,

    • 通常从执行进程的用户来继承

    • 存在生命周期

  • Linux内核存储进程信息的固定格式:task struct

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

进程创建:

init:第一个进程
    父子关系
    进程:都由其父进程创建
        fork(), clone()

进程优先级:

系统优先级:数字越小,优先级越高
    0-139(CentOS4,5)
        各有140个运行队列和过期队列
    0-98,99(CenOS6)
        实时优先级: 99-0:值最大优先级最高
Nice值:-20,19对应系统优先级100-139或99

Nice值:
    -20,19

Big O:时间复杂度,用时和规模的关系

O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

进程内存:

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

  • LRU:  Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间

  • MMU:Memory Management Unit负责转换线性和物理地址

事实上应用程序是不可能访问硬件(包括内存),内核就是为了完成资源分配的,会把内存切割成固定大小的片段分配给各个应用使用大小为  4K!
内核分配多个不连续的内存,并把它们假装成连续的(用一个中间层!使应用假装跑在连续的内存中)

IPC: Inter Process Communication 进程之间的通信

  • 同一主机上:

      signal   发信号
      shm: shared memory  使用共享内存,读其他进程的内存空间
      semerphor  发一个短小的信号!
  • 不同主机上:

      rpc: remote procecure call  远程过程调用
      socket: 基于套接字通信!
       首先创建一个 socket 文件 :一端保存着自己的端口,还保存有对方的通信端口   进程关闭了就把这个关闭

Linux内核:抢占式多任务

进程类型:

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

  • 前台进程:跟终端相关,通过终端启动的进程

注意:也可把在前台启动的进程送往后台,以守护模式运行;

进程状态:

  • 运行态:running

  • 就绪态:ready

  • 睡眠态:

    • 可中断:interruptable

    • 不可中断:uninterruptable

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

  • 僵死态:zombie

进程的分类:

CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互

系统进程管理工具

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

pstree命令

pstree命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。

显示当前所有进程的进程号和进程id
pstree -p

[root@qzx /etc/yum.repos.d ]# pstree -p
systemd(1)─┬─ModemManager(789)─┬─{ModemManager}(807)
           │                   └─{ModemManager}(818)
           ├─NetworkManager(44463)─┬─dhclient(47671)
           │                       ├─dhclient(47742)
           │                       ├─{NetworkManager}(44464)
           │                       └─{NetworkManager}(44467)
           ├─abrt-watch-log(828)

显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。
pstree  -a

ps 列举进程

适用ps来查看进程信息

语法 ps [OPTION]…

支持三种选项:

  • UNIX选项 如-A -e

  • BSD选项 如a

  • GUN选项 如—help
    • 默认显示当前终端中的进程
    • a 选项包括所有终端中的进程
    • x 选项包括不链接终端的进程
    • u 选项显示进程所有者的信息
    • f 选项显示进程的父进程
    • o 属性… 选项显示定制的信息:
     pid、comm、%cpu、%mem、state、tty、euser、ruser

常用组合之一:aux

    VSZ:虚拟内存集;
    RSS:Resident Size,常驻内存集;
    STAT:
        R:running
        S:interruptable sleeping
        D:uninterruptable sleeping
        T:Stopped
        Z:zombie

        +:前台进程
        l:多线程进程
        N:低优先级进程
        <:高优先级进程
        s:session leader

常用组合之二:-ef

  • -e:显示所有进程

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

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

    • C: cpu utilization

    • PSR:运行于哪颗CPU之上

  • -H:以层级结构显示进程的相关信息;

常用组合之三:-eFH

常用组合之四:-eo, axo

    o  field1, field2,...:自定义要显示的字段列表,以逗号分隔;
    常用的field:pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio

    ni:nice值;
        priority:priority, 优先级;
        rtprio:real time priority,实时优先级;

搜索进程

最灵活:ps 选项 | 其它命令

按预定义的模式:pgrep

pgrep [options] pattern
   -u uid: effective user,生效者

-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程

按确切的程序名称:/sbin/pidof
$pidof bash

uptime

[root@LinServ-1 ~]# uptime
 15:31:30 up 127 days,  3:00,  1 user,  load average: 0.00, 0.00, 0.00

        15:31:30          //系统当前时间
        up 127 days,  3:00   //主机已运行时间,时间越大,说明你的机器越稳定。
        1 user      //用户连接数,是总连接数而不是用户数
        load average: 0.00, 0.00, 0.00  // 系统平均负载,统计最近1,5,15分钟的系统平均负载

显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)

系统平均负载:

指在特定时间间隔内运行队列中的平均进程数。

如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。

如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

top:

排序:

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

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

  • T:累积占据CPU时长,TIME+

首部信息显示:

  • uptime信息:l命令

  • tasks及cpu信息:t命令

  • cpu分别显示:1 (数字)

  • memory信息:m命令

选项:

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

  • -b:以批次方式显示;

  • -n #:显示多少批次;

退出命令:q

修改刷新时间间隔:s

终止指定进程:k

保存文件:W

%Cpu(s):对应的那一横栏:

Linux进程及作业控制
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间

黑底的栏位信息简介

PID (Process Id ) :  任务的进程ID
PPID (Parent Process Pid) :  父任务的进程ID
RUSER (Real User Name) : 任务的所有者真实名称
UID (User Id) : 任务所有者ID
USER (User Name) : 任务所有者名称
GROUP (Group Name) : 任务所有者群组名
TTY (Controlling Tty) : 终端
PR (Priority):优先级
%CPU (CPU usage) : CPU使用率
%MEM (Memory usage (RES)) : 内存使用率
S (Process Status) : 进程状态
TIME+ (CPU Time, hundredths) : CPU时间,精确到秒

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

http://172.16.0.1/fedora-epel/7/x86_64

选项:

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

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

  • -s COLUME: 以指定字段进行排序;

子命令:

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

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

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

  • t: 显示进程树 或者 F5
    Linux进程及作业控制

vmstat命令:

  • Report virtual memory statistics

      vmstat 2 10
      表示 命令每2秒钟刷新一次,刷新10次

Linux进程及作业控制
Linux进程及作业控制

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

语法 pmap [选项] pid […]

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

#pmap 1
查看 1 号进程的系统映射

另外一种实现:
# cat /proc/PID/maps

glances命令:EPEL源

glances
[-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P
password] [—password] [-t refresh] [-f file] [-o output]

常用选项:

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

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

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

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

  • -m: 禁用mount模块

  • -n: 禁用网络模块

  • -t #: 延迟时间间隔

  • -1:每个CPU的相关数据单独显示

C/S模式下运行glances命令

1、服务模式:

glances -s -B IPADDR
IPADDR: 指明监听的本机哪个地址

2、客户端模式:

glances -c IPADDR
IPADDR:要连入的服务器端地址

dstat命令:系统资源统计

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

Linux进程及作业控制

  • -c: 显示cpu相关信息

    • -C #,#,…,total(总体的)

  • -d: 显示磁盘的相关信息

    • -D total,sda,sdb,…total

  • -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:终止正在运行的进程

  • 18) SIGCONT:继续运行

  • 19) SIGSTOP:后台休眠  相当于ctrl+z

如果复制一个大文件,可以用 ctrl+z送到后台,不过这是是停止状态,可以再用 kill 18 加这个进程  就可以继续进行了

指定信号的方法:

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

  • (2) 信号完整名称;SIGHUP

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

按PID:kill [-SIGNAL]  pid …

按名称:killall [-SIGNAL]  (名称)comm…

按模式:pkill [options] pattern

  • -SIGNAL

  • -u uid: effective user,生效者

  • -U uid: real user,真正发起运行命令者

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

  • -l: 显示进程名

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

  • -P pid: 显示父进程为此处指定的进程的进程列表

例如:

pkill -t pts/2
表示杀掉 pts/2终端的进程!但是依赖的 bash 杀不了因为发的是 -15信号 要想杀全 就用 pkill -9 -t pts/2

jobs:

前台作业(foregroud):通过终端启动,且启动后会一直占据终端;
后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端);

如何让作业运行于后台?

(1) 运行中的作业

Ctrl+z
注意:送往后台后,作业会转为停止态;    

(2) 尚未启动的作业

# COMMAND &

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

nohup  COMMAND  &

注意此命令执行后即使父进程关闭依然会运行!执行它的父进程为init。这时只能关闭不能再调入前台了~只能用kill关闭

查看所有作业:

# jobs

作业控制:

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

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

kill %JOB_NUM :终止指定的作业 %号不可省!!

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

1、 vi all.sh
    f1.sh&
    f2.sh&
    f3.sh&

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

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

进程优先级调整:

静态优先级:100-139

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

只有根用户才能降低nice值(提高优先性)

数值越低,优先级越高!

nice命令:

nice [OPTION] [COMMAND [ARG]…]

    [root@localhost ~]# nice -n 10 ping 10.1.0.1 
    调整进程优先级为 10

renice命令:对已运行的进程调整nice值

renice [-n] priority pid…

Linux进程及作业控制

查看nice:

ps axo pid,comm,ni

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