目录
[2.2.1 进程和线程的区别](#2.2.1 进程和线程的区别)
[①内存泄漏:Memory Leak](#①内存泄漏:Memory Leak)
[②内存溢出:Memory Overflow](#②内存溢出:Memory Overflow)
[③内存不足:OOM Out Of memory](#③内存不足:OOM Out Of memory)
[4.3 进程更多的状态](#4.3 进程更多的状态)
[4.4 僵尸进程](#4.4 僵尸进程)
一、程序
1、什么是程序?
执行特定任务的一段代码
二、进程
1、什么是进程?
运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,是硬件资源分配的最小单位。
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承。
通常从执行进程的用户来继承
存在生命周期
都由其父进程创建
进程创建:
init:第一个进程,从 CentOS7 以后为systemd
进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write 写实更新,有数据写入子进程需要新的内存空间
2、进程具有的特征
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行;
独立性:进程是系统进行资源分配和调度的一个独立单位;
结构性:进程由程序、数据和进程控制块三部分组成。
2.2进程,线程,协程
进程:
①硬件资源分配的最小单位
②只分配任务,不执行任务
线程:
①线程是程序执行的最小单位
②减少硬件资源的消耗
协程:
是一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己写程序来管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性。
2.2.1 进程和线程的区别
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多。
2.2.2如何查看一个程序是多线程还是单线程
pstree
grep -i threads /proc/进程的PID/status
prtstat 进程pid号|GREP -j threads
3、进程使用内存的问题
①内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
②内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。
③内存不足:OOM Out Of memory
OOM 即 Out Of Memory,"内存用完了",在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理。
原因:
给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的JVM参数指定)太少。
应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
使用的解决办法:
1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
2,给系统增加swap空间
pmap 进程id #查看进程具体模块所占内存的大小
4、进程状态
4.1进程的基本状态
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
4.2状态之间转换六种情况
运行------>就绪:
①主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的
②在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
就绪------>运行:
运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行------>阻塞:
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如:发生了I/O请求
阻塞------>就绪:
进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
阻塞------>运行:
即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
就绪------>阻塞:
就绪态根本就没有执行,谈不上进入阻塞态
4.3 进程更多的状态
-
运行态:running
-
就绪态:ready
-
睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
-
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
-
僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
4.4 僵尸进程
一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵厂进程。
父进程退出 子进程没有退出 那么这些子进程就没有父进程来管理了, 就变成僵尸进程。
子进程已经结束了,父进程没有意识到。
[root@centos7 ~]#bash [root@centos7 ~]#echo $BASHPID 1809 [root@centos7 ~]#echo $PPID 1436 #将父进程设为停止态 [root@centos7 ~]#kill -19 1436 #杀死子进程,使其进入僵尸态 [root@centos7 ~]#kill -9 1809 [root@centos7 ~]#ps aux #可以看到上面图示的结果,STAT为Z,表示为僵尸态 #方法1:恢复父进程 [root@centos7 ~]#kill -18 1436 #方法2:杀死父进程 [root@centos7 ~]#kill -9 1436 #再次观察,可以僵尸态的进程不存在了 [root@centos7 ~]#ps aux
5、进程的优先级
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI 和 NI 的关系如下:
PRI (最终值) = PRI (原始值) + NI
其实,大家只需要记得,我们修改 NI 的值就可以改变进程的优先级即可。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。
修改 NI 值时有几个注意事项:
NI 范围是 -20~19。
普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
进程优先级调整
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
6、进行分类
操作系统分类:
协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作------使用一段时间的 CPU ,主动放弃使用
抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务
进程类型:
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
按进程资源使用的分类:
CPU-Bound:CPU 密集型,非交互
IO-Bound:IO 密集型,交互