或者任务(task)来表示。在当用户操作系统中用户也能同时运行多个程序比如文字处理程序, 页浏览,或者邮件收发程序。即使用户一次只能执行一个应用程序,而操作系统本身也需要程序去支持自身的行动,比如是内存管理等等,所有这些操作的活动称之为进程。
### 什么是进程/p>
关于什么是进程这个问题或许我们会认为进程就是程序,但是这个说法可能不太准确,在理解进程和程序之前我们先对他们两个进行区分:
– 程序:程序在我们直观的认识中就是软件程序比如 易云音乐,谷歌浏览器等等,追踪其本质程序只是在磁盘中的代码片段而已,他只是一些文本代码没有其他的任何状态。
– 进程:进程可以理解为是一个活的应用程序他又自己的内存堆栈,数据域,文本域,程序计数器,处理器寄存器信息,还包括临时数据,函数参数,返回地址和局部变量。
通过上述比对,将程序比作进程是一种不太正确的说法,他两最大的区别简单来说一个是活的一个是死的,**进程是一种主动实体具有自己的状态,而程序是被动实体只有程序被加载到内存中时他才正真的称为是一个进程,当程序的可执行文件被加载到内存执行时他便具备了进程的特性,其中进程是具有生命周期的当进程执行完毕生命周期随之结束而程序是没有生命周期这个概念的他存储在计算机磁盘上永久存在。**
还有一个特殊情况需要进行讨论,我们假设多个进程与一个程序相关联。但是当作两个独立的程序来执行类似于我们同时打开了两个谷歌浏览器这两个谷歌浏览器虽然共享同一个程序但是两者的堆栈,内存,数据都不同
注意还有一个情况是进程本身也是一个环境,类似于java的JVM,JVM本身是一个进程(java.exe),我们尝试在JVM上面编译执行java代码,例如java Test 命令java将JVM作为一个普通进程来执行,而这个进程会在JVM内执行java程序
下面讨论一个问题,程序和进程的关系:**一个程序可以包含多个进程,而一个进程只对应一个程序**,一个程序包含多个进程中谷歌浏览器是一个最经典的例子,在谷歌浏览器中主要分为3个进程:
– 浏览器进程:进程负责管理用户界面以及磁盘和 络的I/O。当浏览器启动时加载该进程,注意浏览器从加载到退出只会创建一个进程。
– 渲染进程:渲染进程负责解析HTML,CSS,JAVAscript,图片,字体等文件,注意的是Chrome浏览器是标签型浏览器每当我们新建一个标签便新建了一个渲染进程,进程之间彼此独立不互相影响,假如一个 页javascript解析错误导致 页崩溃那么则个错误只会影响该渲染进程对其他 页不会产生影响(这就是为什么谷歌浏览器那个耗内存)。
– 插件进程:对于每种正在使用的插件(例如:Flash,Vue,React)在运行时都会生成一个插件进程去执行。插件进程不但有自己的代码还包含额外的代码,以便和与有关渲染进程进行通信。
下面我们在讨论一个问题,进程和线程的关系(这里只简述在线程哪里详细讲述):上面我们讨论过一个程序可以有多个进程,那么是不是可以引申出一个进程是不是可以包含多个线程,一个线程对应一个进程,我们接着引用谷歌浏览器的渲染进程的概念来分析,在谷歌浏览器的渲染进程中主要是对HTML,CSS,javascript,图片等资源文件进行解析,那么一个渲染进程是不是可以建多个线程一个处理解析HTML代码生成HTML节点树,一个线程解析CSS代码生成CSS渲染树,一个线程解析执行javascript代码,另一个线程处理资源图片文件,从中我们可以发现**一个进程可以包含多个线程,一个线程对应一个进程**。
**重点:进程是抢占资源的主体,线程是执行任务的主体。**
### 进程的状态
进程在执行时会改变状态状态。进程状态,部分取决于进程当前的活动,每个进程可能处于一下几个状态:
– 新的(new):进程正在创建。
– 运行(running):指令正在执行。
– 等待(waiting):进程等待发生某个事件。
– 就绪(ready):进程等待分配处理器。
– 终止(terminated):进程已经执行完毕。
这里有点需要注意的是一次只有一个进程可在一个处理器上运行;但是许多程序处于就绪状态(ready)等待CPU时间片
进程状态转换图:
,我们假设CPU调度算法处于竞态条件(CPU调度算法中有竞态和非竞态 在CPU调度算法那章详细讲解),在竟态条件下此时假设CPU正在执行进程A时调度程序将进程B调度进来(这里出现抢占情况 可能进程B的优先级高于A)进程B抢占了进程A的CPU执行周期那么此时就会发起一个中断通知CPU终止进程A的执行,进程A从运行状态转变为就绪状态从新被加载如就绪队列等待CPU时间片,这里有一点需要注意的时是在下一节中我们提到进程控制块(PCB)其中的一个作用是保存CPU寄存器信息,状态信息,程序计数器等,在中断发生时这个保存的过程也就发生了,这个功能有点类似与是虚拟机中的快照功能,当进程A重新获得CPU时间片后便可按照PCB保存的信息继续执行。
– I/O或事件等待:当进程需要进程IO请求时进程会从运行状态切换到IO等待状态等待IO时间片(这里的IO包括读写硬盘,向屏幕上输出信息,发起 络请求,读取USB设备等),假设进程A此时需要读取硬盘上的日志,进程A首先发起IO请求从运行状态切换到等待IO状态进入请求IO资源队列,等待IO资源,进程A获取到IO资源后从新进入就绪状态等待CPU时间片。
– 退出:当进程执行完后从从运行状态切换到终止状态,释放CPU和内存资源。
现在我模拟一个进程从创建到终止的一整个过程:假设现在有一个进程A主要的功能是读取磁盘中的系统日志并将日志使用http协议发送到一个指定的服务器上,同时将读取到的日志显示到:
分析:进程A实现三个功能
– 读取磁盘的日志文件
– 发送日志文件
– 显示到屏幕上面
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!