操作系统原理-进程线程模型并发与同步
Posted 人生苦短我用Python哈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统原理-进程线程模型并发与同步相关的知识,希望对你有一定的参考价值。
一、进程线程模型
(一)多道程序设计模型
程序的顺序执行
程序是一个在时间上按严格次序前后相继的操作序列
顺序执行:一个具有独立功能的程序独占CPU直到得到最终成果
顺序性:严格按顺序执行,前一个动作的结束是后一个动作的前提条件,即程序和机器执行的活动严格对应
封闭性:程序的计算结果只取决于程序本身
程序执行结果的确定性:结果与执行速度、执行时间无关
程序执行结果的可再现性:初始条件相同,执行结果必相同
多道程序系统中程序执行环境的变化
(1)多道程序设计技术的引入
独立性:每道程序在逻辑上独立运行
随机性:程序和数据的输入与执行开始时间随机
资源共享性:系统资源被多道程序共享。资源共享对进程执行速度形成制约
并发程序在执行期间具有相互制约关系
资源共享和竞争,制约各道程序的执行速度,并发执行程序具有“执行--暂停--执行”的活动规律
程序与计算不再一一对应
并发程序执行结果不可再现
顺序执行的特点:
顺序性和封闭性是一切程序所应具有的特性
在多道程序操作系统中,顺序程序的上述特性不复存在。
对于单CPU,并发程序按给定的时间片交替执行;对于多CPU,并发程序在各自CPU运行。
(2)多道程序设计环境的特点
(3)程序的并发执行
程序并发执行与顺序执行时的不同特性
多个用户作业调用一个共享程序段,形成多个“计算”
并发程序执行结果与其执行的相对速度有关,是不确定的。
多道程序并发执行时指在宏观上的,从微观上看,在单CPU系统中,仍然是顺序执行的
(二)进程模型
进程的概念
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
联系:程序是构成进程的组成部分之一,进程的运行目标是执行它所对应的程序。进程由程序、数据和进程控制块(PCB)组成
区别:程序是静态、永久的,进程是动态、暂时的。进程具有创建其他进程的功能
并发性
动态性:一是进程的产生和消亡是动态;二是在进程生命周期内,其状态动态变化
独立性:进程是一个相对完整的资源分配单位
交往性:进程间可能发生直接或间接的相互作用
异步性:各个进程独立运行
进程的状态及其状态转换
运行状态:进程占用CPU资源,处于此状态的进程数目小于等于CPU数目
就绪状态:已获得除CPU之外的所有资源,等待CPU分配运行
等待状态:也称为阻塞状态和封锁状态,因某个资源被占用或等待进程同步便处于等待状态。一旦引起等待的原因消失,便进入就绪状态
结束状态:进程已结束运行,回收处进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记账和将推出代码传递给父进程)
阻塞挂起状态:进程在外存并等待某事件的出现
就绪挂起状态:进程在外存,但只要进入内存,即可运行
进程控制块(PCB)
为便于系统控制和描述进程的活动过程,在操作系统核心中为进程定义的专门的数据结构。是进程存在的唯一标志。
(1)PCB的内容:调度信息和现场信息
(2)进程的组成:指令、数据、进程控制块
线性方式:不分状态组织在一个联系表(PCB表)中,结构简单,需扫描整个PCB表,适用于进程数目不多的系统
链接方式:
就绪队列:整个系统一个,某些系统可能有若干个
等待队列:每个等待事件各一个
运行队列:单CPU系统中整个系统有一个。实际上,一个运行队列只要一个进程,可用一个指针指向该进程
进程控制
对进程在整个生命周期中各种状态之间的转换进行控制,通过原语实现。
(1)进程与程序的联系和区别
(2)进程的特性
为刻画进程的变化过程,操作系统将进程分成若干状态,并约定各种状态间的转换条件。
(1)三状态模型
任何时候,任何进程都处于且处于三种状态之一,状态转换由操作系统完成,对用户透明。
(2)五状态模型
在三状态模型的基础上增加创建状态和退出状态描述进程创建和退出过程。
(3)七状态模型
(3)PCB组织
(4)进程队列
(1)进程控制原语
创建进程、撤销进程、挂起进程、激活进程、阻塞进程、唤醒进程以及改变进程优先级
(2)UNIX类操作系统的进程控制操作
父进程通过fork()函数创建子进程,子进程与父进程出pid不同外,其余基本相同;通过调用exec()函数替换原父进程代码;通过wait()函数使父进程获取子进程的接收状态并回收资源。
一般子进程不使用exit()函数,而是使用内核的_exit()函数退出,并等待父进程回收。
信号signal是UNIX处理异步事件的经典方法,信号是进程控制的一部分
(三)线程模型
线程的引入
将进程的调度和分配属性分开,引入线程,以降低系统在进程的创建、撤销和切换时的时空开销
线程的基本概念
线程是进程的一个实体,是CPU调度和分派的基本单位。线程只拥有一点在运行中必不可少的资源(程序计数器、一组寄存器和栈),可与同属一个进程的其他线程共享进程所拥有的全部资源。线程可创建、撤销另一个线程,同一个进程的多个线程间可以并发执行。线程也拥有就绪、等待和运行三种基本状态,在某些系统中还拥有终止状态。
(1)线程的属性
(2)引入线程的好处
(3)线程与进程的比较
调度:线程作为调度和分派的基本单位,进程作为资源拥有的基本单位。
并发性:线程也可并发执行。
拥有资源:线程共享进程资源
系统开销:线程系统开销小于进程
线程实现机制
(1)用户级线程
只存在于用户态中,通过函数库实现,不依赖于内核,在运行时系统的顶部运行,支持的典型操作系统是Linux。
优点:可以在不支持线程的操作系统上实现;线程切换更快;允许每个进程有自己定制的调度算法。
(2)内核级线程
线程的调度与切换速度
两者调度方式相似;用户级线程无需内核陷入,切换速度快。
系统调用
在进行系统调用时,用户级线程会封锁整个进程,内核级线程封锁相应的线程。
线程执行时间
用户级线程:CPU时间分配以进程为基本单位;内核级线程:CPU时间分配以线程为基本单位。
Pthread线程包
为编写线程程序,IEEE标准1003.1c定义了线程标准,Pthread基于该标准实现。大部分UNIX系统都要支持该标准,该标准定义了超过60个函数调用。
依赖于内核,在内核中保留一个线程控制块,支持的典型操作系统是Windows
用户级线程和内核级线程的比较
(3)混合实现方式
部分系统同时实现用户级线程和内核级线程,典型操作系统是Solaris。
使用内核级线程,然后将用户级线程与某些或全部内核级线程多路复用。该方法,内核只识别内核级线程,并对其调度,由内核级线程对用户级线程进行创建、撤销、调度。每个内核级线程对应一个可以轮流使用的用户级线程集合。
(四)进程(线程)调度
控制、协调进程(线程)对CPU的竞争,完成物理CPU转变成多台虚拟(或逻辑)CPU的工作。
概述
(1)进程(线程)调度的主要功能
(2)进程(线程)调度的时机
调度算法设计原则
(1)进程行为
进程根据I/O请求和计算所需的时间,分为计算密集型(CPU密集型)和I/O密集型。因CPU升级改进远快于磁盘,故对I/O密集型进程的调度处理更重要。
(2)系统分类
(3)调度算法的设计目标
公平:相似的进程应该得到相似的服务
强制执行:保证某种特定进程强制执行
进程(线程)调度算法
保持系统的所有部分尽可能忙碌
均衡性
高可预测和有规律
解决以何种次序对各就绪进程(线程)进行CPU分配和按何种时间分配比例让进程(线程)占用CPU。
(1)先来先去服务(FCFS)
非强占式,先来后到,依次排队等待运行,出现计算密集型的长作业会造成后续作业的长等待。
(2)最短作业优先(SJF)
适用于运行时可以预知的另一个非抢占式的批处理调度算法,需在所有的作业都同时处于可运行状态下,才能使用,短作业源源不断进入时,会使长作业处于“饥饿”。
(3)最短剩余时间优先(SRTN)
最短作业优先的抢占式版本,剩余运行时间最短的进程优先运行。
(4)最高响应比优先算法(HRRF)
在批处理系统中,其性能介于先来先去服务和最短作业优先算法之间。
响应比Rp=(等待时间+预计运行时间)/预计运行时间=周转时间/预计运行时间
响应比在每次调度前计算,需消耗系统资源,存在一定的系统开销。
(5)轮转法(RR)
源自分时系统,采用时间片轮转。时间片长度非常重要,直接影响系统开销和响应时
(6)最高优先级算法(HPF)
优先数确定优先级,该算法与CPU调度结合,形成可抢占式最高优先级优先算法和不可抢占式最高优先级算法。
将进程按优先级分组,各组间采用优先级调度,组内采用轮转调度。该方法需对优先级进行调整,否则低优先级进程可能产生饥饿现象。
(7)多级反馈队列算法
综合了先进先出算法、时间片轮转算法和可抢占式最高优先级算法。
(8)最短进程优先
(9)实时系统中的调度算法
通过把程序划分为一组进程来实现实时性能,其中每个进程的行为都是可预测和提前掌握的
可调度实时系统需满足的条件
静态调度算法在系统开始运行之前作出调度决策,需提前掌握所完成的工作以及必须满足的截止时间等全部信息;动态调度算法反之。
①速率单调调度算法(RMS)
适用于可抢先的周期性进程的经典静态实时调度算法
②最早最终时限优先算法(EDF)
二、并发与同步
(一)进程(线程)间相互作业
相关进程和无关进程
相关进程:在逻辑上具有某种联系的进程
与时间有关的错误
多个并发程序共享公共变量,造成程序的计算结果与并发程序执行的速度有关。而这种错误结果与时间相关,故称为“与时间有关的错误”。
无关进程:在逻辑上没有任何联系的进程
(二)进程互斥
进程互斥的解决方法:竞争各方平等协商;引入进程管理者,由管理者来协调竞争各方对互斥资源的使用
基于进程间平等协商的互斥算法
临界资源:计算机系统中需要互斥使用的硬件或软件资源
只读数据:可以同时访问的共享资源,但不是临界资源
计算机系统中资源共享的层次
互斥:多个进程不能同时使用资源
死锁:进程间互不相让,彼此都得不到足够资源
饥饿:某些程序一直得不到资源或得到资源的概率很小
进程间的相互制约关系
临界资源的访问过程
进程同步机制的原则
基于进程间平等协商互斥算法的软件方法
通过进入区检查设置标志,在退出区修改标志的方式实现。该方法不适用于数目很多的进程间的互斥
算法1:单标志算法
通过设置进入区循环检查变量,只有当变量为本进程标识时,方可进入临界区,当进程退出临界区时,修改变量值。
基于进程间平等协商互斥算法的硬件方法
利用某些硬件指令来实现进程互斥,即用一条指令完成读和写两个操作,保证读操作和写操作不被打断。
依据指令不同,分为TS指令和Swap指令
TS指令
读出指定标志后将该标志设置为TRUE
Swap指令(或Exchange指令)
优缺点
缺点:强制轮流进入临界区,容易造成资源利用不充分
算法2:双标志、先检查算法
算法3:双标志、后检查算法
算法4:先修改、后检查、后修改者等待算法
优点:
①适用范围广:适用 任意数目的进程,在单CPU和多CPU环境中完全相同;
②简单:标志设置简单,含义明确,容易验证其正确性;
③支持多个临界区:当进程内有多个临界区时,只需为每个临界区设立一个布尔变量。
缺点:
①进程在等待进入临界区时,要耗费CPU时间,不能实现“让权等待”;
②由于进入临界区的进程是从等待进程中随机选择,有的进程可能一直选不上,从而导致“饥饿”。
(三)信号量
是由操作系统提供的管理公有资源的有效手段,代表可用资源实体的数量。
(四)经典的进程同步问题
详见P84-P91。
(五)管程
管程的提出
管程的概念及组成
管程是由过程、变量及数据结构等组成的集合,组成一个特殊的模块或软件包,进程可随时调用管程中的过程,但是不能再管程之外声明的过程中直接访问管程内的数据结构。
管程由四部分组成:管程名称、共享数据的说明、对数据进行操作的一组过程和对共享数据赋初值的语句。使用类Pascal语言编写,不能使用C语言,因为管程是语言特性而C语言不支持。
模块化:一个管程是一个基本程序单位,可以单独编译;
抽象数据类型:管程是一种特殊的数据类型,其中不仅有数据,而且有对数据进行操作的代码;
信息隐蔽:管程是半透明的,管程中的外部过程(函数)实现了某些功能,而功能是如何实现的,外部则不可见。
管程中的条件变量
Pthread中的互斥与同步
互斥量及相关函数
条件变量及相关函数
管程能保障共享资源的互斥执行。
管程的三个主要特性:
管程互斥由编译器负责,程序员只需知道将所有的临界区转换成管程过程即可。
通过互斥量和条件变量,组合实现管程的效果
基本思想:通过使用一个可以加锁和解锁的互斥量来保护临界区。互斥量没有加锁便可进入,并自动加锁。
(六)进程通信
进程间大量信息通信的解决方案:共享内存、消息机制、通过共享文件通信(管道通信)
共享内存
操作系统提供要共享的内存空间,程序开发人员需处理进程互斥关系
消息机制
消息缓冲通信
根据“生产者-消费者”原理,利用内存中公用消息缓冲区实现进程间的信息交换。
对消息队列的操作是临界区
信箱通信
在进程间设立通信机构“信箱”,信箱由发送方创建。
管道通信
通过信箱间接通信,发送方和接收方不必直接建立联系,双方独立工作,没有处理时间限制。
通信规则:
以上是关于操作系统原理-进程线程模型并发与同步的主要内容,如果未能解决你的问题,请参考以下文章