Linux进程及作业管理

进程和作业的概念

进程和作业的概念也有区别。
一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1 | grep kill |more”这个作业就同时启动了三个进程。

作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意的挂起进程或重新启动进程。作业控制是好多shell(包括bash和tcsh)的一个特性,使用户在多个独立作业间进行切换。

一般而言,进程与作业控制相关联时,才被称为作业。

在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令。但是使用作业控制,用户可以同时运行多个作业,并在需要时在这些作业间进行切换。这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其它事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其它的事情,其它事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就像用户从来没有离开编辑器一样,这只是一个例子,作业控制还有许多其它实际的用途。

进程的一个比较正义的定义是:在自身的虚拟地址空间运行的一个单独的程序。

Linux 操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。
交互进程(前台进程)—与终端相关,由一个shell终端启动的进程。交互进程既可以在前台运行,也可以在后台运行
批处理进程—这种进程和终端没有关系,是一个进程序列
监控进程(守护进程)—Linux系统启动时启动的进程,并在后台运行。

内核

内核的功用:进程管理、内存管理、网络功能、驱动程序和安全功能。
Linux内核存储进程信息的固定格式为task struct,多个任务的task struct组成的链表为task list。
/proc/目录存放内核中的状态信息。可设置内核参数的值从而调整内核运行特性的参数,内核参数存放于/proc/sys/目录下,状态变量用于输出内核中的统计信息和状态信息,仅用于查看信息。
进程文件存放于/proc/#文件中,#是PID编号

进程

(1)进程创建过程
init进程是初始化进程,第一个进程,负责一切用户空间管理的进程。init有kernel创建,除了init之外,每一个进程都由父进程创建,用命令fork(),clone()等。
(2)进程优先级
0-139:共140个优先级,其中1-99的优先级为实时优先级,数字越大,优先级越高,100-139的优先级为静态优先级,数字越小,优先级越高。
(3)Nice值
Nice值为 -20-19,对应优先级100-139,-20对应100,19对应139,可以通过调整Nice值来改变优先级,普通用户只可以向Nice值高的方向调整,即向进程优先级大(低)的方向调整,管理员不受限制。
(4)进程类型
Linux内核是抢占式多任务的内核。因此进程类型可分为守护进程和前台进程。
守护进程(daemon):在系统引导过程中启动的进程,是与终端无关的进程。
前台进程:与终端相关,通过终端启动的进程,也可把在前台启动的进程送往后台,以守护模式运行,例如service命令启动进程就可以以后台的方式运行。
(5)进程状态
运行态(running)
就绪态(ready)
睡眠态分为两种:可中断睡眠态(interruptable)和不可中断睡眠态(UNinterruptable)
停止态(stopped):暂停于内存中,但不会被调度,除非手动启动之
僵死态(zombie)
(6)进程的分类
CPU-Bound(计算密集型):CPU密集型,优化性能需要分配CPU时间多些
IO-Bound:IO密集型,优化性能需要分配优先级高些

概念:
关于IO-Bound和CPU-Bound,是计算机在处理某个任务的时候,主要时间花在什么地方,就是被什么所“束缚”。比如主要时间消耗在CPU计算上,也就是说处理该任务大部分时间都在等待CPU的计算而不是等待读写(磁盘 / 内存)数据,那么就是CPU-Bound,称之为CPU密集型。反过来如果主要时间消耗在等待读写数据而CPU利用率很低,那么该任务就是IO-Bound,IO密集型。

IO密集型:指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU loading 100%,CPU要读/写 I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU loading 很高。在多重程序系统中,大部分时间用来做计算、逻辑判断等CPU动作的程序。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部分时间用在三角函数和开根号的计算,便是属于CPU-Bound程序。

CPU密集型 VS IO密集型
CPU密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效的利用CPU,计算密集型任务的数量应当等于CPU的核心数。
计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。

总之,计算密集型程序适合C语言多线程,IO密集型适合脚本语言开发的多线程。

举例:
假设有一道数学题,题干只有一行字,但是需要运用各种各样的数学方法、方程、定力、甚至作图才能解答,即使最牛逼的数学家也得需要1个月才能解出来,这样的“数学题”就是CPU-Bound。阅读题干的时间只有短短几秒,然后理解它并且解答它的时间是阅读的几百万倍,这种题目从列出到被解答完的时间大部分都消耗在这个数学家用的大脑(CPU)解题上。也可以说数学家的大脑是几乎无时无刻不在工作的(CPU利用率几乎100%)

反过来说
假设有一道数学题,题干有史记那么厚,读完就要2个月,然而最后的问题只是让你回答1+1=?,那么这种题就是IO-Bound。从列出到被解答完毕的时间大部分都消耗在阅读题干(IO操作)上,数学家一直在读写,而思维处于停滞状态(CPU IDLE状态)。

然而现状是计算机在硬盘甚至内存的存取速度上都比CPU的计算速度慢的多的多,可以理解为这个数学家虽然思维极度敏捷,但是老花眼,此时再碰上史记那么长的题干,简直爆炸,无法想象。
那么如何克服这种现状呢,首先,想方设法提高IO读写速度,类似SSD的出现,但是相比于CPU的计算速度,仍然差之千里,而且费用昂贵;其次,在CPU等待IO读写的时候,可以让它去计算些别的问题,主要它不闲着,也算没浪费时间。

(7)启动进程的方式
系统启动过程中自动启动的进程是与终端无关的进程
用户通过终端启动的进程是与终端相关的进程。

进程管理命令

pstree命令

功用:该命令用于显示进程的树状结构

ps命令

功用:该命令用于显示当前运行进程的快照
使用格式:ps [options…]
ps命令选项有三种风格:
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.

选项:
a:所有与终端相关的进程
u:以用户为中心组织进程状态信息显示
x:所有与终端无关的进程
常用组合:
ax:显示系统中所有进程
ps ax命令显示结果:带[ ]的为内核线程
pstree命令显示结果:大多为进程

常用组合之一:aux
VSZ:虚拟内存集,即占用的虚拟内存大小,即进程在虚拟内存空间中真正用来存储数据的大小
RSS:Resident Size,常驻内存集,坚决不能放在交换内存的内容被(什么是常驻内存集?就是不能放在交换内存上的被称为常驻内存集)
STAT:当前进程的运行状态
R:running
S:interruptable sleeping
D:UNinterruptable sleeping
T:stopped
Z:zombie
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader 会话领导者,如shell进程

-e:显示所有进程,相当于ax
-f:显示完整格式的进程信息
常用组合之二:-ef

-F:显示完整格式的进程信息;比 -f 更加完整的信息
C:cpu utilization(CPU使用率)
PSR:运行于哪颗CPU之上

-H:以层级结构显示进程的相关信息
常用组合之三:-eFH

常用组合之四:-eo,axo
-o field1,field2,… :自定义要显示的字段列表,并以逗号分隔开
常用的field:pid、ni、pri、pcpu、stat、comm、tty、ppid、rtprio
ni:nice值
priority:priority,优先级
rtprio:real time priority,实时优先级
pcpu:CPU利用率
comm:由哪个程序启动的

pgrep/pkill命令

格式:pgrep [options] pattern
选项:
-u uid:effective user;显示进程以什么用户的身份运行,可以切换
-U uid:read user;显示该用户启动的进程,显示指定用户的进程
-t TERMINAL:与指定的终端相关的进程
-l:显示进程名
-a:显示完整格式的进程名;包括进程ID、进程名、参数列表
-P pid:显示此进程的子进程;

pidof命令

功用:根据进程名,取其pid
格式:pidof process_name

top命令

功用:display Linux process;该命令用于动态显示Linux进程
排序方式:
P:以占据CPU百分比排序
M:以占据内存百分比排序
T:累计占用CPU时间排序
N:以PID的大小排序

首部信息:
uptime:l命令可以关掉或显示
tasks信息:t命令
内存信息:m命令

选项:
-d #:指定刷新时间间隔,默认为3秒
-b:以批次方式显示
-n #:显示多少批次

uptime命令

功用:显示系统时间、运行时长及平均负载
过去1分钟、5分钟和15分钟的平均负载
平均负载是:等待运行的进程队列的长度

htop命令:同top

选项:
-b #:指定延迟时间间隔
-u username:仅显示指定用户的进程
-s COLUME:以指定字段进行排序

子命令:
l:显示选定的进程打开的文件列表
s:跟踪选定的进程的系统调用
t:以层级关系显示各进程状态
a:将选定的进程绑定至某指定的CPU核心

vmstat命令

功用:Report virtual memory statistics(报告虚拟内存统计数据)
用法:vmstat [options] [delay [count]]

对参数作说明:

procs:
	r:等待运行的进程的个数;CPU上等待运行的任务的队列长度
	b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度

memory:
	swap:交换内存使用总量
	free:空闲的物理内存总量
	buffer:用于buffer的内存总量;buffer为缓冲
	cache:用于cache的内存总量;cache为缓存

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

io:
	bi:从块设备读入数据到系统的速度(kb/s)
	bo:保存数据至块设备的速率(kb/s)

system:	
	in:interrupts,中断速率
	cs:context switch,上下文切换的速率

cpu:
	us:用户空间;user space
	sy:system;系统空间
	id:idle;空闲的
	wa:wait;等待IO完成的
	st:stolen;被虚拟化所偷走的时间

pmap命令

功用:report memory map of a process(报告进程的内存映射)
格式:pmap [options] pid…
选项:
-x:显示详细格式的想你想

另一种查看方式:cat /proc/PID/maps

glances命令

功用:A cross-platform curses-based monitoring tool(一个跨平台的基于光标的监控工具,是bash shell内建命令)
常用选项:
-b:以byte为单位显示网络数据速率
-d:关闭磁盘IO模块
-m:关闭mount模块
-n:关闭network模块
-t #:刷新时间间隔
-1(数字1):每个CPU的相关数据单独显示
-o {html | csv}:输出格式
-f /PATH/TO/SOMEDIR/:设定输出文件的位置;只需指到文件所在目录

C/S模式下运行glances命令:
服务模式:glances -s -B IPADDR
IPADDR:本机的某地址,用于监听

客户端模式:glances -c IPADDR
IPADDR:为远程服务器的地址

dstat命令

功用:versatile tool for generating system resource statistics该命令是一个精巧的系统资源统计工具
格式:dstat [-afv] [options…] [delay [count]]
常用选项:
-c,–cpu:仅显示CPU先关的信息
-C #,#,…,total
-d,–disk:显示磁盘的先关信息
-D sda,dsb,…,tobal
-g:显示page相关的速率数据,page是内存当中从磁盘加载数据到内存汇总。从内存写到磁盘中
-m:memory的相关统计数据
-n:interface的相关统计数据
-p:显示process的相关统计数据
-r:显示IO请求相关的相关的统计数据
-s:显示swapped的相关统计数据
–tcp:
–top-cpu:显示最占用CPU的进程
–top-IO:最占用IO的进程
–top-mem:最占用内存的进程
–top-lantency:延迟最大的进程

kill命令

功用:该命令用于向进程发送信号,以实现对进程管理的功能。
显示当前系统的可用信号:kill -l [signal]
每个信号的标识方法有三种:
1)信号的数字标识
2)信号的完整名称
3)信号的简写名称

向进程发信号:
kill [-s signal | SIGNAL] pid…

常用信号:
1)SIGHUP:无需关闭进程而让其重读配置文件
2)SIGINT:终止正在运行的进程;相当于Ctrl+c
9)SIGKILL:杀死运行中的进程
15)SIGTERM:终止正在运行中的进程
18)SIGCONT:继续;kill -18 49266 将停止的进程继续运行,可以是在后台
19)SIGSTOP:停止,将进程送入后台运行;相当于Ctrl+z

killall命令

功用:该命令用于通过进程名杀死进程
格式:killall [-SIGNAL] program
示例:killall httpd

nice命令

功用:调整进程优先级
可通过nice值调整的优先级范围:100-139,分别对应:-20-19
进程启动时,其nice值默认为0,其优先级是120,仅管理员可调低nice值
nice命令:以指定的nice值启动并运行命令
# nice [option] [command [argu]…]
选项:
-n NICE

renice命令:调整运行中的指定进程的NICE值
# renice [-n] NICE PID…
查看nice值和优先级命令:ps axo pid,ni,priority,comm

作业管理

(1)作业
前台作业(foreground):通过终端启动,且启动后会一直占据终端
后台作业(background):可以通过终端启动,但启动后即转入后台运行(释放终端)
(2)如何让作业运行于后台?
1)运行中的作业,Ctrl+z可送往后台
注意:送往后台后,作业会转为停止态
2)尚未启动的作业,# command &,可在运行时在后台运行
注意:此类作业虽然被送往后台,但其依然与终端相关,如果终端进程终止,与终端相关的进程也会终止,如果希望把送往后台的作业剥离与终端的关系,则把作业转为与终端无关的方式:# nohup COMMAND &

(1)查看所有的作业
# jobs
(2)可实现作业控制的常用命令
# fg [[%] JOB_NUM]:把指定的作业调回前台
# bg [[%] JOB_NUM]:让送往后台的作业在后台继续运行
# kill %JOB_NUM:终止指定的作业;作业加%,进程不加%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值