在Linux系统中,触发任意一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程与用户相关的属性关系,给予这个PID一组有效的权限设置。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
操作系统中最小的资源分配单位就是进程了,从系统启动的那一刻起,就有一个个服务在被启动起来,而每个进程都与其定义的发起者权限相关联,所以我们的进程也会沿用我们定义的权限关系。
所以包括我们在shell中执行任务开启的子进制,也会沿用父进程的权限。
程序彼此之间是有相关性的!以下面的图示来看,连续运行两个 bash 后,第二个 bash 的父程序就是前一个 bash。因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就透过 Parent PID (PPID) 来判断即可。子进程可以取得父进程的环境变量,有时候杀掉一个进程,过段时间又出现的话,如果不是crontab定时任务的话,那么很有可能就是它的父进程又创建了它哦。
进程可以分为守护进程和用户进程:
守护进程(daemon),在系统引导过程中启动的进程,与终端无关;
用户进程,也称前台进程,通过终端启动的进程,与终端相关;
进程的运行状态:
运行态:running
就绪态(睡眠态):ready,又可分为可中断(interruptable)和不可中断(uninterruptable);
停止态:stoped,暂停于内存中,但不会被调度,除非手动启动;
僵死态:zombie,父进程结束前,子进程不会结束;
进程根据消耗的资源分类,可以分为:
cpu-bound:CPU密集型的,消耗很多的cpu资源
io-bound:IO密集型,消耗很多的IO资源
进程的查看:
ps命令查看:可以跟3种格式:短参数带"-",长参数形式“–”以及不带“-”形式。
不带“-”形式有:
a:显示所有与终端相关的进程
x:显示所有与终端无关的进程
u:以用户为中心组织进程状态信息显示
f:显示进程的父进程
o:显示定制的信息
常用选型aux,即 “ps aux”,显示如下:
第一行显示字段:USER 发起该进程的用户;PID 进程的进程id; %cpu 进程的当前cpu使用率; %MEM 进程的占用物理内存的比例; VSZ 虚拟内存集; RSS 真实分配内存,常驻内存集,不能交换到交换空间去;TTY 该进程运行在的终端号;STAT 当前状态,其中有很多的状态。运行态(R)、可终端睡眠(S)、不可终端睡眠(D)、停止(T)、僵死态(z)、前台进程(+)、多线程进程(l)、低优先级进程(N)、高优先级进程(<)、回话主导者(s); START 发起进程的时间点;COMMAND 进程程序名。
带“-”的选项
-e:显示所有进程,相当于ax
-f/-F:显示完整格式的进程信息
-H:以层级结构显示进程的相关信息
常用选项为-efH
pgrep [options] pattern
-u <uid> :显示有效用户的进程
-U <username>:显示指定用户的进程
-t <终端名>: 显示指定的终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid:显示指定pid的子进程
pidof <进程名>: 根据进程名字取其pid
top命令:以动态刷新的方式显示当前系统进程信息,如图:
图中黄色框内第一行显示的内容分别为当前系统时间、系统已经运行了多长时间、过去1分钟、5分钟和15分钟的平均负载;第二行显示的任务数量以及任务的分布情况,需注意的是如果出现zombie前面的数字长时间不为0的话,就需要查看进程状态,找出该僵死进程;第三行为cpu的使用情况:用户空间使用率(us),系统空间使用率(sy),调整nice值的cpu使用率(ni),空闲比例(id),等待时间比例(wa),硬件中断占用率(hi),软件终端cpu使用率(si),被偷走(如使用虚拟化技术)的cpu比例(st)。第4和5行分别是内存和交换空间的使用情况。椭圆框内分别列出的是进程id(pid)、发起进程的用户(USER)、优先级(PR)、nice值(NI)、线性内存使用大小(VRTZ)、常驻内存大写哦(RES)、空闲内存大小(SHR)、cpu使用率(%CPU)、内存使用率(%MEM)、从进程开始所使用的cpu时间(TIME+)以及命令名称(COMMAND)。
在top命令运行的过程中,可以按"P"查看cpu占用率排序,“M”内存排序,“T”累计占用cpu时间排序,“l”显示或者不显示第一行的内容,“t”显示或者不显示任务以及cpu的统计信息,“m”调整内存统计信息的显示。按“s”调试刷新数据的时间间隔,默认为3s,按“k”提示输入pid,杀掉指点的pid的进程。
top命令常用选项:-d# 指定刷新时间间隔;-b 以批次方式显示;-n # 显示多少批次。
htop命令,top命令的扩展,使用图形的方式显示。如图:
通过下面的菜单可以调整显示的内容和方式,接口更友好。在运行的过程中按“l”显示指定进程打开的文件;“a”将选定的进程绑定指定的cpu核心;“s”跟踪指定进程发起的系统调用;“t”以层级关系显示进程状态。
vmstat命令:显示虚拟内存状态:
图中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表示中断速率;cs(centext switch)表示上下文切换速率
cpu字段:us表示用户空间占用cpu比例;sy表示系统空间占用cpu比例;id表示空闲时间比例;wa表示等待时间比例;st代表被偷时间比例.
常用选项-s ,显示内存统计数据
pmap命令用来查看指定进程的内存映射表,用法为 pmap [options] pid…
常用选项-x:指定进程的扩展信息,相当于cat /proc/PID/maps
glances命令,基于视窗的交叉平台的监控工具,命令显示为:
详细显示了cpu、任务、网络、硬盘、分区和进程的情况,用”h“获得帮助列表,常用的选项有-b:以字节为单位显示网卡的数据速率;-d:关闭磁盘I/O模块 -n :关闭网络模块 -t #:指定刷新时间;-m 关闭mount模块; -1 每个cpu的数据单独显示; -f /PATH/TO/SOMEFILE 设定输出文件的位置。
该命令常用C/S模式运行:服务端:glances -S -B IPADDE(本机地址); 客户端:glances -C IPADDR(远程主机ip)。
dstat命令:功能强大的系统资源统计工具,用法:
dstat # ##: #表示刷新时间,##为显示次数;
-c:cpu状态 -d:磁盘状态 -i:中断的信息 -m:内存的信息 -p:进程状态 -n:网络接口的统计数据 -s:swap的统计信息 –aio:异步IO的统计信息 –ipc:进程间通讯的相关信息 -g:page页的相关统计 –tcp:tcp相关的统计信息 –udp:udp相关的统计信息 –top-cpu:最占用cpu的进程 –top-io:最占用IO的进程 –top-mem:最占用内存的进程 –top-lantency:延迟最大的进程。如果不指定选项,默认显示如下:
上面的内容讲述如何查看进程及其状态,下面我们就来讨论进程的管理。如何管理进程内,在linux系统中,通过IPC的方式进行管理,即进程间通信。到底有哪些信号呢,使用”kill -l“命令查看
这么多的信号,挑选常用的来演示。1)SIGHUP 无须关闭进程而让其重读配置文件 2)SIGINT 终止正在运行的进程,相当于Ctrl+c 9)SIGKILL 强行杀掉运行中的进程 15)SIGERM 终止正在运行的进程 18)SIGCONT 继续运行 19)SIGSTOP 后台休眠。
使用格式为:kill [-s singal|-SINGAL] pid…如要杀掉某进程kill -9 PID或者kill -SIGKILL PID。
kill后面跟的是PID,指定的是某一个进程,某些程序在运行的时候,会产生很多进程。要想杀死该程序发起的多个进程,用kill就比较麻烦。解决这个问题,可以使用killall命令,它可以杀死一个进程集。用法是killall PIDNAME。
系统在运行过程中,每时每刻都有很多进程在后台,有的运行,有的睡眠,有的等待。那么,系统怎么知道下一刻需要运行什么进程,调度的优先级怎么确定的呢。实际上,系统给每个进程打上了一个标签,区分每个进程的优先度的。这个就是优先级。
图中框内的PRI和NI就是确定进程优先级的数值。PRI是内核自己调整的,用户无法去调整该值,但是可以调整NI(nice)值去影响PRI的值,从而达到调整PRI的目的。nice值的范围为-20~19,管理员可以调整自己或者其他的人的nice值,而一般用户只能调整自己进程的nice值,并且范围为0~19,而且只能将nice值往大的调整,不能往小的调整。
在程序运行前指定nice值:nice -n [COMMAND]。如使用命令nice -了3 ping 127.0.0.1 & 可以是ping命令在后台以nice值为3运行。
调整正在运行的程序的nice值:renice -n # pid
使用ping命令,使用的时候NI如下,
使用命令renice -n -6 10131后,优先级和nice值为:
作业控制
Linux系统的作业可以分为前台作业和后台作业。前台作业是通过终端启动,且启动后一直占据终端;后台作业是不通过终端启动或者是通过终端启动后转入后台运行。可以有两种方式让程序运行于后台:1、在运行中的作业,通过Ctrl+z命令将其送入后台,但是在后台是停止状态;2、在运行命令时加上”&“,如vim&可以让命令直接后台运行。
注意:后台运行的程序仍然与终端相关,如果终端关闭,与该终端相关的后台程序也会被关闭。如果要想后台程序与终端剥离开来,可以使用”nohup COMMAND &“或者”screen;COMMAND“实现。
使用命令jobs查看所有的后台作业:
如上图,有两个后台作业,一个在运行,一个停止,[#]为后台作业的编号。fg命令可以将指定的后台作业调回前台运行,如上图,将vim调回前台运行使用命令:fg %2(%可以省略)。有些进入后台的程序处于停止状态,要想让其在后台继续运行,可以使用命令:bg %#(%可省略),其中#为后台作业编号;想要终止后台作业:kill %#(此处%不能shenglve)#为后台作业标号。
原创文章,作者:王更生,如若转载,请注明出处:http://www.178linux.com/60799