程序有两种执行方式:① 顺序执行 ② 并发执行
顺序执行:单道批处理的执行方式,也用于简单的单片机系统,具有独立功能的程序独占cpu直到得到最终结果的过程
并发执行:现在的操作系统基本为并发执行,其引入目的是为了提高系统资源利用率
基本概念:一组逻辑上相互独立的程序或者程序段在执行时间上客观上互相重叠
优点:提高资源利用率
缺点:
上面提到了并发的概念,但是如果随意的执行并发,不做任何约束,将会有大量的错误结果产生,同时上面也提到了,不同的执行顺序,得到的结果也是不同的,也就是不再具有封闭性和结果的可再现性
这是为什么呢?这是因为公共变量进行了共享引起的
所以为了获取可再现性,我们需要增加一点约束条件,也就是把他现在存在的问题解决掉即:满足封闭性和可再现性
怎么做呢,首先我们需要消去共享资源(例如公共变量)带来的影响
在这里假定两个程序,A 和 B ,我们需要保证满足一些条件
上面虽然提出了三点要求,但是这几个点却并不好检查出来,这是因为程序未运行,谁也不知道并发的情况是如何的,资源是如何被争夺的等等,所以说这个时候,“程序” 这个静态概念已经不能很确切的反映程序活动的特征了,所以,“进程” 这个动态的概念就出现了,用来描述系统以及用户的程序活动
简单的理解:进程是程序的一次执行活动,它描述了程序动态执行的过程
进程 | 程序 |
---|---|
动态 | 静态 |
并发性 | 没有并发性 |
竞争系统资源的基本单位 | 不具有资源的竞争性 |
不同进程可以包含同一个程序,该程序对应的数据集不同 | 可以有多个进程 |
进程 | 作业 |
---|---|
具有独立功能的程序对某个数据集在CPU处理器上的执行过程 | 用户需要计算机完成某项任务时要求计算机所做工作的集合 |
执行任务的执行实体 | 用户向计算机提交任务的任务实体 |
(两者关系) | 一个作业可以由多个进程组成 |
做了一幅图,方便大家理解
动态性:进程对应程序的执行
独立性:各进程的地址空间相互独立,除非采用进程间通信手段
并发性:任何进程都可以同其他进程一起向前推进
异步性:每个进程都以其相对独立的不可预知的速度向前推进
结构化:进程 = 代码段 + 数据段 + PCB(进程控制块)
上面在进程的特点中提到了 进程 = 代码段 + 数据段 + PCB(进程控制块),下面就顺着介绍一个进程控制块这个内容
① 进程控制块,用来记录进程相关信息和管理进程而设置的,并且是由 OS 维护的一个特定的数据结构
② PCB 是进程动态特性的集中反映
③ PCB 结构的全部或部分常驻内存
④ PCB 随进程的创建而填写,随进程的撤消而释放
⑤ 系统利用 PCB 来控制和管理进程,所以 PCB 是系统感知进程存在的唯一标志
⑥ 进程与 PCB 是一一对应的
在上面的介绍中,又引申出了进程上下文这样的概念
进程上下文是对进程执行活动全过程的静态描述
进程上下文由进程的用户地址空间内容、硬件寄存器内容及与该进程相关的核心数据结构组成(正文段、 数据集、堆栈)
提前声明:在这部分,通常情况我们一般理解五个常用状态,新建、就绪、运行、等待、终止,就可以了,但是我们首先会讲讲比较关键的三种状态,此外,更细致的来说,这五种状态还不算特别精确,不过我们这里不考虑太多
一个进程已经具备了运行的条件,但是暂时还没有CPU调度,所以不能运行的状态
进程占有了包括CPU在内的全部资源,并且在CPU上运行
叫法挺多,可以叫做阻塞态、挂起态、封锁态、冻结态、睡眠态
它指的是进程因为等待某件事情的发生而暂时不能运行的状态
首先放一张图,来看一下对于三个状态的描述
我们按着图示的序号来分析一下
① 就绪 --> 运行
② 运行 --> 就绪
③ 运行 --> 阻塞
而这些状态之间的互相转换,也存在一定的联系和影响,例如:
刚才前面讲解的三种状态,是一个比较基本的状态,但是还是不完整的,还欠缺创建以及终止状态
创建状态:即创建一个新的进程
终止状态:一个进程结束
系统使用一些具有特定功能的程序段来创建、撤销进程并完成进程各状态间的转换,从而达到
定义:在系统模式下执行的某些特定功能的程序段
作用:通常把进程控制用的程序段作成原语
分类:
特点:作为原语的程序段不允许并发
进程控制原语有:
实施进程的创建、删除和切换过程中时空代价大,限制了系统中的进程数目和并发活动的程度。
所以现代操作系统中,进程作为资源的拥有者,调度和运行的属性赋予新的实体——线程
进程模型在处理“基于同数据区的同时多请求”时的效率局限性,例:售票系统:数据库服务器软件需同时处理来自多个用户进程的读盘请求,这些请求都是针对同一个盘,可以有如下几种方式:
分析:第一种方法没有并发,第二种方法切换的代价比较大。对于这种在一个进程内还可以有更多的子任务并发执行的情况,采用第三种方法效率更高,这就是采用了线程
进程 | 线程 |
---|---|
程序独立资源分配的基本单位 | CPU执行的基本单位 |
独立地址空间 | 共享同一地址空间与进程共享资源 |
调度开销较大 | 调度开销较小 |
下面是 copy 的一份解释,仅供参考
线程是在进程内用于调度和占有处理机的基本单位,它由线程控制表、存储线程上下文的用户栈以及核心栈组成。线程可分为用户级线程、核心级线程以及用户/核心混合型线程等类型。其中用户级线程在用户态下执行,CPU调度算法和各线程优先级都由用户设置,与操作系统内核无关。核心级线程的调度算法及线程优先级的控制权在操作系统内核。混合型线程的控制权则在用户和操作系统内核二者。线程与进程的主要区别有: (1) 进程是资源管理的基本单位,它拥有自己的地址空间和各种资源,例如内存空间、外部设备等;线程只是处理机调度的基本单位,它只和其他线程一起共享进程资源,但自己没有任何资源。 (2) 以进程为单位进行处理机切换和调度时,由于涉及到资源转移以及现场保护等问题,将导致处理机切换时间变长,资源利用率降低。以线程为单位进行处理机切换和调度时,由于不发生资源变化,特别是地址空间的变化,处理机切换的时间较短,从而处理机效率也较高。 (3) 对用户来说,多线程可减少用户的等待时间。提高系统的响应速度。例如,当一个进程需要对两个不同的服务器进行远程过程凋用时,对于无线程系统的操作系统来说需要顺序等待两个不同调用返回结果后才能继续执行,且在等待中容易发生进程调度。对于多线程系统而言,则可以在同一进程中使用不同的线程同时进行远程过程调用,从而缩短进程的等待时间。 (4) 线程和进程一样,都有自己的状态.也有相应的同步机制,不过,由于线程没有单独的数据和程序空间,因此,线程不能像进程的数据与程序那样,交换到外存存储空间。从而线程没有挂起状态。 (5) 进程的调度、同步等控制大多由操作系统内核完成,而线程的控制既可以由操作系统内核进行,也可以由用户控制进行。
减小并发执行的时间和空间开销(线程的创建、退出和调度),因此允许在系统中建立更多的线程来提高并发程度 线程的创建、终止时间比进程短;
同进程内的线程切换时间比进程短(上下文有许多是相同的)
由于同进程内线程间共享进程的代码、数据、内存和文件资源,可直接进行不通过内核的通信;而进程间的通信需要通过内核进行,以提供保护和通信所需机制
一个进程的所有线程必须同时处于挂起状态;进程的终止会导致所有线程的终止。
线程不适宜任务单一的、很少做进程调度和切换的实时系统、个人数字助理系统,最适宜多处理机系统
典型的应用环境举例如下: