进程:运行中的程序
程序:指令+数据组成
执行某个程序,将程序的指令加载到内存,CPU从内存中逐条执行指令,并处理数据输出至IO
程序实现并行的方式:
CPU:使用分时操作,随着时间的流逝,将CPU分割成时间片,给某个程序几毫秒的时间片,时间片耗尽,程序暂停,保存现场
然后给下个程序分配时间片
内存
有CPU的MMU功能将内存真实的空间化成多个页框,然后内核给程序虚拟出内存空间.每个程序认为自己是独立占用内存,程序的真实数据
有内核分配在物理内存的某个页框内,在物理内存中,同一个程序的页框可能不连续,由于程序看到的是虚拟内存空间,在虚拟内存空间,
程序的具体占用页框是连续的。
有内核根据进程的优先级,来分别执行程序
程序的虚拟内存空间
32位CPU的寻址单元 2的32次方 = 4G空间
1G是内核占用,剩下3G由程序使用
程序知道内核的存在,需要和内核之间交互,如执行某些敏感指令或特权指令时,有内核代替程序去CPU中执行,并且将相关结果反馈给程序,程序继续执行
进程分两类:
CPU密集型进程
IO密集型进程
进程分三类
批处理进程
实时进程
交互式进程
进程优先级
动态优先级:
优先级是由内核动态分配
静态优先级
100--139:数字越小优先级越小
通过进程的nice值来调整进程的优先级
-20,19 nice取值范围
100,139
实时优先级:
1-99:数字越大优先级越大
Linux 2.6之后的内核使用O(1)的调度方式
无论进程队列如果增长,都是一个长定值
如级别0到级别139,共有140个级别
每个级别会有好的进程,每次只需要
执行第一排的0到139,每次只执行140个进程
不管多少进程,选择进程的时间是恒定的
进程切换:上下文切换
保存现场:分配给某个进程时间片,时间片消耗完毕,进程没有执行结束,进程暂停,并保存进程的当时的状态,如打开了哪些文件,加载了哪些库等
恢复现场:将暂停的进程,有保存现场那一刻加载至CPU继续执行
抢占:一些特殊的进程,比较紧急,CPU会将正在执行的进程暂停,执行紧急的进程
IO交互:
轮询执行
中断执行
有CPU的中断控制器,连接所有IO设备,如网卡有请求过来,中断控制器就知道是网卡的数据报文过来,然后让内核来处理
中断的上半部:将中断先接进来,如果中断不是特别紧急,先将请求接近来,放在缓存中
中断的下半步:处理中断的过程
进程的状态:
Ready:进程已经准备完毕,等待加载至CPU执行
Running:运行态
Ready:时间片消耗完毕,但没有运行完,被切换出去
Sleeping:运行过程中,在等待I/O的过程中被切换出去
可中断睡眠:睡眠过程中可以唤醒,唤醒后继续执行
非可中断睡眠:睡眠过程中不可唤醒,进程在等待I/O处理等
stopped:停止状态:内核不会主动唤醒,有用户手动唤醒
Zombie:僵死态:子进程运行中,父进程结束,而子进程又无新的父进程,子进程就会变成非正常僵死状态
多线程:一个进程有多个执行流,让多个执行流同时执行.把指令分类,每一类是一个执行流,每一个执行流运行在一个CPU上
线程:一个进程可以分成多个执行单位,每一个执行单位可以在不同CPU上运行,这个执行单位就是进程的线程(进程的子单位,可以运行在不同的CPU上)
pstree:显示进程树
ps:显示系统当前的进程状态
STAT:进程状态
R:运行或可运行
T:停止
Z:僵死
+:前台进程
N:低优先级进程
<:高优先级进程
ps -aux
user:进程的属主
PID:进程的ID号
%cpu:CPU运行以来,进程占用的百分比
%MEM:进程所占用内存的百分比
VSZ:虚拟内存空间大小(线性地址空间),单位是KB
RSS:进程占用固定内存(不可被交互至交互分区)的内存空间(KB)
TTY:进程在那个终端上运行,如何终端无关显示?
START:进程的启动时间
TIME:该进程使用CPU的运行时间
COMMAND:命令的名称
ps -ef
UID:进程是属主
PID:进程的ID号
PPID:进程的父进程号
STIME:启动时间
TTY:相关终端
TIME:进程运行时间
CMD:哪个命令启动的进程
-F:显示额外信息
-H:显示进程层次关系
-o 要显示的字段:自定义显示格式
ps axo pid,command
top:动态显示进程
第一行(CPU相关):系统时间,运行时长,当前登录的用户数,cpu的平均队列长度(1分钟平均,5分钟平均,15分钟平均)
top命令中load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。系统平均负载表示
系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。
如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用’wait’)
- 没有被停止(例如:等待终止)
Update:在Linux中,进程分为三种状态,一种是阻塞的进程blocked process,一种是可运行的进程runnable process,另外就是正在运行的进程running process。当进程阻塞时,进程会等待I/O设备的数据或者系统调用。
进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行running one和准备好运行runnable one的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5。load average就是一定时间内的load平均数量。
例如:
# uptime 7:51pm up 2 days, 5:43, 2 users, load average: 8.13, 5.90, 4.94
命令输出的最后内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对于上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。
在Linux系统中,uptime、w、top等命令都会有系统平均负载load average的输出
第二行:进程数,运行状态,睡眠状态,停止状态,僵死状态
第三行(所有CPU的平均利用率,键盘1显示所有CPU平均值):用户空间占用比例,系统空间占用比例,调整nice值所占用的百分比,CPU空闲比例,等待IO完成所占用的比例,
硬件中断所占据的百分比,软中断占据的百分比,被虚拟机占用的百分比
PID:用户的进程号
USER:进程属主
PR:优先级
NI:nice值
VIRT:虚拟内存集(进程的虚拟内存空间大小)
RES:实际内存集(进程实际占用物理内存空间)
SHR:共享内存集(进程共享内存占用空间)
%CPU:从上次更新,到现在进程占用CPU的百分比
%MEM:进程占据物理内存的百分比
TIME+:进程使用CPU时间总计(单位:百分之1秒)
COMMAND:由哪个命令启动的这个进程
-----------------------------------------------------------------------
M键:根据内存占用大小排序
P键:按CPU时间占用大小排序
T键:根据累计时间排序
k:杀死一个进程
k 进程号
选项
-d 数字:刷新延迟
-b :批次显示
-n 数字:指定批次显示的次数
-------------------------------------------------------------
htop:进化版top,用法和top类似
iotop:I/O统计工具
vmstat: 3 5
procs
b:被阻塞(通常等待IO完成)的进程队列长度
memory
swpd:从物理内存交换至交换分区的内存数据量
free:未使用的物理内存空间
buff:buffer cache的空间大小:通常用来缓存写操作的相关数据
cache:page cache的空间大小:通常来缓存读操作的相关数据
swap
si:swap in:数据从物理内存调入交换分区的数据量
so:swap out:数据从交换分区调入物理内存的数据量
io
bi:block in :从块设备读入的数据量(kb/s)
bo:block out :保存在块设备的数据量(kb/s)
systenm
in:interruput;中断发生速率,通常意为每秒多少次中断请求发送;
cs:通常意为每秒多少次上下文切换
cpu
us:用户进程所占用CPU时间的百分比
sy: 内核所占用CPU时间的百分比
id:CPU空闲百分比
wa:CPU用户等待IO完成的时间的百分比
st:被虚拟化占用的CPU时间百分比
sar
tsar:淘宝开源sar工具
dstat 更直观的显示
---------------------------------------------------------------
进程间通信:IPC
共享内存:SHM
信号:signal
kill -l 查看信号
1:SIGHUP:让进程不用中止,而重读其配置文件
2:SIGINT:中断正在运行的进程,相当于CTRL+C
9:SIGKILL:杀死一个进程
15:SIGTERM:终止一个进程
kill -信号 PID
killall -信号 进程名
调整进程的nice值
普通用户;调大数字,降低优先级
-20 19
100 139
nice -n 数字值 命令
nice -n -20 top
renice 数字值 PID
renice 0 PID
Linux作业控制
前台:进程占据着终端:前台作业
后台:进程无需占用终端:后台作业
jobs:查看后台正在运行的作业
前台---->后台 :Ctrl+z
后台----前台:fg 作业号
bg 作业号:让进程在后台继续运行
进程启动时直接运行在后台
命令 &
终止作业
kill %作业号
终端退出后,后台进程扔然可运行
nohup 命令 &
cat /proc/PID/maps
pmap PID:查看进程运行的物理地址空间映射