程序
什么是程序
程序: (电脑上所有都是程序)
- 程序是执行特定任务的一串代码,存储在硬盘上,是静态的。
- 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
- 用于描述进程要完成的功能,是控制进程执行的指令集。
- 保存在硬盘、光盘等介质中的可执行代码和数据。
进程
什么是进程
运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。
[进程:在CPU以及内存中运行的程序代码叫进程。动态,存在内存中,有生命周期。]
- 动态执行的代码
- 运行在cpu和内存中一个程序代码。
- 进程PID(Process ID)号码被用来标记各个进程
- UID、GID语境决定对文件系统的存取和访问权限
- 由父进程进行创建管理
- 存在生命周期
线程和进程的关系
- 进程是操作系统资源分配的基本单位
- 线程是处理器任务调度和执行的基本单位
- 如果一个进程内有多个线程,则执行过程不是一条线的,而是多线程共同完成的,所以线程是进程的一部分
- 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
- 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉
线程
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
线程的存在是为了阻止进程间切换
线程有优先级
可以从可以使用 cat /proc/进程PID/status 查看进程有几个线程也可以输入命令grep -i threads /proc/进程PID/status来精准查找有几个线程。
进程具有的特征:
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成。
为什么要管理进程
开启进程就要消耗硬件资源(cpu利用率、内存使用率、磁盘使用率),硬件资源消耗完了就会卡顿、死机。
中病毒、程序异常、程序设计不合理都有可能是内存占用率满的原因,通常情况下是不会造成此类原因。
进程使用内存的问题
- 内存泄漏:Memory Leak
指程序申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态。
- 内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。
- 内存不足:OOM (Out Of Memory)
关闭进程占用率较高的进程,关闭前要先确认关闭的进程是否有用,不可随意关闭。
pmap 进程号PID //查看进程占用的内存情况
[root@localhost /]# pmap 1096
1096: /usr/sbin/sshd -D
000055a4a1ae8000 800K r-x-- sshd
000055a4a1daf000 16K r---- sshd
000055a4a1db3000 4K rw--- sshd
进程状态
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
进程更多的状态
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵尸态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵尸态的子进程
进程结束,父进程会回收子进程的硬件资源;
子进程如果出现意外关闭,父进程无感知就不会收回资源,就产生了僵尸进程。
僵尸进程
- 搭建一个僵尸进程(停止父进程,杀掉子进程可得到状态为Z的僵尸进程)
- 解决僵尸进程可采取恢复父进程(
kill -18 父进程)或者杀掉父进程(kill -9 父进程)也可重启程序。
查看进程信息
ps 查看静态进程统计信息
ps 即 (process state),可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的文件中。
ps命令支持三种语法格式:
- UNIX风格。选项可以组合在一起,并且选项前必须有 "-" 连字符 。如:ps -ef。
- GNU选项。选项前有两个 "-" 连字符 。如:ps --help。
- BSD选项。选项可以组合在一起,但是选项前不能有 "-" 连字符。如:ps aux。
pa aux 显示当前进程所有详细信息(常用)
| 选项 | 功能 |
|---|---|
| a | 显示终端上的所有进程,包括其它用户的进程与“x”选项结合时显示系统中所有的进程信息。 |
| u | 表示列出进程的用户名 |
| x | 显示所有终端的进程 |
| -e | 显示系统内的所有进程信息 |
| -l | 使用长格式显示进程信息 |
| -f | 使用完整的格式显示进程信息 |
| -a | 显示所有进程pid |
| -T | 查看线程信息 |
| k , --sort | 对属性排序,属性前加 - 表示倒序 |
| o | 选项显示定制的信息 pid、cmd、%cpu、%mem |
ps aux -%mem倒序排序显示内存占用顺序
ps axo user,pid只查看选中的user和pid选项
ps -l只能看到当前 Shell 产生的进程,不会显示所有进程
ps aux k -%cpu按cpu利用率倒序排序
** prtstat 查看指定进程信息**
- ps aux各层代表意思
| 区块 | 说明 |
|---|---|
| USER | 进程是哪个的用户产生的 |
| PID | 进程的ID号 |
| %CPU | 进程占用CPU百分比,百分百越高cpu消耗越大,进程越消耗资源。(cpu利用率要看cpu的总块数一般情况下大于100%) |
| %MEM | 该进程占用内存百分比,占用的百分比越高,进程越耗费资源。 |
| VSZ | 该进程使用的虚拟内存量(KB),虚拟内存仅代表预计量 |
| RSS | 该进程占用的物理内存量(KB),这里的才是实际占用量 |
| TTY | 启动进程终端名。该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程 |
| STAT | 该进程的状态 |
| START | 该进程启动时间 |
| TIME | 该进程实际使用CPU运行的时间(该进程占用 CPU 的运算时间) |
| COMMAND | 产生此进程的命令名。 |
STAT进程状态(常见状态):
- -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
- -R:该进程正在运行。
- -S:该进程处于睡眠状态,可被唤醒。
- -T:停止状态,可能是在后台暂停或进程处于除错状态。
- -W:内存交互状态(从 2.6 内核开始无效)。
- -X:死掉的进程(应该不会出现)。
- -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。
- -<:高优先级(以下状态在 BSD 格式中出现)。
- -N:低优先级。
- -L:被锁入内存。
- -s:包含子进程。
- -l:多线程(小写 L)。
- -+:进程位于后台。
cpu利用率要看cpu的总大小,本机的cpu使用最大值为200%
ps -elf可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级
| 表头 | 含义 |
|---|---|
| F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
| UID | 运行此进程的用户的 ID; |
| PID | 进程的 ID; |
| PPID | 父进程的 ID; |
| C | 该进程的 CPU 使用率,单位是百分比; |
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
| NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
| ADDR | 该进程在内存的哪个位置; |
| SZ | 该进程占用多大内存; |
| WCHAN | 该进程是否运行。"-"代表正在运行; |
| TTY | 该进程由哪个终端产生; |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
| CMD | 产生此进程的命令名; |
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice ( NI范围是 -20~19 )
寻找未知进程的执行程序文件路径(可以用来解决简单的病毒)
- 模拟一个病毒进程,发现一个cpu占用率异常的项目
- 根据PID号可以找出对应的文件
top命令 动态查看进程(任务管理器)
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。
为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
选项:
- -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒。
- -b:使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中。
- -n 次数:指定 top 命令执行的次数。一般和"-"选项合用。
- -p 进程PID:仅查看指定 ID 的进程。
- -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误。
- -u 用户名:只监听某个用户的进程。
在 top 命令的显示窗口中,可使用如下按键,进行交互操作:
- ? 或 h:显示交互模式的帮助。
- c:按照 CPU 的使用率排序,默认就是此选项。
- M:按照内存(memory)的使用率排序。
- N:按照 PID 排序。
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序。
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号。
- r:按照 PID 给某个进程重设优先级(Nice)值。
- q:退出 top 命令。
- z:彩色显示
- F:通过光标设置字段是否展示,以及展示顺序。
top命令输出内容
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。
命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
- 第二部分从第六行开始,显示的是系统中进程的信息。
第一部分
第一部分是前五行,显示的是整个系统的资源使用状况。
top - 22:57:49 up 10:44, 3 users, load average: 1.00, 0.97, 0.95
Tasks: 185 total, 2 running, 183 sleeping, 0 stopped, 0 zombie
%Cpu(s): 11.8 us, 38.3 sy, 0.0 ni, 49.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867048 total, 155412 free, 720656 used, 990980 buff/cache
KiB Swap: 4194300 total, 4174944 free, 19356 used. 909492 avail Mem
- 第一行为任务队列信息
- 第二行为进程信息
- 第三行为 CPU 信息
- 第四行为物理内存信息
- 第五行为交换分区(swap)信息
第一行是任务队列信息,具体内容如表所示。top - 22:57:49 up 10:44, 3 users, load average: 1.00, 0.97, 0.95
| 内 容 | 说 明 |
|---|---|
| 22:57:49 | 系统当前时间 |
| up 10:44 | 系统的运行时间 |
| 3 users | 当前登录了3个用户 |
| load average: 1.00, 0.97, 0.95 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) |
第二行是进程信息,具体内容如表。Tasks: 185 total, 2 running, 183 sleeping, 0 stopped, 0 zombie
| 内 容 | 说 明 |
|---|---|
| Tasks: 185 total | 系统中的进程总数 |
| 2 running | 正在运行的进程数 |
| 183 sleeping | 睡眠的进程数 |
| 0 stopped | 停止(暂停)的进程数 |
| 0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程。 |
第三行是 CPU 信息,具体内容如表。%Cpu(s): 11.8 us, 38.3 sy, 0.0 ni, 49.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
| 内 容 | 说 明 |
|---|---|
| %Cpu(s): 11.8 us | 用户模式占用的 CPU 百分比 |
| 38.3 sy | 系统模式占用的 CPU 百分比 |
| 0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
| 49.8 id | 空闲 CPU 占用的 CPU 百分比 |
| 0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 |
| 0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
| 0.0 si | 软中断请求服务占用的 CPU 百分比 |
| 0.0 st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行是物理内存信息,具体内容如表。KiB Mem : 1867048 total, 155412 free, 720656 used, 990980 buff/cache
| 内 容 | 说 明 |
|---|---|
| KiB Mem : 1867048 total | 物理内存的总量,单位为KB |
| 155412 free | 空闲的物理内存数量 |
| 720656 used | 已使用的物理内存数量 |
| 990980 buff/cache | 作为缓冲的内存数量 |
5)第五行是交换分区(swap)信息,具体内容如表。KiB Swap: 4194300 total, 4174944 free, 19356 used. 909492 avail Mem
| 内 容 | 说 明 |
|---|---|
| KiB Swap: 4194300 total | 交换分区(虚拟内存)的总大小,单位KB |
| 4174944 free | 空闲交换分区的大小 |
| 19356 used. | 已使用的交换分区的大小 |
| 909492 avail Mem | 可用于进程下一次分配的物理内存数量 |
第二部分
第二部分从第六行开始,显示的是系统中进程的信息。
- PID:进程的 ID。
- USER:该进程所属的用户。
- PR:优先级,数值越小优先级越高。
- NI:优先级,数值越小、优先级越高。
- VIRT:该进程使用的虚拟内存的大小,单位为 KB。
- RES:该进程使用的物理内存的大小,单位为 KB。
- SHR:共享内存大小,单位为 KB。
- S:进程状态。
- %CPU:该进程占用 CPU 的百分比。
- %MEM:该进程占用内存的百分比。
- TIME+:该进程共占用的 CPU 时间。
- COMMAND:进程的命令名。
pgrep命令——查询进程的PID
根据特定条件查询进程的PID信息。
- -U:指定用户
- -l:显示进程名
- -a:显示完整格式的进程名
- -P (PID):显示指定进程的子进程
演示:
查询指定的用户身份运行的程序
显示进程名
当前root用户运行了多少进程
pidof查询已知程序名的pid号
用来查询已知程序名的pid号,该程序需要在运行状态。
命令格式:pidof 程序名
例如:
查看bash程序下的主进程、子进程的pid号
pstree命令——以树形结构列出进程信息
命令格式:pstree [OPTION] [ PID | USER ]
常用选项:
- -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
- -p:显示PID。
- -p < pid> : 显示指定进程及其子进程,同时显示每个进程的PID。
- -u:显示进程的用户名称。
- -u 用户名:显示指定用户的进程。
- -H < pid>:高亮显示指定进程及其前辈进程。
- -T:不显示线程thread,默认显示线程。
1.pstree PID,显示指定进程及其子进程。
2.pstree -p PID,显示指定进程及其子进程,同时显示PID。
lsof命令 —— 列举已被打开的文件
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
命令格式: lsof [选项]
| 选项 | 功能 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件。 |
| +d 目录名 | 列出某个目录中所有被进程调用的文件。 |
| -u 用户名 | 只列出某个用户的进程打开的文件。 |
| -p pid | 列出某个 PID 进程打开的文件。 |
演示:
1.lsof -p PID显示当前进程打开的所有文件
面试题:当删除大文件为什么不释放空间(有用户在使用)
现搭建一个模拟环境,创造一个大文件
删除大文件,发现删了但不释放空间。然后输入lsof|grep delete来查看是否有用户在使用
最后发现有一个用户正在使用该文件,所以导致删除文件却无法释放空间
将该用户踢出掉就可以释放删除大文件的空间。
清缓存
vmstat 监控系统资源
如果想动态地了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
命令格式:vmstat [刷新延时 刷新次数]
演示:
vmstat 5 2每五秒刷新一次一共刷新两次,该命令可以动态查看。
查询出的信息共分6段,下面是具体说明:
| 字段 | 含义 |
|---|---|
| procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
| memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。 |
| swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
| io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
| system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。 |
| cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:
- r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
- swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
- cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
- 一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
- 如果 bi+bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
- 输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us+sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。
总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。
vmstat命令格式二
vmstat [选项]...
常用选项:
| 选项 | 含义 |
|---|---|
| -f | 显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。 |
| -s | 将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。 |
| -S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
| -d | 列出硬盘有关读写总量的统计表。 |
| -p 分区设备文件名 | 查看硬盘分区的读写情况。 |
查看磁盘读写情况——
vmstat -d,但推荐使用iostat
iostat
常用选项:
- -c :只显示CPU行
- -d :显示设备〈磁盘)使用状态
- -k :以千字节为为单位显示输出
- -t :在输出中包括时间戳
- -x :在输出中包括扩展的磁盘指标
iostat -d功能更强大