一、程序
程序:执行特定任务的一串代码
1.是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
2.用于描述进程要完成的功能,是控制进程执行的指令集
二、进程和线程
1.进程
进程是程序的执行实例,拥有独立的资源和状态
进程特征:
1.动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的
2.并发性:任何进程都可以同其他进程一起并发执行
3.独立性:进程是系统进行资源分配和调度的一个独立单位
4.结构性:进程由程序、数据和进程控制块三部分组成
2.线程
线程是进程中的执行路径,共享进程的资源和地址空间,多个线程可以并发执行,实现程序的并发处理。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。
3.协程
协程(Coroutines):一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己写的程序,管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性
4.进程与线程的区别
1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其他进程不可见
4.线程上下文切换比进程上下文切换要快得多
5.进程使用内存的问题
开启进程消耗硬件资源(内存、硬盘、cpu使用率),硬件资源消耗完了就会卡顿
内核功用:进程管理,内存管理,文件系统,网络功能、驱动程序、安全功能等
1.内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
2.内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出
3.内存不足:OOM
内存不足(out of meory):给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
当我们出现内存不足(OOM)时常使用的解决办法:
1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
2,给系统增加swap空间
4.查看进程中的线程
这里的-p是显示进程pid号
命令格式:pstree -p
5.查看当前内存占用情况
命令格式:pmap 需要查看的进程pid号
注:.so结尾的一般是功能模块
三、进程状态
1.进程的基本状态
1.创建状态:进程在创建时需要申请一个空白PCB(process control block)进程控制块,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
2.*就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
3.*执行状态:进程处于就绪状态被调度后,进程进入执行状态
4.阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞,在满足需求时进入就绪状态等待系统调用
5.终止状态:进程结束、出现错误或被系统终止,进入终止状态无法再执行
2.状态之间转换六种情况
1.运行---就绪:主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
2.就绪---运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
3.运行---阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
4.阻塞---就绪:进程所等待的事件已经发生,就进入就绪队列
5.阻塞---运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
6.就绪---阻塞:就绪态根本就没有执行,谈不上进入阻塞态
1.进程更多的状态
1.运行态:running
2.就绪态:ready
3.睡眠态:分为两种,可中断:interruptable不可中断:uninterruptable
4.停止态:stopped,暂停于内存,但不会被调度,除非手动启动
5.僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭。解决办法:杀死父进程可以关闭僵死态的子进程。结束父进程,父进程会回收子进程的硬件资源,子进程如果出现意外关闭,父进程无感知就不会收回资源,人为关闭父进程,资源不会回收产生僵尸进程