进程和线程
进程
什么是进程
在操作系统中,操作系统需要对各种资源进行管理,大概可以分为以下几类:内存,文件,磁盘,进程。所谓进程就是操作系统有序管理应用程序的执行的方式,来保证以下几点:
1、所有资源对多个应用程序是可用的。
2、物理处理器在多个应用程序中切换,保证所有程序都在执行中。
3、处理器和I/O设备都能得到充分的利用。
因此所有现代操作系统都依赖于一个模型,在该模型中,一个应用程序对应一个或多个进程。进程的定义有以下几条:
1、一个正在执行的程序。
2、一个正在计算机上执行的程序实例。
3、能分配给处理器并由处理器执行的实体。
4、由一组执行的指令、一个当前状态和一组相关的系统资源表征的活动单元。
简单来说什么是进程,进程就是正在执行中的程序。而在操作系统中,操作系统为了更好的描述一个进程,于是将进程视为一些元素组成的实体,而其中最重要的两个元素是程序代码和数据集。一般来说一个程序有了程序代码和数据集就可以顺利执行了,但是操作系统说还不够,为了满足操作系统对进程的控制,例如调度,中断,执行等操作,操作系统将每个进程描述为一个叫做进程控制块(PCB) 的数据结构,在PCB中存储着操作系统对控制一个进程所需要的全部信息,可以根据PCB找到程序代码,找到程序的数据,程序获得的资源等等。所以一个进程对于操作系统来说就是一个PCB。PCB中所存储的信息我们在下文中有详细介绍。
知道了操作系统是通过PCB管理进程的后接下来讨论进程的状态。
进程状态
两状态模型
在多道操作系统中,我们假设现在的处理器都是单核的即同时只能有一个进程正在处理器中执行,但是操作系统为了让用户看上去所有进程都在“同时”运行于是他在操作系统中设置了时间片,即一个进程可以连续执行的最大时间,并且按照调度算法快速在不同进程间进行切换执行,执行中的进程状态为运行态,而未执行的则成为非运行态,其中关系如下图。
同时我们可以把非运行态的进程组织到队列中,每次切换进程从队列中调出一个进程开始运行,而切换下来的进程要么重新加入队列要么执行完毕退出,如下图。
这里提一下可能导致创建新进程的事件和可能导致进程退出的事件。
进程创建由以下4种事件触发:
1、新的批处理作业。新的批处理作业进入操作系统肯定会创建新的进程来执行批处理作业。
2、用户登录。用户登录往往也会创建新进程来执行用户指令,之所以使用进程是为了将用户与操作系统隔离,一个用户指令的崩溃不会影响到其他用户乃至操作系统。
3、为提供服务由操作系统创建。有时操作系统为了提供一个服务也会创建新的进程,例如用户进程请求打印一个文件,系统可以创建一个管理打印的进程,进而使请求进程可以继续执行。
4、由现有进程派生。当现有进程引发另一个进程的创建时,操作系统也会创建新的进程,这就是进程派生,这往往很有用,派生出的进程可以帮助主进程处理数据,组织数据等等。
进程的终止由以下14种事件触发:
1、正常完成。正常结束运行。
2、超过时限。进程运行超过规定的时限。
3、无内存可用。系统无法满足进程需要的内存。
4、超出范围。进程试图访问非法的内存单元。
5、保护错误。进程试图使用不允许使用的资源或文件。
6、算术错误。进程试图进行被禁止的运算。
7、时间超出。进程等待某一事件发生的时间超过了规定的时间。
8、I/O失败。在输入输出期间发生错误。
9、无效指令。进程试图执行一个不存在的指令。
10、特权指令。进程试图使用为操作系统保留的指令。
11、数据误用。错误类型或未初始化的一块数据。
12、操作员或操作系统干涉。操作员或操作系统终止进程。
13、父进程终止。在某些操作系统中,父进程终止时操作系统会自动终止该进程的所有子进程。
14、父进程请求。父进程要求终止其子进程。
五状态模型
如果所有进程都做好了准备,操作系统会从未运行队列中以轮转的方式调度每个进程。但是这里有个问题,如果并非所有进程都做好了准备呢?也许未运行的进程中有些进程正在等待某一事件的发生,也就是处于阻塞,因此单纯的对所有未运行的进程进行轮转是不科学的,应该对所有已经就绪的进程进行调度。解决这种问题的最好方法就是将未执行进程队列拆分为两个队列分别是就绪队列和阻塞队列,由此进程的状态由2状态变为了3状态,此外还要增加新建和退出态,这十分有必要。改进后的状态模型如下图所示。
运行态:进程正在执行。
就绪态:进程做好了准备,随时接收调度。
阻塞态:进程在等待某些事件的发生,在事件发生前不能执行,如I/O操作。
新建态:刚刚新建的进程,操作系统还未将其加载至内存,通常是PCB已经创建但是还并未加载到内存中的新程序。
退出态:操作系统从可执行进程组中释放的进程。
新建态与推出态十分有必要。在一个进程被新建时它并非绝对会被调入内存,通常是分两步,首先创建该进程的PCB,并与之关联,但是此时可能面临内存不足或者操作系统限制了最大进程数导致这个进程还无法被调入进程,因此该进程被暂时留在新建态,在这个状态的进程PC