进程管理详解

一、进程概述

1、进程的概念

用户通过执行命令,将程序提起到内存中运行,运行中的程序即称为进程。内核为了方便管理,根据内核发起者的权限、属性等参数,为每个进程设置一个独立的PID号,通过PID号来判断进程的权限。

2、进程的分类:

2.1根据进程与终端的关系划分:

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

交互式进程(用户进程):用户通过终端启动的进程

在终端上运行的进程,可以被送往后台,以守护进程的模式运行。

2.2根据系统资源的占用比划分:

CPU密集型:CPU-Bound,在分配优先级时,因其会占用较多的CPU资源,应给其分配较低的优先级

IO密集型:IO-Bound,在分配优先级时,应给其分配较高的优先级

3、进程的属性:

进程的ID(PID):进程的唯一标识

启动进程的用户ID和属组ID:进程在运行时,为了完成任务需要访问到某些文件。内核如何判断进程是否具有访问权限呢?有两种情况:一、被发起为进程的程序不具有SGID权限,在此情况下,内核根据进程发起者的属主和属组对该文件是权限来判断;二、程序具有SGID权限,内核根据程序文件的属主和属组对该文件的权限来判断。

父进程及父进程的ID(PPID):

进程状态

进程执行优先级

进程所连接的终端名

进程资源占用比:如CPU占用百分比、内存占用百分比

2.1)进程的父子关系

进程由其父进程创建。父进程出于完成复杂任务的需要,创建子进程。子进程也可以创建自己的子进程。

在CentOS6系列中,系统在启动之后,会加载运行内核代码,在内核控制系统之后,由内核创建进程,内核创建的第一个进程为init进程,init进程创建完成,意味着内核空间创建完成,用户空间也创建完成,之后由init进程接管系统,init进程为系统上所有进程的父进程。内核则退居幕后,只负责特权级操作。

         父进程如何创建子进程:父进程通过fork-and-exec流程来创建子进程。首先以fork的方式复制一个与父进程相同的暂存进程,之后暂存进程以exec的方式加载实际要执行的进程。

例:创建一个ping.sh脚本,其功能为通过ping命令判断192.168.1.200主机是否可达。脚本创建完成之后,运行脚本,之后脚本以子进程的形式运行ping命令。

写时复制机制(COW):子进程指向的内存空间同父进程,一旦子进程需要修改父进程的数据,这时父进程会将数据复制到空闲的内存空间中,同时告知子进程在新内存空间中进程操作,这样的机制就称为写时复制。

2.2)进程的状态

运行态:正在运行的进程,running

就绪态:可以被允许但没被允许,用ready标识

睡眠态:

可中断睡眠:interruptable

不可中断睡眠:进程发起I/O请求,内核在接到请求到完成请求响应之间,会将进程的状态调整为不可中断睡眠态,用uninterruptable标识

在什么情况下进程会被中断:进程为了完成任务,发起I/O请求,但进程请求的数据在内存中没有,此时进程会像内核提起请求,内核从磁盘中将该数据加载至内核的内存空间中,再将数据从内核内存空间复制至进程的内存空间。在这一过程中,进程处于中断状态。

停止态:暂停于内存中,单不会被调度,除非手动启动,用stopped标识

僵死态:一般情况下,子进程生命周期结束后都由父进程进行销毁。但当子进程的父进程被杀死之后,父进程未指定如何处理子进程,该子进程会进入僵死态,直至被init进程处理。用Zombie标识

处于僵死态的进程会占用内存空间,若此类进程出现多个,则有可能造成内存空间不足。

2.3)进程优先级

进程优先级用于标识进程的运行次序。由内核负责调度

进程优先级分类:

系统优先级:0-139

实时优先级:1-99。数值越大,优先级越高

静态优先级:100-139。用户可以调度,数值越小,越优级越高

优先级的Nice值:-20-19,与静态优先级一一对应,数值越小,越优级越高

可通过调整Nice值来改变进程的优先级。但普通用户只能调低优先级,root则不受限。

4、进程队列

CPU时间片:将CPU时间分割成片,每个进程占用一个时间片,时间片耗完之后,切换至下一个进程。

运行在CPU的进程根据运行状态被分别保存至CPU中的运行队列和过期队列中。

运行队列有等待被运行的进程组成。

进程运行之后,被划分到过期队列中。

当运行队列中的所有进程都被允许之后,运行队列被清空,此时,运行队列会被转换为过期队列,过期队列则相应地转换为运行队列。

5、进程间通信: Inter Process Communication(IPC)

       5.1 linux进程间通信方式:

1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

2)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。

3)报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4)共享内存(ShareMemory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

5)信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

6)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。Linux和System V的变种都支持套接字。

socket由ip:port构成,端口用于标识主机上的进程。

已建立连接的套接字由client ip:sort<--->server ip:port

监听模式:无论是否有访问请求,都开启进程,并监听在某ip:port上,着被称为LISTEN机制。

5.2不同主机进程间通信:

基于Socket实现不同主机间进程通信。

Socket文件存source_ip,source_port,des_ip,des_port。进程P1通过open socket文件,请求发起同PC2的P2进程间通信,通信结束之后,close socket文件。

二、进程查找

1、ps [options] | Pattern:灵活的查找方式

例:查找root用户发起的进程

例:查找http服务相关的进程

2、pgrep:按预定义的模式搜索进程

pgrep [options] pattern

-u uid :effective user

-U user:realuser

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

-l :显示进程名

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

-P pid:显示此进程的子进程

例:查找root用户的进程并显示进程名

3、pidof:查找正在运行的进程的id

三、进程观察

1、pstree:以树型图查看当前系统进程

pstree -p:显示进程树,同时显示进程id号

2、ps命令:以快照的方式报告当前进程的状态信息

内核的状态信息保存在/proc/目录中,进程的信息也保存在/proc目录下,并以pid号的方式保存为目录

2.1)ps命令的选项有三种风格:

UNIX风格:-a,短选项

BSD风格:a,不加-

GNU风格:--all,长选项

2.2)启动进程的方式:

系统启动过程中自动启动:与终端无关的进程

用户通过终端启动:与终端相关的进程

2.3)ps选项

a:所有与终端相关的进程

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

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

2.3.1)常用组合之一:aux

例:

依次可以查看到

进程的发起者(USER),进程id(PID),CPU占有率(%CPU),内存占用率(%MEM),虚拟内存集(VSZ),常驻内存集(RSS),在哪个终端启动(TTY),进程状态(STAT),进程开始时间(START),进程CPU占用时间(TIME),发起进程的命令(COMMAND)

STAT:进程的状态。进程状态分类如下:

R:running

S:interruptable sleeping

D:uninterruptable sleeping

T:stopped

Z:Zombie

+:前台进程

l:多线程进程

N:低优先级进程

<:高优先级进程

s:session leader

2.3.2)常用组合之二:-ef

-e:显示所有进程

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

依次可以看到进程发起者、进程id、进程的父进程id、CPU占用百分比、进程发起时间、进程发起终端、CPU占用时长、发起进程命令

2.3.3)常用组合之三:-eFH

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

C:(cpu utilization) cpu占用百分比

PSR:运行于哪颗CPU之上

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

2.3.4)常用组合之四:

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

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

ni:nice至-20---19

对应优先级的100-139

越小越优先

pri:priority 优先级

rtprio:real time priority实时优先级

-eo:

-axo:

例:自定义显示进程的ID,进程的父进程ID,命令,Nice值,进程优先级,实时优先级,cpu占用率,进程状态信息

3、uptime命令:

显示系统时间、允许时长、平均负载

平均负载:过去1分钟、过去5分钟、过去15分钟CPU等待运行的进程队列的长度。

4、top命令:实时查看进程信息的变化

首部信息:

第一行显示的信息:依次

*当前系统时间

*开机到当前所经过的时间

*已登陆系统的使用者人数

*uptime命令的结果显示,表示系统在1,5,15分钟的平均工资负载,即CPU运行队列里的进程个数

通过l命令显示或关闭

第二行显示的信息:显示当前系统上运行的进程总数,以及每个状态的进程个数。如果zombie数目不为0,则应当检查下是哪个进程变成僵尸,及时进行清理,避免占用内存。

第三行显示的信息:显示CPU的整体负载情况。依次分别显示用户空间进程占用的CPU百分比(%us)、系统空间进程占用的CPU空间百分比(%sy)、调整进程Nice值所耗的CPU时间(%ni)、空闲的CPU百分比(%id)、等待I/O的CPU百分比(%wa)、硬中断所耗CPU(%hi)、软中断所耗CPU(%si)、被虚拟机偷走的时间(5ST)

tasks及cpu信息:可以使用t命令显示或关闭

最后两行显示内存信息:

m命令显示或关闭

top下半部分,显示每个进程占用的系统资源情况。依次为

PID:进程id

USER:进程发起者

PR:进程优先级

NI:进程Nice值

VIRT:进程占用的RSS和SWAP空间总和

RES:进程使用的非交换分区的物理内存

SHR:进程占用的共享内存空间大小

S:Stat,即进程的状态

%CPU:进程CPU占用百分比

%MEM:进程内存占用百分比

TIME+:进程占用的CPU时间总和

COMMAN:进程的命令

对显示的信息进行排序:

P:以占据的CPU百分比排序(默认)

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

T:以累计占用的cpu时间排序

退出命令:q

改变刷新时间间隔:s,默认为3秒

终止指定的进程:k

选项:

d #:指定刷新时间间隔、运行时长及平均负载

-b:以批次方式显示

-n #:显示多少批次

如何将top的信息保存至文本中

例:将top的信息显示2次,保存至文本中

top -b -n 2 > /tmp/top`date +%F-%T`.txt

5、htop命令:类似于top命令

选项:

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

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

-s colume:以指定字段进行排序

子命令:

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

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

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

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

F1:查看帮助

F2:设置htop

6、vmstat:

vmstat [options] [delay] [count]

procs:

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

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

memory:

swpd:交换内存使用总量

free:空闲的物理内存总量

buffer:用于buffer(缓冲)的内存总量

cache:用于cache(缓存)的内存总量

swap:

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

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

io

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

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

system:

in:interrupt,中断速率

cs:context switch,上下文切换的速率

cpu

us:user space

sy:system space

id:idle space

wa:wait time

st:stolen time

选项:

-s  显示内存统计数据

7、pmap命令:

报告进程的内存映射表

pmap [options] PID

-x|--extended:显示详细信息

另一种查看方式进程的内存映射表:cat /proc/PID/maps

8、glances命令:

需要通过epel源进行安装,支持c/s模式进行远程查看(可被监控系统代替)

常用选项:

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

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

-m:关闭mount模块

-n:关闭network模块

-t #:指定刷新时间间隔

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

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

-f /Path/to/someDIR:设定输出文件的目录(注意,不要指定文件名)

C/S模式下运行glances命令:

服务模式:

glances -s -B IPADDR(本机的某个IP地址,用于监听服务)

客户端模式:

glances -c IPADDR(指定远程服务器的地址)

9、dstat:使用前需要安装,在base源中

dstat是一个可以取代vmstat、iostat、netstat、ifstat的多功能程序,克服了这些命令的局限性,增加了监控项。可以灵活地监控系统运行状态并依此进程故障排除。

dstat能实时地查看所有系统资源,例如通过统计IDE控制器当前状态来比较磁盘利用率,或者直接通过网络带宽数值来比较磁盘的吞吐率。

9.1 dstat的默认输出:

默认输出显示的信息:

CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到"wait"一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在"waits"时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。

磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。

网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。

分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。

系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。

9.2指定监控时长和监控次数:

例:指定监控时长为2秒,共监控5次

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

常用选项:

-c|--cpu:显示cpu相关信息

-C #,#,#...,total:显示指定的哪颗cpu信息,或总的cpu信息

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

-D sda,sdb...,total:显示指定的磁盘的相关信息,或总的磁盘信息

-g:显示page in/out速率数据

-m:Memory相关的统计数据

-n:Interface相关的统计数据

例:每隔2秒统计网络信息,个统计5次

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

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

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

--tcp:显示常用的tcp统计数据

--udp:显示监听的udp统计数据

--raw

--socket:显示网络统计数据

例:

--ipc:message queue, semaphores, shared memory;查看报文队列,信号量,关系内存信息。

根据资源占用比显示进程

--top-cpu:指出CPU占用最大的进程

--top-io:指出正常I/O最大的进程

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

--disk-util:显示某一时间磁盘的忙碌状况

--freespace:显示当前磁盘空间使用率

--proc-count:显示正在运行的进程数量

--top-bio:指出块I/O最大的进程

例:

例:查看全部内存都有谁在占用

例:查看CPU资源损耗的数据

注:单独显示进程数时是以白色显示,若背景为白色则无法看清,调整背景即可

例:每隔2秒获取磁盘IO情况,共获取5次,并保存至文本中

四、进程管理

1、kill命令:用于向进程发送信号,以实现对进程的管理

kill -l [signal]:查看信号类别

常用信号:

1)SIGUP:无需关闭进程而让其重读配置文件。在生产环境中,重启服务的操作会终止业务,应被谨慎对待。

2)SIGINT:终止正在运行的进程,相当于ctrl + c

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

15)SIGTERM:终止运行中的后台进程

18)SIGCONT:让在后台中处于停止状态的进程在后台中继续进程,比如cp 大文件时。注:需要占用前台的进程无法通过此命令恢复运行,可使用fg命令

19)SIGSTOP:类似于对进程发送ctrl + z信号

每个信号的标识方法有三种:

1)、信号的数字表示

2)、信号的完整名称

3)、信号的简写名称

如何向进程发信号

kill [-s signal|-SIGNAL]  pid

例: kill掉ping 10.1.0.1这个进程

2、killall命令:根据进程名来杀死进程

killall [-SIGNAL] program

例:killall httpd

注意:会杀死所有httpd进程,若不期望kill所有,应使用kill

时间: 2024-12-27 18:00:13

进程管理详解的相关文章

Linux01-Linux进程管理详解44

一.进程    1.进程属性: a)进程状态 b)父子关系 c)优先级关系 0-139用户优先级,数字越小优先级越高: 0-99:内核调整的 100-139:用户可控制 nice值: -20-19 100-139 普通用户仅能够调大自己的进程的Nice值: 2.进程优先级 a)衡量面对不同的算法时,程序的性能如何,O标准(坐标轴表示): O(1) O(n) O(logn) O(n^2) O(2^n) b)每个进程的PID都是唯一的: init: 进程号为1 3.进程的分类: 跟终端相关的进程 跟

(转)Android进程管理详解

Android的原理-不需要太多的剩余内存 不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本

#21 在Linux里进程管理详解,与pstree、ps、pgrep、pkill、pidof、top命令的应用

进程管理: 所谓进程:process,一个活动的程序的实体的副本: 生命周期: 可能包含一个或多个执行流: 创建进程: 每个进程的组织结构是一致的: 内核在正常启动并且全面接管硬件资源之后,会创建一个init的进程:而这个名叫init的进程负责用户空间的进程管理: centos5及以前:sysV init,classic init 有缺陷:在启动系统时,init通过写脚本的方式来创建各个子进程:利用shell来实现,因此其执行速度非常慢:导致系统的启动速度和进程的创建速度都非常慢: centos

Android进程管理(详解)

Android的原理-不需要太多的剩余内存 不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道Java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本

进程管理之工作管理详解(job control)

进程管理之工作管理详解(job control) 1 什么是工作管理(job control) 我们知道linux是多任务多终端工作的操作系统.我们可以在多个终端进行工作,也可以在一个终端进行多个任务工作.那在一个终端同时进行多个工作任务,就称为工作管理.比如这种情况,在一个终端,你想要复制文件,同时你还想压缩打包文件,甚至你还想编辑文件,这个时候就要用到工作管理.工作管理的情况,大概是这样的.直接上图. 首先,你要明白前台,后台的概念.前台就是当前我们登陆shell操作的终端,我们与之交互,看

Yum软件包管理详解

目录 1. Yum 1.1 检查和更新包 1.1.1 查询更新 1.1.2 更新包 1.1.3 使用 ISO 和 Yum 离线升级系统 1.2 使用包 1.2.1 搜索包 1.2.2 列出包 1.2.3 显示包信息 1.2.4 安装包 删除包 1.3 查看事务记录 1.3.1 事务记录 1.3.2 检查事务 1.3.3 恢复和重复事务 1.4 配置yum和yum存储库 1.4.1 配置 /etc/yum.conf 文件 1.4.2 /etc/yum.conf 的[main]选项 1.4.3 /e

ASP.NET状态管理详解,让你明明白白

开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协议对ASP.NET应用程序发出请求,ASP.NET应用程序响应用户请求,向客户端发送请求的HTML代码,服务器并不会维护任何客户端状态.考虑一个有成千上万并发用户的服务器,如果为每一个用户都维护状态的话会耗费非常多的资源. 由于使用无状态的http协议作为web应用程序的通信协议,当客户端每次请求页

linux进程地址空间详解(转载)

linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示windows上的结果也一样). 我们还是利用前面看到过的这个图,如下图:32位X86机器的内存布局图,内存主要分为栈.堆.BSS段.数据段.代码段5个段.   代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存

linux进程标识符详解1

每个进程都有一个实际用户标识符和一个实际组标识符,它们永远是启动该进程之用户的用户标识符和组标识符. 进程的有效用户标识符和有效组标识符也许更重要些,它们被用来确定一个用户能否访问某个确定的文件.在通常情况下,它们与实际用户标识符和实际组标识符是一致的. 有几个系统调用可以用来得到进程的用户标识符和组标识符,详见下列程序: /* 取进程的实际用户标识符 */ uid=getuid(); /* 取进程的有效用户标识符 */ euid=geteuid(); /* 取进程的实际组标识符 */ gid=