一、什么是程序?
-
文件中静态保存的代码
-
是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
-
用于描述进程要完成的功能,是控制进程执行的指令集。
-
保存在硬盘、光盘等介质中的可执行代码和数据。
二、什么是进程
-
运行的程序在内存中的叫进程
-
电脑用pid来识别进程;程序运行,系统自动分配pid
-
存在生命周期
-
都由其父进程创建
三、进程具有的特征
-
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
-
并发性:任何进程都可以同其他进程一起并发执行;
-
独立性:进程是系统进行资源分配和调度的一个独立单位;
-
结构性:进程由程序、数据和进程控制块三部分组成。
四、进程的基本状态
-
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态;
-
就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行;
-
执行状态:进程处于就绪状态被调度后,进程进入执行状态;
-
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用;
-
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。
五、进程的状态
-
运行态:running
-
就绪态:ready
-
睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable;
-
停止态:stopped,暂停于内存,但不会被调度,除非手动启动;
-
僵尸态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵尸态 的子进程。
六、什么是线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。因此在80年代,出现了能独立运行的基本单位------线程(Threads)。
查看进程有几个线程,可以使用 "cat /proc/PID/status"查看。
七、进程和线程的区别
-
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
-
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
-
调度和切换:线程上下文切换比进程上下文切换要快得多;
-
程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
-
同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的;
-
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
八、僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init 来接管他,成为他的父进程。
示例:
九、查看进程信息
1.ps命令:查看静态进程统计信息
ps 命令是 Process Status 的缩写 ,可以查看进程当前状态的快照。查看静态的进程统计信息,即执行 ps 命令的那个时刻的进程快照。默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID 目录下的各文件中。
常用选项:
-
a:显示当前终端下的所有进程信息,包括其他用户的进程。与"x"选项结合时将示系统中所有的进程信息。
-
u:使用以用户为主的格式输出进程信息。
-
x:显示当前用户在所有终端下的进程信息。
-
-e:显示系统内的所有进程信息。
-
-l:使用长(Long)格式显示进程信息。
-
-f:使用完整的(Full)格式显示进程信息。
-
k|--sort 属性:对属性排序,属性前加 - 表示降序排列。
ps命令支持三种语法格式:
-
UNIX风格。选项可以组合在一起,并且选项前必须有 "-" 连字符 。如:ps -ef。
-
GNU选项。选项前有两个 "-" 连字符 。如:ps --help。
-
BSD选项。选项可以组合在一起,但是选项前不能有 "-" 连字符。如:ps aux。
我们常用的是BSD选项,这个一般看个人选择。
查看静态进程统计信息命令:ps aux
-
a:显示终端上的所有进程,包括其它用户的进程
-
u:表示列出进程的用户名
-
x:显示所有终端的进程
示例:
进程信息共有11个字段,每个字段含义如下:
表头(列名) | 含义 | 重点 |
---|---|---|
USER | 进程的用户 | |
PID | 进程的id号 | |
%CPU | 进程占用CPU百分比 | * |
%MEM | 进程占用内存百分比 | * |
VSZ | 该进程使用的虚拟内存量(KB) | |
RSS | 该进程占用的物理内存量(KB) | |
TTY | 启动进程终端名 | |
STAT | 该进程的状态 | * |
START | 该进程启动时间 | |
TIME | 该进程实际使用CPU运行的时间 | |
COMMAND | 进程启用的命令 |
STAT进程的状态:
-
D:不可中断 的休眠状态
-
S:处于休眠 状态,可被唤醒
-
R:正在运行状态
-
T:停止状态,可能是在后台暂停或进程处于跟踪调试状态
-
Z:僵尸进程,进程已经终止,但部分程序还在内存当中
查看静态进程统计信息命令:ps -elf
-
-e:显示系统内的所有进程信息
-
-l:使用长格式显示进程信息
-
-f:使用完整的格式显示进程信息
示例:
进程信息共有14个字段,每个字段含义如下:
表头(列名) | 含义 |
---|---|
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改,数值范围:-20~19 |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
如果不想看到所有的进程,只想查看一下当前登录的终端产生了哪些进程,那只需使用 "ps -l" 命令就足够了。
自定义显示字段(查看进程的特定属性):
1)ps axo 列名,列名,列名,列名
1)ps -eo 列名,列名,列名,列名
进程排序:
1)按CPU占比升序排列:ps aux --sort=%cpu。
2)按内存占比降序排列:ps aux --sort=-%mem。
特殊示例:找到未知进程的执行程序文件路径
准备:未知进程的执行程序文件
1.查找静态进程信息,CPU倒序,只显示前十行。
2.通过PID号,切换到未知进程所在的文件夹
3.找到exe文件夹,未知进程的绝对路径就在其中。
4.确定未知进程的执行程序文件路径是否有用,若无用,则删除未知进程的执行程序文件路径,并在相同路径下建立一个相同名称的文件。(这也是预防电脑病毒的方法)
2.top命令:查看动态进程统计信息
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。
为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态
命令的输出主要分为两部分:
-
第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
-
第二部分从第六行开始,显示的是系统中进程的信息.
top命令输出内容------第一部分详解
第一部分是前五行,显示的是整个系统的资源使用状况。
1)第一行是任务队列信息:top - 15:21:57 up 1:20, 2 users, load average: 0.03, 0.02, 0.05
-
15:21:57:系统当前时间
-
up 1:20:系统的运行时间。本机己经运行了一个小时20分钟
-
2 users:当前登录了两个用户
-
load average: 0.03, 0.02, 0.05:系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)。
2)第二行是进程信息:Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie
-
152 total:系统中的进程总数
-
1 running:正在运行的进程数
-
151 sleeping:睡眠的进程数
-
0 stopped:停止(暂停)的进程数
-
0 zombie:僵尸进程数。如果不是 0,则需要手工检查僵尸进程。
3)第三行是 CPU 信息:%Cpu(s): 0.2 us,0.0 sy,0.0 ni,99.8 id,0.0 wa,0.0 hi, 0.0 si, 0.0 st
内 容 | 说 明 |
---|---|
0.2 us | 用户模式占用的 CPU 百分比 |
0.0 sy, | 系统模式占用的 CPU 百分比 |
0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
99.8 id | 空闲 CPU 占用的 CPU 百分比 |
0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
0.0 si | 软中断请求服务占用的 CPU 百分比 |
0.0 st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
4)第四行是物理内存信息:KiB Mem :1867048 total,1154048 free,299880 used,413120 buff/cache
-
1867024 total : 物理内存的总量,单位为KB
-
1243576 free:空闲的物理内存数量
-
255592 used:已使用的物理内存数量
-
367856 buff/cache:作为缓冲的内存数量
5)第五行是交换分区(swap)信息:KiB Swap: 3907580 total, 3907580 free, 0 used. 1363728 avail Mem
-
3907580 total:交换分区(虚拟内存)的总大小,单位KB
-
3907580 free:空闲交换分区的大小
-
0 used.:已使用的交换分区的大小
-
1363728 avail Mem:可用于进程下一次分配的物理内存数量
top命令输出内容------第二部分详解
top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:
表头(字段名) | 说明 |
---|---|
PID | 进程的 ID号 |
USER | 该进程所属的用户 |
PR | priority优先级,数值越小 优先级越高 |
NI | nice优先级,数值越小 优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程总共占用的 CPU 时间 |
COMMAND | 进程的命令名(进程文件、进程名称) |
tty终端:
-
Centos7系统,tty1表示图形界面,tty2-tty6表示文字界面,可以用Ctrl+Alt+F1-F6切换;
-
pts说明是用远程工具连接的,比如xshell,后面的数字代表登录的时间顺序,越小证明登录的越早;
-
查看线程 top -H;ps -T。
常用命令:
命令 | 说明 |
---|---|
P | 以占据的CPU百分比,%CPU |
M | 占据内存百分比,%MEM |
T | 累积占据CPU时长,TIME+ |
l | uptime信息 |
t | tasks及cpu信息 |
m | memory信息 |
q | 退出命令 |
s | 修改刷新时间间隔 |
k | 终止指定进程 |
W | 保存文件 |
1(数字) | cpu分别显示 |
3.pgrep命令------查询进程的PID
根据特定条件查询进程的PID信息。
-
-U:指定用户
-
-l:显示进程名
-
-a:显示完整格式的进程名
-
-P < PID>:显示指定进程的子进程
示例:
1)查询指定用户
2)显示进程名
3)显示完整格式的进程名