一、什么是程序
-
是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
-
用于描述进程要完成的功能,是控制进程执行的指令集
二、进程
1.什么是进程
进程:正在运行中的程序,加载到内存中运行(正在运行中的程序),进程是程序的副本,进程是有生命周期的,是被载入内存的一个指令集合,是资源分配的单位,
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
都由其父进程创建
进程创建:
init:第一个进程,从 CentOS7 以后为systemd
进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write 写实更新,有数据写入子进程需要新的内存空间
什么是程序:硬盘上躺着(静态的),是执行特定任务的一串代码,
什么是进程:加载到内存中运行(正在运行中的程序),进程是程序的副本,进程是有生命周期的
进程的控制:每开启一个进程会消耗相应的硬件资源(内存,cpu,磁盘读写剩余)
硬件资源不足?对进程进行清理
2.进程特征
进程的特征:动态性 、并发性、独立性、结构性。
3.进程、线程、协程区别
(一)进程
硬件资源分配的最小单位,进程只接受任务,不处理任务,线程才是干活的那一个
进程由程序(代码)、数据(需要调用的文件)和进程控制块(开发研究)部分组成。
一个进程可以拖多个线程。
(二)线程:
可以减少硬件资源的消耗,进程切换,相同资源的存储
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
(三)协程:
规定那个线程谁先执行
进程与线程的区别
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进
程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多。
面试题:怎么确定一个程序是 多线程 还是 单线程?
去看该进程的详细状态
grep -i threads /proc/进程的PID/statusprtstat 进程pid号
4.进程使用内存的问题
内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出,类似红杏出墙
内存不足:OOM
OOM 即 Out Of Memory,“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理
原因:
给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
2,给系统增加swap空间
oom过高和cpu过高:清进程
5.进程状态
三、进程管理相关命令
进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。
1. ps命令 查看静态的进程信息状态
常用选项
a : 显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有 的进程信息。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程信息。
-e:显示系统内的所有进程信息。
k|--sort 属性 对属性排序,属性前加 - 表示倒序 ps aux k -%cpu
o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
查看静态的进程统计信息
-
"ps aux" 可以查看系统中所有的进程;
-
"ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
-
"ps -l" 只能看到当前 Shell 产生的进程;
STAT 进程状态 常见的状态有以下几种:
僵尸进程: 一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵厂进程。
父进程退出 子进程没有退出 那么这些子进程就没有父进程来管理了, 就变成僵尸进程
父进程出了纰漏,所以产生了僵尸进程
子进程已经结束了,父进程没有意识到
面试题:
如何过滤僵尸进程?ps aux | grep -v grep |grep Z
如何结束僵尸进程? 重启 reboot,最快
cpu利用率高怎么排查?
top 或者ps aux
查找cpu利用率高的进程
找到cpu利用率最高的进程 ps aux k -%cpu
找到内存mem占用最高的进程ps aux k -%mem
2. top 任务管理器,动态显示进程的状态
动态查看进程状态默认每3秒刷新一次,q键退出
top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:
PID:进程的 ID。
USER:该进程所属的用户。
PR:优先级,数值越小优先级越高。
NI:优先级,数值越小、优先级越高。
VIRT:该进程使用的虚拟内存的大小,单位为 KB。
RES:该进程使用的物理内存的大小,单位为 KB。
SHR:共享内存大小,单位为 KB。
S:进程状态。
%CPU:该进程占用 CPU 的百分比。
%MEM:该进程占用内存的百分比。
TIME+:该进程共占用的 CPU 时间。
COMMAND:进程的命令名
top选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
3. htop 增强版的top
4. pgrep命令 查看指定的进程
-
-U 指定用户
-
-l: 显示进程名
-
-a: 显示完整格式的进程名
-
-P pid: 显示指定进程的子进程
5. pstree命令进程树,以树形结构列出进程信息
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
6. lsof 列举系统中已经被打开的文件
通过 lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
7. vmstat
如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。 作用:查看cpu、内存等进程状态信息,相当于一个通用查看命令;磁盘分区和剩余看不了
8. kill
从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
9. killall
killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用