程序、 进程、线程
程序: 一些指令和数据的集合,是一个静态实体。
进程: 系统进行资源分配和调度的独立基本单位。
线程: 线程是操作系统能够进行运算调度的最小单位。一个线程指的是进程中单一顺序的控制流。一个进程中可以并发多个线程,每个线程并行执行不同人物。因为线程中几乎不包含系统资源,所以执行更快,更有效率。
三者之间的关系
一个程序至少有一个进程,一个进程至少有一个线程。线程被包含在进程之中,是进程中运行的实际运作 单位。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存。
进程分类
进程可以从进程的功能与服务的对象来划分,从这个角度来划分,进程可以分为:
- 用户进程: 通过执行用户程序、应用程序而产生的进程.
- 系统进程: 通过执行系统内核程序而产生的进程,这样的进程运行不受用户干扰,即使是root用户也不行。
从 应用程序的服务类型来划分,进程可以分为:
- 交互进程:由一个 shell 终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
- 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
- 守护进程:守护进程是一直运行的一种进程,在 Linux 系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
进程的衍生
子进程是父进程通过系统调用fork() 而产生的复制品,fork()就是把父进程的PCB等进程数据结构信息直接复制过来,只是修改了PID,其余一模一样。只有执行了exec()之后才会有所不同。
子进程的退出与资源的回收
当一个子进程要正常的终止运行时,或者该进程结束时,它的主函数mian()会执行exit(n);或者return n,这里的返回值n是一个信号量,系统会把这个SIGCHLD信号量传给父进程。正常情况下,父进程会收到两个返回值:exit code(SIGCHLD 信号)与 reason for termination 。之后,父进程会使用 wait(&status) 系统调用以获取子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的 PCB;而如若父进程没有这么做的话,子进程的 PCB 就会一直驻留在内存中,一直留在系统中成为僵尸进程(Zombie)。
进程 0 是系统引导时创建的一个特殊进程,也称之为内核初始化,其最后一个动作就是调用 fork() 创建出一个子进程运行 /sbin/init 可执行文件,而该进程就是 PID=1 的进程 1。
然后进程 0 就转为交换进程(也被称为空闲进程),进程 1 (init 进程)是第一个用户态的进程,再由它不断调用 fork() 来创建系统里其他的进程,所以它是所有进程的父进程或者祖先进程。同时它是一个守护程序,直到计算机关机才会停止
进程查看
top
top 可以实时查看进程状态以及系统的一些信息(如cpu、内存信息等)
第一行数据解释:
top 表示当前程序的名称
08:55:01 表示当前的系统的时间
up 21days,11:02 表示该机器已经启动了多长时间
1 user 表示当前系统中只有一个用户
load average: 3.53,4.95,8.61 分别对应1、5、15分钟内cpu的平均负载
白色行数据解释:
列名 | 解释 |
PID | 进程id |
USER | 该进程的所属用户 |
PR | PR 值表示 Priority 值叫动态优先级,是进程在内核中实际的优先级值,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是 MAX_PRIO,它的值为 140。Linux 实际上实现了 140 个优先级范围,取值范围是从 0-139,这个值越小,优先级越高。而这其中的 0 - 99 是实时进程的值,而 100 - 139 是给用户的。 |
NI | 该进程的 nice 值。NICE 值叫做静态优先级,是用户空间的一个优先级值,其取值范围是-20至19。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。 |
VIRT | 该进程任务所使用的虚拟内存的总数 |
RES | 该进程所使用的物理内存数,也称之为驻留内存数 |
SHR | 该进程共享内存的大小 |
S | 该进程进程的状态: S=sleep R=running Z=zombie |
%CPU | 该进程CPU的利用率 |
%MEM | 该进程内存的利用率 |
TIME+ | 该进程活跃的总时间 |
COMMAND | 该进程运行的名字 |
PS 工具
ps可以静态来查看 当前的进程信息
列名 | 解释 |
USER | 进程的拥有用户 |
PID | 进程的 ID |
PPID | 其父进程的 PID |
SID | session 的 ID |
TPGID | 前台进程组的 ID |
%CPU | 进程占用的 CPU 百分比 |
%MEM | 占用内存的百分比 |
NI | 进程的 NICE 值 |
VSZ | 进程使用虚拟内存大小 |
RSS | 驻留内存中页的大小 |
TTY | 终端 ID |
S or STAT | 进程状态 |
WCHAN | 正在等待的进程资源 |
START | 启动进程的时间 |
TIME | 进程消耗CPU的时间 |
COMMAND | 命令的名称和参数 |
ps -l可以显示自己这次登录的bash相关的进程信息罗列出来
pstree
pstree 查看当前活跃进程的树形结构,最主要的是可以看到所有进程之间的相关性。
pstree -up
-A :各程序树之间以 ASCII 字元來連接;
-p :同时列出每个 process 的 PID;
-u :同时列出每个 process 的所屬账户名称。
进程管理
ps aux 查看进程
关闭进程id为278的vim程序进程