什么是进程?

Linux系统中:触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性,给予这个PID一组有效的全乡设置。而程序就是系统工作时,启动的二进制文件。程序一般是在磁盘中的,通过用户的执行触发,然后加载到内存中成为一个个体,即进程。而常驻在内存中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,因此这些常驻进程就会被称为服务

 

进程和线程的区别:

1.定义

进程是具有一定独立功能的程序,是系统进行资源分配和调度的一个独立单位.

线程进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2.区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

总结:

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

 

 

作业管理(job control)

可以把有提示符让你操作的环境,即命令行称为前台(foreground),至于其他作业就可以让你放在后台(background)执行或暂停。

注意:放入后台的作业,它必须不能与用户交互。例:vim放在后台也是不会执行的,而cp放在后台还是会接着执行的。

 

将前台作业送往后台的方法:

&Ctrl+z:

例:

[root@bogon ~]# cp -r /etc/ /tmp/etc &
[1] 2610
[root@bogon ~]# jobs
[1]+  Running                 cp -i -r /etc/ /tmp/etc &
[root@bogon ~]# jobs
[1]+  Done                    cp -i -r /etc/ /tmp/etc


例:

vim a.txt

Ctrl+z

jobs命令用法:

jobs [-lrs]

-l : 除了列出jobnumber还列出PID号码

-r :只列出在后台run的作业

-s :仅列出在后台stop的作业

 


例:

[root@bogon ~]# jobs
[1]+  Stopped                 vim a
[root@bogon ~]# jobs -l
[1]+  2625 Stopped                 vim a


[1]job number

+ fg命令默认会第一个取回到前台的命令

- fg命令默认会第二个取回到前台的命令

 

将后台作业拿到前台处理fg命令

fg %jobnumber

fg %1

 

让作业在后台的状态变成运行中bg命令

bg %jobnumber

bg %1

 

管理后台当中的作业kill命令

列出kill能使用的信号有哪些:kill -l

[root@bogon ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

kill -信号数字 %jobnumber

-1 重新读取一次配置文件

-2 中断,与Ctrl+c一样

-9 强制删除一个工作

-15 以正常方式终止一项作业

 

注意-9 一般是在强制删除一个不正常的作业时所使用的,-15则是以正常步骤结束一项作业(15也是默认值)

 

例:kill -9 %1

进程管理:

 

1.进程查看:

 

pstree命令用法:

pstree命令:     进程树查看;

-p: 显示各进程的PID

[root@bogon ~]# pstree
init─┬─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─dbus-daemon
     ├─dhclient
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─login───bash
     ├─master─┬─pickup
     │        └─qmgr
     ├─5*[mingetty]
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     └─udevd───2*[udevd]

ps命令用法:

ps :将某个时间点的进程运行情况选取下来

                 

根据进程启动时是否是通过终端上的用户接×××互式启动的,进程可分为两类:

与终端相关的进程: a

与终端无关的进程: x

以用户为中心组织进程状态信息显示:u

 

常用选项组合1axu

ps axu

[root@bogon ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19356  1536 ?        Ss   11:17   0:00 /sbin/init
root          2  0.0  0.0      0     0 ?        S    11:17   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    11:17   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    11:17   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    11:17   0:00 [stopper/0]
root          6  0.0  0.0      0     0 ?        S    11:17   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    11:17   0:10 [events/0]

USER:该进程属于哪个用户的账号

PID:该进程的进程ID

%CPU:该进程使用CPU的资源百分比

%MEM:该进程所占用的物理内存百分比

VSZ: Virtual memory Size

线性地址空间占用的空间大小,即虚拟内存占用量(KB)

RSS:常用驻内存集;指不可以被交换至swap空间的数据占据空间大小;即占用的固定内存量(KB)

TTY:该进程是在哪个终端机上面运行,若与终端机无关则显示?

STAT:进程状态

R: running,运行状态;

Sinterruptible sleeping,可中断睡眠

Duniterruptible sleeping, 不可中断睡眠

T: stopped,停止状态

Z: zombie,僵尸状态,进程已经终止但却无法被删除至内存外,僵尸进程的原因就是因为该进程已经执行完毕,或因故应该终止了,但该进程的父进程却无法完整的将该进程结束掉,造成该进程一直存在内存中

 

s: session leader 会话进程的首进程

+: 前台进程,占据着某终端

l: 多线程进程

<: 高优先级进程

N: 低优先级进程

START: 启动时间

TIME:占据CPU累积时长

COMMAND:启动当前进程或线程的命令行程序,[]表示为内核线程;

 

常用选项组合2: -ef

-e: 显示所有进程;

-f: 显示丰富格式信息

 

常用选项组合3-eFH

-F: 显示额外信息

-H: 以层级形式显示进程间关系;

 

自定义需要显示的信息:axo

ps axo pid,command,psr,pri,ni

psr: 当前进程运行的CPU编号;

pri: 当前进程的优先级;

ni: 当前进程的nice值;

-20, 19

pgrep: 过滤只显示指定信息

语法格式:pgrep [OPTIONS] "PATTERN"

-U UID:仅显示以指定用户身份运行的进程;

-G GID

-l: 显示PID和进程名;

pidof: 获取一个正在运行的程序的ID

例:pidof /bin/bash

[root@bogon ~]# pidof /bin/bash
2476 1844

    

top命令用法:

[root@bogon ~]# top
top - 15:10:38 up  3:53,  2 users,  load average: 0.00, 0.00, 0.00
Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.5%id,  0.2%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   1004352k total,   430648k used,   573704k free,    34504k buffers
Swap:  2097148k total,        0k used,  2097148k free,   287016k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                 
  2985 root      20   0 15032 1092  828 R  2.0  0.1   0:00.05 top                                                                                                      
     1 root      20   0 19356 1536 1224 S  0.0  0.2   0:00.85 init                                                                                                     
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                 
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                              
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0                                                                                              
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0                                                                                                
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0                                                                                               
     7 root      20   0     0    0    0 S  0.0  0.0   0:12.81 events/0                                                                                                 
     8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup                                                                                                   
     9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper

第一行(top...):这一行显示的资讯分别为:

目前的时间,亦即是 14:34:29 那个项目;

开机到目前为止所经过的时间,亦即是 up 3:17 那个项目;

已经登入系统的使用者人数,亦即是 2 user项目;

系统在 1, 5, 15 分钟的平均工作负载。 batch 工作方式为负载小于0.7,代表的是 1, 5, 15 分钟,系统平均要负责运作几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了。一般队列长度的合理区间:CPU颗数*0.7uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;

第二行(Tasks...):

显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值

第三行(Cpus...):

显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键‘1’来切换成不同 CPU 的负载率。

第四行与第五行:

表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!

第六行:这个是当在 top 程式当中输入指令时,显示状态的地方。

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

PID :每个 process 的 ID 6

USER:该 process 所属的使用者;

PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;

NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;

VIRT:虚拟内存;

RES:常驻内存;

SHR:共享内存;

S:状态;

%CPU:CPU 的使用率;

%MEM:内存的使用率;

TIME+:累计使用CPU 时间;

COMMAND:命令行程序

 

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

M:以占据Memory空间大小排序;

TCPU累积占用时间排序;

 

l: 是否显示系统负载行;

队列长度的合理区间:CPU颗数*0.7

uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;

[root@bogon ~]# uptime
 15:11:33 up  3:54,  2 users,  load average: 0.00, 0.00, 0.00

t: 是否显示进程摘要信息及CPU负载状态;

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

us: user space

运行用户程序所占据的CPU百分比

sy: system (kernel space)

 运行内核程序所占据的CPU百分比

ni: nice

调整nice值之后影响到的CPU百分比

id: idle

空闲CPU百分比

wa: wait io

等待I/O完成占据CPU的百分比

hi: hardware interrupt

处理硬件中断占据的CPU百分比

si: software interrupt

处理软件中断占据的CPU百分比

st: stolen

被虚拟化技术“偷走”CPU的百分比

一般ussy7:3最佳

1:平均或单独显示CPU的负载状态;

m: 是否显示内存相关的状态信息;

 

q: 退出命令

s: 修改延迟时长

k: 终止指定进程

 

top命令的选项:

-b: batch,批次显示

-n #: 显示的批次数量

-d #: 指明延迟时长

htop命令用法:

    wKiom1UuDnHSWohGAAbM5KzdjGw180.jpg

F1 帮助信息

F2 设置

F3 搜索

F4 过滤

F5 以树状结构显示

F6 按什么排序

F7/F8 设置NICE

F9 终止进程

F10 退出

 

u: 过滤仅显示选定用户的进程;[左侧会出现选项栏]

s: 跟踪选定的进程所发起的系统调用;[选定一个进程按s]

l: 显示选定进程所打开的文件;[选定一个进程按l]

t: 显示进程的层次结构,F5一样;[选定一个进程按t]

a: 设定进程的cpu亲缘性;(将选定的进程绑定在指定的CPU上)

 

      选项:

-d #: 延迟时长

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

-s COLUMN: 根据指定的字段进行排序;

mvstat命令用法:

查看虚拟内存的使用

vmstat -s 显示内存的状态统计信息

vmstat 1 3 表示1秒刷新一次,共3

[root@bogon tmp]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 421292  45176 427532    0    0    19    19   13   14  0  0 99  0  0	
[root@bogon tmp]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 421300  45184 427560    0    0    19    19   13   14  0  0 99  0  0	
 0  0      0 421260  45184 427560    0    0     0     0   15   13  0  0 100  0  0	
 0  0      0 421260  45184 427560    0    0     0     0   12   14  0  0 100  0  0	

进程相关(procs) 的项目分别为:

r:等待运作中的程序数量即等待运行的进程的个数;(队列长度)

b:不可被唤醒的程序数量即处理不可中断睡眠状态的进程的个数;(即IO阻塞队列长度)

这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。

内存(memory) 项目分别为

swpd: 交换内存使用量;

free: 空间的物理内存量;

buffer: 用于缓冲的内存总量;

cache: 用于缓存的内存总量;

内存交换空间(swap) 的项目分别为:

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

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

如果si/so的数值太大,意味着物理内存不够用了,表示内存中的资料常常得在磁盘和内存之间传来传去,系统效率会很差

磁盘读写(io) 的项目分别为:

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

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

如果这部份的值越高,代表系统中有进程I/O非常忙碌

系统(system) 的项目分别为:

in:每秒被中断的程序次数;

cs:每秒钟进行的事件切换次数;

这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时钟等。

CPU 的项目分别为[top中有详细介绍]

us:非核心层的 CPU 使用状态;

sy:核心层所使用的CPU 状态;

id:闲置的状态;

wa:等待 I/O所耗费的 CPU 状态;

st:被虚拟机器(virtual machine) 所盗用的 CPU 使用状态。


glances命令用法[epel]:

进程查看工具

wKioL1UuGfqTRp4_AAPtrogSzvo043.jpg

      常用选项:

-b: Byte/s为单位显示网卡设备数据交换速率;

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

-f /PATH/TO/SOMEFILE:设置输出文件的位置及格式;把

-o HTML|CSV:使用HTML/CSV格式

[root@bogon tmp]# glances -f test.txt -o CSV
[root@bogon tmp]# cat test.txt 
load,0.08,0.03,0.0
mem,1028456448,131133440,897323008
swap,2147479552,0,2147479552
cpu,1.30718954248,2.61437908497,0.0,96.0784313726,0.0,0.0
load,0.08,0.03,0.0
mem,1028456448,131624960,896831488
swap,2147479552,0,2147479552

-m: 关闭mount功能模块

-n: 关闭网络功能模块

-r: 关闭进程列表功能模块

-t #: 指定延迟时长,默认为3秒;

-1:单独显示每颗CPU相关负载数据信息;


glances支持远程模式:

  即可以以C/S模式工作:

      Server: 以监听模式启动glances

      Client: 以远程模式启动glances,远程连入指定服务器,并显示Server上的相关性能数据;

     

  服务模式:

    glances -s -B 本地IP地址

      -B: 用于指明监听的本地地址;

     

  客户端模式:

    glances -c 服务器IP地址

      -c: 用于连入的服务器的地址;

例:   192.168.1.108上执行glances -s -B 192.168.1.108

192.168.1.106上执行glances -c 192.168.1.108

注意:可能由于防火墙的原因无法连接



dstat命令用法:

统计系统资源数据的多用途工具,整合了vmstat, iostat, netstat and ifstat四款工具的功能;

 

dstat

-c: 显示cpu性能指标相关的统计数据;

[root@bogon nginx-1.6.2]# dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq
  0   0  99   0   0   0
  0   0 100   0   0   0
  0   0 100   0   0   0

-d: 显示disk相关的速率数据;

[root@bogon nginx-1.6.2]# dstat -d
-dsk/total-
 read  writ
  16k   16k
   0     0 
   0     0 
   0     0

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

[root@bogon nginx-1.6.2]# dstat -g
---paging--
  in   out 
   0     0 
   0     0 
   0     0

-i: 显示interrupt相关的速率数据;

[root@bogon nginx-1.6.2]# dstat -i
----interrupts---
  17    18    19 
   1     0     1 
   0     0     3 
   0     0     2 
   0     0     3

-l: 显示loadaverage相关的统计数据;

[root@bogon nginx-1.6.2]# dstat -l
---load-avg---
 1m   5m  15m 
   0    0    0
   0    0    0
   0    0    0

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

-n: 显示网络收发数据的速率;

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

-r: io请求的速率;

-s: 显示swap的相关数据;

-y: 显示系统相关的数据,包括中断和进程切换;

 

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

--top-bio:显示最消耗blockio的进程;

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

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

 

--ipc: 显示进程间通信相关的速率数据;

--raw: 显示raw套接的相关的数据;

--tcp: 显示tcp套接字的相关数据;

--udp: 显示udp套接字的相关数据;

--unix: 显示unixsock接口相关的统计数据;

--socket:显示套接字,相当于--raw --tcp --udp一起使用

 

-a:显示CPU,磁盘,网络,页面,系统相关信息,相当于-cdngy


kill命令用法:

IPC: 进程间通信

  常见形式:

    message queue

    semerphore

    shared memory

    signal

   

signal: 传递给进程的短小信息

Linux主机支持的进程间可用到的信息:

(1)kill -l   [上面jobs有描述]

(2)man 7 signal

 

向进程发信号:

kill[-SIGNAL] PID

默认的信号为SIGTERM

 

信号表示方式:

(1) 完整名称,例如SIGINT

(2) 简写名称,例如INT

(3) 数据代称,例如2

常用信号:

SIGHUP

1

通知进程重读其配置文件以让新的配置生效,但不用重新启动进程

SIGINT

2

打断正在运行中的进程,相当于键盘组合键Ctrl+c

SIGKILL

9

强行中止正在运行中的进程

SIGTERM

15

安全中止正在运行中的进程

SIGSTOP

19

暂停进程

SIGCONT

18

继续运行指定进程

kill -15 1521

      kill -SIGTERM 1521

      kill -TERM 1521

kill相似的一组进程:

killall[-SIGNAL] PROGRAM

例:killall -15 http


进程优先级调整:

   静态优先级:

通过指定进程的nice值来调整其优先级;用户空间运行的进程一般都有其nice值;

nice值: -20,19

优先级:  100, 139

注意:值越低优先级越高

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

   

   (1) 对于尚未启动的进程,调整nice值:

nice -n NICE COMMAND

nice -n 3 vim test.txt

    (2) 对于已经启动并处于运行中的进程,调整nice值:

 renice -n NICE PID

renice -n 4 1521 

   注意:普通用户仅能够调大nice,调低优先级;只有root可以提高优先级