进程是什么
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。官方解释,不用大白话也能看懂,难得,用程序员的语言就是,程序是类,进程是对象。
进程的由来
任何东西的存在都有它的必然性,那为什么会有进程?
- 为了提高计算机系统的效率.增强计算机系统内各种硬件的并行操作能力.操作系统要求程序结构必须适应并发处理的需要.为此引入了进程的概念
- 进程是操作系统的核心,所有基于多道程序设计的操作系统都建立在进程的概念之上
- 进程是设计和分析操作系统的有力工具
- 清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序
进程的特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
进程的结构
- 程序
- 数据
- 进程控制块
程序就是程序员编写的可运行的代码,数据是程序运行中产生的,进程控制块则用于表示进程的状态,其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。另外多个不同的进程可以包含相同的程序,一个程序在不同的数据集里就构成不同的进程,能得到不同的结果,但是执行过程中,程序不能发生改变。
进程运行都经历了什么
当用户发送指令告诉操作系统我要启动程序时,先由操作系统建立一个进程实例,每个进程有自己的虚拟地址、进程控制块、页表等数据结构,从装载器返回的程序入口(虚拟地址)开始,操作系统命令CPU从该虚拟地址开始执行指令,由于代码未加在到内存中,CPU从页表中找到映射的物理地址,通过缺页异常处理将硬盘中的代码读到内存当中,然后CPU修改页表状态,表示代码已经加载内存中,此时再从程序入口(虚拟地址)开始执行,随着执行,代码慢慢的都加在到内存中,不断运行,中间会经历阻塞、挂起状态等,最终结束,释放所有内存中的数据。
进程的地址分配
每个进程都会分配相同的虚拟地址空间,而相同的虚拟地址空间,其实对应的物理地址不同,但也可以相同,所以这就给进程间通信提供了有利的条件,具体对应的物理地址其实由CPU的MMU模块进行管理。内核空间放着内核的代码和数据。
进程管理
为什么需要管理呢?我们都知道,CPU同一时刻只能处理一件事,也就只能处理一个进程,而且进程肯定比CPU个数多,所以存在多个进程使用一个CPU的情况,所以进程管理的意义在于合理分配计算机资源,这里的资源包括CPU、网络、键盘等,怎么合理呢?就需要在适合的时机创建和释放,合理占坑是一个进程应有的基本道德。那么一个进程一般会有几个状态呢?如下
进程生命周期
- 运行状态
- 睡眠状态
- 等待状态
- 新建状态
- 僵死状态
以上状态的转换流程如下
进程状态的意义在于它告诉我们,当下它可以做什么,特别是对于操作系统爸爸而言,它会根据进程不同的状态去加载或者去释放资源,以免造成浪费,那么就需要一种机制来完成这样的事情,也就是下面讲的进程调度
进程调度
调度意味着被支配,说白了就是被系统用某种算法所支配,当然算法的成败,直接关乎着进程的吞吐量、CPU利用率、资源获取的公平性等,调度算法是极其复杂的,但有一种简单的算法规则你一定听过,那就是优先级算法,始终选择最高优先级的进程,作为下一个运行的进程,但当没有找到最高优先级进程时,该怎么办呢?这时该运行谁呢?其实这时系统给我们创建了一个空转进程,如果没有空转进程可以么?答:不可以,因为进程调度的基本原则是找到当前进程,找到要运行的进程,然后切换,如果当前进程是NULL,下一个要运行的进程也是NULL,调度器还怎么执行呢?会导致整个系统的停止,无法继续。说到进程切换,我们就深入了解下
进程切换
最本质的问题是切换了什么?搞懂这个,你才会明白,下面我画个图,辅助你理解下
每个进程都对应一个PCB数据结构,用来存储进程的控制信息,有了这些信息就可以在下次再回来时继续运行。PCB为Process Control Block 即进程控制块,数据结构如下:
- 进程状态,不用解释
- pid,进程ID,唯一性
- 寄存器,一般有通用寄存器、指令寄存器,通用的被用户空间访问,指令寄存器存放下一条指令,这样在恢复运行是就知道该干嘛
- 优先级,进程的优先级,本质是对CPU的控制权优先级大小
- 通信信息,进程间通信关系,由操作系统提供通信通道
- 资源,表现对资源的需求,比如打开的文件
- 等等
这里并没有列完整,由于对于不同的操作系统,可能有不同的数据结构,所以就不一一列举,希望你能明白的是,进程的切换的本质就是替换当前进程对象,改为跟他有一样类结构的对象而已。
拓展:
- 进程切换的源动力是陷阱机制,隶属中断的一种,而中断分为硬件中断和软件中断,简称硬中、软中,硬中45、软中65,嗯...都买不起,软中就是陷阱机制,陷阱本身也需要驱动,那它的驱动是?如程序异常,非法操作、地址越界、断点、除以0等等。
- 说到中断,不得不提,中断是用户态到内核态的唯一途径,是唯一,记住哦。
小结
似懂非懂,进程就这?不不,对于我们目前学习进程通信,这些知识也基本ok了,如果后面遇到了,再补充也来得及,毕竟我们在做开卷题,可以随便修改么不是,相信随着后面的不断深入和实践,会有一个完美答卷,下一篇再见。