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