1、进程类型
交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
批处理进程——这种进程和终端没有联系,是一个进程序列。
监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。
注意:也可把在前台启动的进程送往后台,以守护模式运行
2、进程状态
在内存中运行的进程也有着各种各样的状态
运行态R:running
就绪态:ready
睡眠态
可中断S:interruptable
不可中断D:uninterruptable
停止态T:stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态Z:zombie,结束进程,父进程结束前,子进程不关闭
3、进程调度
调度策略:调度策略就是这样一组规则:决定什么时候以怎样的方式选择一个新进程运行。所以定义一个进程的优先级来满足这样一种策略。这个策略以0-139的优先级来表示。
实时优先级:1-99
无需调整,数字越大,优先级越高
静态优先级:100-139
优先级以Nice值调整
Nice:-20—-19 ,存在于task_struct结构体中
公式如下:
pri(new)=nice+pri(old)
调度算法:早起的Linux中,调度算法是根据进程的优先级选择“最佳”进程来执行,它的缺点是时间开销与“可运行进程数量”有关。某种调度算法一定满足一种函数关系,业界称为Big O
Big O:时间复杂度,用时和规模的关系。有:
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。
作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。
作业控制
作业控制,指控制当前正在运行的进程的行为,也称为进程控制。是Shell的一个特性,使用户能在多个独立进程间进行切换。
常用命令
命令或快捷键 功能说明
cmd& 该命令在后台运行
Ctrl+d 终止一个正在前台运行的进程(含有正常含义)
Ctrl+c 终止一个正在前台运行的进程(含有强行含义)
Ctrl+z 挂起一个正在前台运行的进程
jobs 显示后台作业和被挂起的进程
bg 重新启动一个挂起的作业,并在后台运行
fg 把一个在后台运行的作业放到前台运行
常用的作业标识符
标识符 说明
%N 第N号作业
%S 以字符串S开头的被命令行调用的作业
%?S 包含字符串S的被命令行调用的作业
%+ 默认作业(前台最后结束的作业,或后台最后启动的作业),等同于%%
%- 第二默认作业
直接将命令放到后台“执行”的&
在bash的环境下,
前台指:你可以控制的作业
后台指:在内存可以自行运行的作业,你无法直接控制它,除非以bg/fg等命令将该作业调用出来。
范例:
[root@redflag ~]# tar –zpcf /tmp/etc.tar.gz /etc & [1] 24874 <== [job number] PID [root@redflag ~]# <==可以继续工作,不受影响。 这里job1在后台继续工作,你可在前台继续操作linux。过了一会,会突然出现这个数据: [1] + Done tar –zpcf /tmp/etc.tar.gz /etc #这是表示[1]作业已经完成 该命令最大的好处就是不怕被“[Ctrl]+c”这个中断指令来中断了 这里就会出现一个问题,如果上面的命令是 [root@redflag ~]# tar –zpcvf /tmp/etc.tar.gz /etc & |
这时在后台执行的命令,如果有stdout和stderr时,它的数据是输出到屏幕上,所以我们无法看到提示符,也就无法完好地控制前台作业。所以,最好是使用数据流重导向,将输出数据传至某个文件中。我们可以这样做:
[root@redflag ~]# tar –zpcvf /tmp/etc.tar.gz /etc > tpm/log.txt 2>&1 &
将“当前”作业放到后台“暂停”:[crtl]+Z
如果你正在进行vi,但你想查找某个文件,需要到bash环境搜索。此时你可以暂时离开vi
[root@redflag ~]# vi ~/.bashrc # 在vi 的一般模式下,按ctrl+z [1]+ Stopped /usr/bin/vim ~/.bashrc #(+)表示当前在后台下默认的作业 [root@redflag ~]# <== 获取了前台的控制权 |
[root@redflag ~]# jobs [-lrs]
参数:
-l:除了列出作业号之外,同时列出PID
-r:仅列出正在后台运行的作业
-s:仅列出正在后台暂停的作业
将后台作业拿到前台处理,fg[root@redflag ~]# fg %jobnumber
范例:
[root@redflag ~]# jobs [1]+ 24988 Stopped /usr/bin/vim ~/.bashrc [2]- 25006 Stopped /usr/bin/vim ~/.bash_history [root@redflag ~]# fg <==默认取出+的作业,即[1] [root@redflag ~]# fg %2 <==直接规定取出的作业号码 |
之前都是将作业放到后台去“暂停”,而bg实现一个作业在后台运行。
[root@redflag ~]# find / -perm +7000 #此时,请立刻按ctrl+z暂停 [1]+ stopped find / -perm +7000 [root@redflag ~]# [root@redflag ~]# jobs ; bg %1 ; jobs [1]+ Stopped find / -perm + 7000 [1]+ find / -perm +7000 & [1]+ Running find / -perm +7000 & |
注意:1-5操作过程中“%jobnumber”可以将“%”省略直接加jobnumber即可。
管理后台作业:kill[root@redflag ~]# kill –signal %jobnumber
[root@redflag ~]# kill –l
参数:
-l:列出当前kill能够使用的信号(注意是小写L)
-1:重新读取一次参数的设置文件(类似reload) ---对应的信号为SIGHUP
-2:表示与由键盘输入ctrl+c同样的动作 ---对应的信号为SIGINT
-9:立刻强制删除一个作业 ---对应的信号为SIGKILL
-15:以正常方式终止一项作业 ---对应的信号为SIGTERM
[root@redflag ~]# jobs [1]+ Stopped vim bashrc [root@redflag ~]# kill -9 %1 #以强制方式删除 [1]+ 已删除 vim bashrc [root@redflag ~]# kill –SIGTERM %1 #-SIGTERM与15是一样的 |
注意:kill可以帮我们将信号传送给某个作业(%jobnumber)或者是某个PID(直接输入数字),也就是说,kill后面直接加数字与加上%的情况是不同的。
vmstat -s: 内存的汇总信息
procs | 项目 |
r | 等待运行的进程的个数,和核心数有关 |
b | 处于不可中断睡眠态的进程个数(被阻塞的队列的长度) |
swap | 项目 |
si | 从磁盘交换进内存的数据速率(kb/s) |
so | 从内存交换至磁盘的数据速率(kb/s) |
io | 项目 |
bi | 从块设备读入数据到内存的速率(kb/s) 读 |
bo | 从内存写入磁盘的速率(kb/s) 写 |
memory | 项目 |
swad | 交换内存的使用总量 |
free | 空闲物理内存总量 |
buffer | 用于buffer的内存总量 |
cache | 用于cache的内存总量 |
system | 项目 |
in: interrupts | 中断速率 |
cs: context switch | 进程切换速率 |
cpu | 项目 |
us | 用户空间占用的比例 |
sy | 内核空间占用的比例 |
id | 空闲空间占用的比例 |
wa | 等待IO完成所消耗的时间比例 |
st | 被虚拟化技术偷走的时间比例 |
htop:
f1帮助
f2切换CPU、mem、swap显示方式
f10退出
常用选项:
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程;
-s COLOMN: 以指定字段进行排序;
命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定CPU核心;
t: 显示进程树
top:
Tasks
total | 进程总数 |
running | 运行进程数 |
sleeping | 休眠态进程数 |
stopped | 停止态进程数 |
zobie | 僵死态进程数 |
%Cpu(s)
us(user space) | 用户空间占用CPU百分比 |
sy(system) | 内核空间占用CPU百分比 注:高负载时:us:sy=7:3 |
ni(nice) | 修改nice值占用的CPU百分比 |
id(idle) | 空闲的CPU百分比 |
wa(wait) | 等待IO完成占用的CPU百分比 |
hi(hardware interrupt) | 硬中断占用CPU百分比 |
si(software interrupt) | 软中断占用CPU百分比 |
st(stole) | 被偷走的CPU,比如VMware |
buffer(缓冲) | 元数据 |
cache(缓存) | 数据 |
PID | 进程号 |
USER | 进程发起者 |
PR(priority) | 优先级 |
NI(Nice) | nice值 |
VIRT | 虚拟内存集 |
RES | 常驻内存集 |
SHR | 共享内存集 |
S(status) | 状态 |
%CPU | CPU占用比 |
%MEM | 内存占用比 |
TIME+ | 运行时长 |
COMMAND | 启动进程 |
对显示排序的方法:
P | 占据的CPU百分比 |
M | 占据内存百分比 |
T | 累积占据CPU时长 |
首部信息显示:
l | uptime信息 |
t | tasks及cpu信息 |
#数字 | cpu分别显示 |
m | memory信息 |
s | 修改刷新时间间隔 |
Esc | 退出 |
k | 终止指定进程 |
W | 保存文件 |
q | 退出命令 |
进程管理命令之ps
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中;
ps [OPTION]…
选项:支持两种风格
常用组合:aux
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程;
x: 与终端无关的进程;
~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT TART TIME COMMAND
USER | 运行进程的用户 |
PID | 进程ID |
%CPU | 占用CPU |
%MEM | 占用内存 |
VSZ | 虚拟内存集 |
RSS | 实际内存集 |
TTY | 终端信息 |
STAT | 进程状态 |
START | 进程状态 |
TIME | 运行时间 |
COMMAND | 进程名称 |
常用组合:-ef
–e: 显示所有进程
-f: 显示完整格式程序信息
常用组合:-eFH
-F: 显示完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
STAT列的标志
S 睡眠。通常是在等待某个事件的发生,如一个信号或有输入可用
R 运行。 严格来说,应是“可运行”,即在运行队列中,处于正在执行或即将运行状态
D 不可中断的睡眠(等待)。通常是在等待输入或输出完成
T (terminate)停止。通常是被shell作业控制所停止,或者进程正处于调试器的控制之下
Z (zombie)僵尸进程,通常是该进程已经死亡,但父进程没有调用wait类函数来释放该进程的资源
N (nice)低优先级任务
s 进程是会话期首进程
+ 进程属于前台进程组
l 进程是多线程的
< 高优先级任务