什么是进程?
在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
常用选项组合1:axu
例 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,运行状态;
S:interruptible sleeping,可中断睡眠
D:uniterruptible 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.7。uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;
第二行(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空间大小排序;
T:CPU累积占用时间排序;
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的百分比 |
一般us:sy为7:3最佳
1:平均或单独显示CPU的负载状态;
m: 是否显示内存相关的状态信息;
q: 退出命令
s: 修改延迟时长
k: 终止指定进程
top命令的选项:
-b: batch,批次显示
-n #: 显示的批次数量
-d #: 指明延迟时长
htop命令用法:
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]:
进程查看工具
常用选项:
-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可以提高优先级