进程管理(处理机管理,CPU管理)是计算机操作系统核心功能之一,它是多任务的基础,如果没有一个有效的进程管理手段,那在一台计算机上并发执行多个程序就是空谈。
在知道什么是进程管理之前首先要知道进程是什么,就像字面上一样,进程就是进行着的程序,进程不是程序,程序也不是进程,进程描述了程序执行的进度、状态等信息。为什么会引入进程的概念? 因为多任务的需要,系统中同时会有多个程序并发执行,必然会导致程序的交替执行,也就是说当一个程序可能还没有执行完的时候,就会因为操作系统的调度无法继续执行,但是并不是说这个程序到此结束了,在后面的某一时刻它可能就会再次因为操作系统的调度而继续执行,那此时就会涉及到一个问题,怎么回到上次停止时的状态,不可能让程序重头再来一遍吧?因此我们需要一个数据结构来描述这些信息,对吧?所以进程的概念就出来了,进程就是来干这个事情的。到这里大家应该能大概明白进程到底是什么东西,可以再和程序做一下对比,程序和进程的有什么关系?有什么区别?
程序与进程的区别:
- 程序是静止的,程序就是一个文件,与普通文件不同的是,程序是一个可执行的文件。
- 进程是动态的,打个比方? 进程是程序执行过程中的进度条!这个比喻单从描述进程作用来说算比较贴切,但是要说只是个进度条就不对了,看后面就会知道,进程实际上包含了更多内容,比如程序本身。大家知道程序就是有限长指令的序列,理想状态下,一个完整的执行过程就是从第一条指令一直执行到最后一条指令,然后程序执行完毕。进程就可以描述对应的程序执行到哪个指令了,此时是否仍在执行等。动态性体现在,进程随程序开始执行而被创建,执行结束而被销毁。
- 进程是一个数据结构,如果不理解可以继续往下看。
程序与进程的对应关系:
- 一个程序运行时可以有多个进程,比如我们的操作系统就是一个大程序,它运行的时候就有很多进程,可以ctrl+shift+esc打开任务管理器看看;再比如我们可以让一个程序执行多次,一台电脑上同时登陆两个QQ. 有人曾经让你帮ta挂qq升级吗?[滑稽]
- 一个进程可以为多个程序服务,这个栗子也很好举,还是我们的操作系统呀!!!
进程的组成:
- PCB(Process Control Block),进程控制块,前面所说的描述程序执行到哪条指令以及寄存器的状态等信息都在这里面存储。
- 程序
- 数据 如果学过汇编语言的话,2和3这两个会比较好理解一些,实际上一个程序中指令和数据是分开存放的,分别对应2和3
- 栈 这里面存储着程序运行时的调用信息,比如一个函数调用另一个函数,被调用函数执行完后又返回到调用函数继续执行,需要记下来调用函数执行到哪了,而且在被调用函数中声明的局部变量也会存储在这里。这也是为什么局部变量的作用域为什么只局限在声明这个局部变量的函数范围内,因为函数执行完毕,它的栈空间会被释放,变量也被释放了。
进程的状态:
进程描述着程序执行的状态,那都有哪些状态呢?
如图,第一张图有三个状态,第二张图有五个状态,五状态是三状态的扩展。最经典的三个状态是就绪,运行和阻塞。
就绪:当一个进程只要得到处理机就可以执行时,它就是处于就绪状态,很好理解哈,万事具备,就差调度了。只要轮到它,它就可以执行。
阻塞: 即使得到处理机也不能执行,比如它需要等待输入输出操作或者某个同步事件。
运行: 没得说,正在执行着。在单处理机的系统中,处于运行态的进程只有一个,但在多处理机的系统中,就可以有多个,个数小于等于处理机的个数。
因为创建和销毁进程时,计算机也有很多事情要做,所以为了便于管理又增加了这两种状态。
创建: 创建状态下的进程正处于创建过程中,还不能运行,系统需要为进程分配PCB,填写相关内容,分配所需资源,连接进程的父子关系等等一系列操作。创建完成后就会进入就绪态,进入就绪队列。不知道大家有没有这样的疑问,创建完毕的进程就一定是就绪的吗,它需要的资源可能得不到满足,得到处理机也无法执行。这样想是对的。我们继续想一下,它本应是阻塞态但是却被放入了就绪队列样怎样,它处于就绪队列,因此有机会被调度,被调度后检查发现资源不能满足然后进入了阻塞态。最终还是进入了阻塞态。
退出: 操作系统首先要将进程从运行态转为退出态,使其不能再执行,然后回收它占有的资源。
介绍了这几种进程的状态,他们之间的转换可以看上面的两张图,比较直观。
原语:
介绍了上面进程的各种状态和转换,我们有必要了解一下什么是原语。原语由若干条指令组成,是用于完成一定功能的过程,它与一般过程的区别在于,原语是一个原子操作,也就是不可分割的操作,要么不做要么就做完。就像你在厕所排出体内多余水分的时候,不能停~
比如创建进程时的创建原语,撤销进程的撤销原语等等,这些操作都必须是原子的,要么执行完毕要么不执行。
线程:
提出线程的目的是为了提高系统并发执行的程度。
现在很多软件都是多线程的,例如网页浏览器中有一个线程负责接收网络数据,有一个线程负责显示各种数据。多个进程也可以呀?为什么要多线程呢?
首先进程具有以下两个属性:
- 进程是一个可以拥有资源的独立单位
- 进程是一个可以独立调度的基本单位
由于进程既是资源的拥有者,同时又是调度的基本单位,所以在一个进程状态发生改变时,系统要做许多工作,比如创建一个进程时,要为它创建PCB,填写相关信息,还要为它分配各种资源,内存空间、I/O设备等。总而言之,正是因为进程同时具有这两个性质,导致多个进程切换时要付出相当的代价。为了解决这个问题,我们可以把这两个性质分开来,引入线程的概念。一个进程可以有多个线程,进程作为资源的分配单位,而线程作为调度的基本单位。
线程的组成:
- TCB(Thread Control Block) 线程控制块,和进程控制块(PCB)很像
- 描述处理机状态的一组寄存器
- 栈指针
- 私有存储区
与进程类似,线程也有几种状态,运行,阻塞,就绪等。
进程与线程的区别:
引入线程之后,进程作为资源分配的基本单位,线程作为调度的基本单位。线程作为一个轻型的单位,使得操作系统拥有更高的并发能力,一个进程可以有多个线程,这些线程共享所在进程的资源。在同一个进程中,线程的切换不会引起进程的切换,只有当一个进程中的线程切换到另一个进程中的线程时才会引起进程的切换。