目录
一、程序和进程的关系
1.程序
(1)保存在硬盘、光盘等个质中的可执行代码和数据
(2)文件中静态保存的代码
2.进程
(1)在CPU及内存中运行的程序代码
(2)动态执行的代码
(3)父、子进程
(4)每个程序可以创建一个或多个进程
二、进程与计划任务管理
1.进程
操作系统最核心的部分就是进程。进程就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。
进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码
2.程序代码的一个或多个执行线程:
(1)进程状态
1)程序:二进制文件,静态/bin/date, /usr/sbin/sshd
2)进程:是程序运行的过程,动态,有生命周期及运行状态。
(2)程序、进程理论
线程背包含在进程之中,是进程中的实际运作单位,也是操作系统中能够独立运行的基本单位,也称作轻量进程,一个进程中可以并发多个线程,每条线程可以并行执行不同的任务,在任务管理器中看到的一个个进程则是由下载的的应用程序所产生的,一个应用程序也可以包含多个进程。
公司(程序) → 部门(进程)→员工(线程)→项目任务( 我们执行一个小项目)
打开应用程序后,在后台运行了相应的进程,点击了应用程序中的某个功能之后由对应进程中的线程,负责次功能的运行,不用运行整个应用程序或者是进程,完成操作者的命令,节约了资源利用率,也增强了cpu的吞吐率。单核单线程的cpu可运行多个包含多线程的应用程序。
三、线程的三种状态
1.就绪:在创建线程后存在等待cpu过来的执行的时间称为就绪状态。
2.运行:当cpu执行时就会转变成运行状态,而当cpu去执行别的线程时就会变回就绪状态
3.阻塞:如果线程正在运行中而又发生了需要向硬盘发送访问请求等一系列需要耗时输入输出的操作时线程就会进入阻塞状态,cpu就会转而执行其他线程,等到耗时操作结束后,之前阻塞状态的线程就会又变成就绪状态,而单核单线程cpu一次只能执行一个线程,需要对每个线程轮流执行操作。
每单个计算的时间称为cpu的时间片,实际时间只有几十毫秒非常短的,因此就算是单核、单线程cpu也可利用自身速度去完成。
多线程应用程序所发布的任务,理论上也是可以运行多线程,不过程序没有单核、单线程cpu,所以不能从实践中得出结论。
“协程”:利用了线程等待的这个时间可以做别的事情了(协程切换任务源很小,效率高)。
”回调、:一个任务:多条线程同时执行。
四、线程状态
1.新建(NEW):新创建了一个线程对象。
2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start(就绪)方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
3.运行(RUNNING): 可运行状态(runnable)的线程获得了cpu时间片(timeslice) ,执行程序代码。
4.阻塞(BLOCKED):,阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice转到运行(running)状态。
5.阻塞的情况分三种:
(1)等待阻塞:运行(running)的线程执行wait(等待)方法,JVM会把该线程放入等待队列(waiting queue)中。
(2)同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(l(小写L)ock pool)中。
(3)其他阻塞:运行(running)的线程执行Thread.sl(小写L)eep (l(小写L)ongms)或t.join(加入)方法,或者发出了I(大写i)/O请求时,JVM会把该线程置为阻塞状态。当sl(小写L)eep (睡眠)状态超时、join(加入)等待线程终止或者超时或者I/0处理完毕时,线程重新转入可运行(runnable)状态。
5.死亡(DEAD): 线程run(运行)、main(主线程)方法执行结束,或者因异常退出了run(运行)方法,则该线程结束生命周期。死亡的线程不可再次复生。
与top命令结合
分别记录了一分钟、五分钟、以及十五分钟的系统平均负载。
对Linux的负载均值(load averages)要充分了解。负载均值在 uptime或者 top命令中可以看到,可能会显示成这样:load average: 0.09,0.05,0.01
1.load average的含义
平均负载(Ioad average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数。
2.top命令
load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。系统平均负载表示系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
(1)没有在等待I/O操作的结果
(2)没有主动进入等待状态(也就是没有调用’wait'’)
(3)没有被停止(例如:等待终止)
0.00-1.00之间的数字表示此时路况非常良好,没有拥堵,车辆可以毫无阻碍地通过。
1.00表示道路还算正常,但有可能会恶化并造成拥堵。此时系统已经没有多余的资源了,管理员需要进行优化。
1.00及以上表示路况不太好了,如果到达2.00表示有桥上车辆一倍数目的车辆正在等待。这种情况你必须进行检查了。
多核CPU-多车道情况如下:
多核CPU的话,满负荷状态的数字为"1.00*CPU核数",即双核CPU为2.00,四核CPU为4.00。
top命令
第1行“top - 19:56:47 up 39 min, 3 users, load average: 0.00, 0.00, 0.00”显示的内容依次为“系统当前时间 、系统到目前为止已运行的时间、当前登录系统的用户数量、系统负载(任务队列的平均长度)三个值分别为1分钟、5分钟、15分钟前到现在的平均值【这三个一般会小于1,如果持续高于5,请仔细查看那个程序影响系统的运行】”
第2行“Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie”显示的内容依次“所有启动的进程数”、“正在运行的进程数”、“挂起的进程数”、“停止的进程数”、“僵尸进程数”。
第3行“Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st”显示的内容依次为“用户空间占用CPU百分比”、“内核空间占用CPU百分比”、“用户空间内改变过优先级的进程占用CPU百分比”、“空闲CPU百分比”、“等待输入输出CPU时间百分比”、“CPU服务于硬件中断所耗费的时间总额”、“CPU服务软中断所耗费的时间总额”、“Steal Time”
第4行“Mem: 508820k total, 480172k used, 28648k free, 41944k buffers”显示内容依次为“物理内存总量”、“已使用的物理内存”、“空闲物理内存”、“内核缓存内存量”。
第5行“Swap: 392184k total, 0k used, 392184k free, 259152k cached”显示内容依次为“交换区总量”、“已使用交互区总量”、“空闲交换区总量”、“缓冲的交换区总量”。
第6行“PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ”显示内容依次为“进程ID”、“进程所有者”、“优先级”、“nice值,负值表示高优先级,正值表示低优先级”、“进程使用的虚拟内存总量”、“进程使用的、未被换出的物理内存大小”、“共享内存大小”、“进程状态”、“上次更新到现在的CPU时间占用百分比”、“进程使用的物理内存百分比”、“进程使用CPU总时间”、“命令名、命令行”。
五、ps命令查看静态的进程统计信息
1.常用的参数
-a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x"选项结合时将显示系统中所有的进程信息。
-u:使用以用户为主的格式输出进程信息。
-x:显示当前用户在所有终端下的进程信息。
2.常用的选项组合
ps - aux 将以简单列表的形式显示出进程信息
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下:
USER:启动该进程的用户账号的名称。
PI(大写i)D:该进程在系统中的数字ID号,在当前系统中是唯一的。
%CPU: CPU 占用的百分比。
%MEM:内存占用的百分比。
VSZ:该进程使用的虚拟内存量(KB)。
RSS:该进程占用的物理内存量(KB)。
TTY:表明该进程在哪个终端上运行。不是从终端启动的进程则显示为?。
简说: pts 是远程登录终端ctrl+ALT F1-F6 tty1图像界面 2和6字符界面 ? 系统本身自身执行的进程
STAT:该进程的状态(D:不可中断的休眠状态:R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态: Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)
D:系统守护进程
T:调式、程序执行一般停止
R:该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中(idle状态 ),但可被某些讯号(signal) 唤醒。
T:该程序目前正在侦测或者是停止;
Z :该程序应该已经终止,但是其父程序却无法正常的终止它,造成zombie (疆尸)程序的状态D 不可中断状态.
含义如下:
<:表示进程运行在高优先级上
N:表示进程运行在低优先级上
L:表示进程有页面锁定在内存中
s:表示进程是控制进程
l(小写L):表示进程是多线程的
+:表示当前进程运行在前台
D:系统守护进程
T调式、程序执行一般停止
D[aemon]:守护进程
R[unning]:正在运行
S[leep]:睡眠状态
Z[ombie] :僵状态
优先级:
<:高优先级
N:低优先级
+:前台进程
l(小写L):该进程是多线程的
START:启动该进程的时间。
TIME:该进程占用的CPU时间。
COMMAND:启动该进程的命令的名称
六、jobs查看后台进程任务
ps -elf 将以长格式显示系统中的进程信息
-e:显示系统内的所有进程信息。
-l(小写L):使用长格式显示进程信息。
-f:使用完整的格式显示进程信息。.
各列的解释:
F:内核分配给进程的系统标记。
S:进程的状态。
UI(大写i)D:启动这些进程的用户。
PI(大写i)D: 进程的进程ID.
PPI(大写i)D:父进程的进程号(如果该进程是由另一个进程启动的)
C:进程生命周期中的CPU利用率。
PRI(大写i):进程的优先级(越大的数字代表越低的优先级)。
NI(大写i):谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
WCHAN:若该进程在唾眠,则显示睡眠中的系统函数名。
STIME:进程启动时的系统时间。
七、僵尸进程
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
进程状态
常见的状态有以下几种:.
-D:不可被唤醒的睡眠状态,通常用于i/O情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于出错状态。
-W: 内存交互状态(从内核开始无效)
-X: 死掉的进程(应该不会出现)。
-Z: 僵尸进程。进程已经中止, 但是部分程序还在内存当中。
-<: 高优先级(以下状态在BSD格式中出现)。
-N:低优先级。
-L: 被锁入内存。
-s:包含子进程。
-l:多线程(小写L)。
-+: 位于后台。
-C: 进程占用CPU的百分比