操作系统——进程

进程的定义

程序:一个指令序列
PCB:进程控制块,用来描述进程的各种信息,是系统为每个运行的程序配置的一个数据结构。
程序段数据段PCB三部分构成了一个进程实体(进程映像)。一般情况下,进程实体就是进程。严格来说是不一样的,进程实体是静态的进程是动态的
PCB是进程存在的唯一标志

进程的几种典型定义:(强调“动态性” )
1.进程是程序的一次执行过程
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动
3.进程是具有独立功能的程序数据集运行的过程,它是系统进行资源分配和调度的一个独立单位。
4.进程是进程实体运行过程,是系统进行资源分配和调度的一个独立单位

进程的组成(进程内部)

进程(进程实体)是由程序段数据段PCB三部分组成。

1.程序段:存放程序代码

2.数据段:存放定义的变量、运算时使用或产生的数据。

3.PCB:存储操作系统对进程进行管理时所需的各种信息。
 包含信息:
 1)进程描述信息:进程标识符PID(进程创建时操作系统分配的独一无二的标识符,用于区分进程)、用户标识符UID
 2)进程控制和管理信息:进程当前状态、进程优先级
 3)资源分配清单:程序段指针、数据段指针、键盘、鼠标
 4)处理机相关信息:各种寄存器(用于进程状态)

进程的组织(进程外部)

1.链接方式(指向的是单个进程或者队列头)
1)执行指针:指向当前正在执行的指针,单CPU计算机内,同一时刻只能指向一个进程;
2)就绪队列指针:指向当前处于就绪态的进程。通常会把优先级高的放在队列前面;
3)阻塞队列指针:指向当前处于阻塞态的进程。

2.索引方式(指向的是索引表)
与链接方式一样,分为三个。

进程的特征

1.动态性:进程是程序的一次执行过程,是动态产生、变化和消亡的;动态性是进程最基本的特征
2.并发性:内存中有多个进程实体,各进程可以并发执行;
3.独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位,是资源分配、接受调度的基本单位
4.异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题;可能会导致运行结果的不确定性
5.结构性:每个进程都会配置一个PCB,结构上看,是由程序段、数据段、PCB组成的。

进程的状态及状态转换

1.运行态:【基本状态】占有CPU,并在CPU上运行;单核处理机的情况下,某一时刻只能处理一个进程。
2.就绪态:【基本状态】已经具备运行条件,但没有空闲的CPU,导致不能运行。万事俱备,各种资源都已经获得,只差一个CPU。
3.阻塞态(等待态):【基本状态】因等待某一事件而暂时不能运行。如:等待操作系统分配打印机、等待读磁盘操作的结果。
4.创建态(新建态):进程正在被创建,操作系统为进程分配资源,初始化PCB;
5.终止台(结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB

状态转化:

五状态模型:
在这里插入图片描述
七状态模型:
在这里插入图片描述

进程控制

主要功能就是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转化等功能。

进程控制就是要实现进程状态转化。

原语:用于实现进程控制,执行期间不允许中断,不可中断的操作称为原子操作。

原语采用“关中断指令”和“开中断指令”,一旦执行了“关中断指令”,那么在执行到“开中断指令”之前,中间是不会被打断的。

关/开中断指令的权限非常大,只能是在核心态下执行的特权指令

原语类型:

创建原语、撤销原语、阻塞原语(运行态->阻塞态)、唤醒原语(阻塞态->就绪态)、切换原语

原语功能:

1.更新PCB中的信息:
 1)所有的进程控制原语一定都会修改进程状态标志
 2)剥夺当前运行的CPU使用权必然需要保存其运行环境
 3)某进程运行前,必然要恢复其运行环境
2.将PCB插入合适的队列
3.分配/回收资源

进程通信

定义:进程之间的信息交换。

1.共享存储
两个进程对共享空间的访问必须是互斥的,一个访问、另一个就不能访问。
 1)基于数据结构的共享
 2)基于存储区的共享
2.消息传递
进程间的数据交换以格式化的消息(消息头+消息体)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
 1)直接通信方式:消息直接挂到接收方的消息队列里
 2)间接通信方式:消息先发送到中间体(信箱)中
3.管道通信
1.采用
半双工通信
,如果要实现双向同时通信,需要设置两个管道。
2.各进程要互斥地访问管道
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待都进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
4.如果没写满,就不允许读。如果没读空,就不允许写
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错的情况。

线程

线程是一个基本的CPU执行单位,也是程序执行流的最小单位
在这里插入图片描述

线程的属性:

1.线程是处理机调度的单位
2.多CPU计算机中,各个线程可占用不同的CPU
3.每个线程都有一个线程ID、线程控制块(TCB)
4.线程也有就绪、阻塞、运行三种基本状态
5.线程几乎不拥有系统资源
6.同一进程的不同线程间共享进程的资源
7.由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
8.同一进程中的线程切换,不会引起进程切换
9.不同进程中的线程切换,会引起进程切换
10.切换同进程内的线程,系统开销很小
11.切换进程,系统开销较大

线程的实现方式:

1.用户级线程:由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责,用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。用户级线程对用户不透明,对操作系统透明。从用户视角看的线程
2.内核级线程:内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。从操作系统视角看的线程

内核级线程才是处理机分配的单位。

多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高;
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
在这里插入图片描述

多线性模型:

一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
在这里插入图片描述

多对多模型: n用户及线程映射到m个内核级线程(n >= m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
在这里插入图片描述

调度

有一堆事情要处理,但是资源有限,这些事情没法同时处理,此时需要确定某种规则来决定处理这些任务的顺序,这就是 “调度”。

处理机调度:

从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

调度的三个层次

1.高级调度(作业调度):
按一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(PCB),以使他们获得竞争处理机的权利
高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

2.中级调度(内存调度):
决定要哪个处于挂起状态的进程重新调入内存。暂时调到外存等待的进程状态为挂起状态。但PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。

3.低级调度(进程调度):
按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。频率很高,一般几十毫秒一次。

要做什么调度发生在…发生频率对进程状态的影响
高级调度(作业调度)按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程外存->内存(面向作业)最低无->创建态->就绪态
中级调度(内存调度)按照某种规则,从挂起队列中选择合适的进程将其数据调回内存外存->内存(面向进程)中等挂起态->就绪态(阻塞挂起->阻塞态)
低级调度(进程调度)按照某种规则,从就绪队列中选择一个进程为其分配处理及内存->CPU最高就绪态->运行态

进程调度

不能进行进程调度与切换的情况:
1.在处理中断的过程中。中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。
2.进程在操作系统内核程序临界区中。
3.在原子操作过程中。原子操作不可中断。

临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)

进程调度的方式

1.非抢占方式(非剥夺调度方式): 只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。

2.抢占方式(剥夺调度方式): 当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
可以优先处理更紧急的进程,也可以实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。

进程调度与进程切换的区别:
狭义上:
进程调度:从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停的进程,也可以是另一个进程,如果是另一个进程,那么就需要进程切换)
进程切换:是指一个进程让出处理机,由另一个进程占用处理机的过程。

进程的切换和调度是有代价的,并不是调度频率越高,并发度就越高。

进程调度性能的评价指标

1.CPU利用率=忙碌的时间/总时间

2.系统吞吐量=总共完成了多少道作业/总共花了多少时间

3.1)周转时间=作业完成时间-作业提交时间
2)平均周转时间=各作业周转时间之和/作业数
3)带权周转时间=作业周转时间/作业实际运行的时间=(作业完成时间-作业提交时间)/作业时间运行的时间
4)平均带权周转时间=各作业带权周转时间之和/作业数
周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。
它包括四个部分:
1)作业在外存后备队列上等待作业调度(高级调度)的时间、
2)进程在就绪队列上等待进程调度(低级调度)的时间、
3)进程在CPU上执行的时间、
4)进程等待I/o操作完成的时间。
后三项在一个作业的整个处理过程中,可能发生多次。

4.等待时间
对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。
对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

5.响应时间
用户提交请求到首次产生响应所用的时间

调度算法

1.先来先服务(FCFS)【适合早期的批处理系统】
1)算法思想:主要从“公平”的角度考虑
2)算法规则:按照作业/进程到达的先后顺序进行服务
3)用于作业/进度调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列。
4)是否可抢占:非抢占式的算法
5)优点:公平、算法实现简单
6)缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好,即,FSFC算法对长作业有利,对短作业不利
7)是否会导致饥饿:不会

例题——先来先服务:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.短作业优先(SJF)【适合早期的批处理系统】
1)算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
2)算法规则:按最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
3)用于作业/进度调度:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Shortest Process First)算法”
4)是否可抢占:SJF和SPF是非抢占式的算法。但是也有抢占式的版本――最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)。
5)优点:“最短的”平均等待时间、平均周转时间
6)缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先
7)是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”

例题——非抢占式短作业优先:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题 ——抢占式短作业优先:

在这里插入图片描述
在这里插入图片描述
ATTENTION!
在这里插入图片描述

3.高响应比优先(HRRN)【适合早期的批处理系统】
1)算法思想:要综合考虑作业/进程的等待时间和要求服务的时间
2)算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
响应比=(等待时间+要求服务时间)/要求服务时间
3)用于作业/进度调度:既可用于作业调度,也可用于进程调度
4)是否可抢占:非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
5)优点:综合考虑了等待时间和运行时间(要求服务时间)。等待时间相同时,要求服务时间短的优先(SJF的优点)要求服务时间相同时,等待时间长的优先((FCFS的优点)对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
6)是否会导致饥饿:不会

例题——高响应比优先:

在这里插入图片描述
4.时间片轮转(RR)【交互式系统】
1)算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
2)算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
3)用于作业/进度调度:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)
4)是否可抢占:若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片已到
5)优点:公平;响应快,适用于分时操作系统;
6)缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
7)是否会导致饥饿:不会

例题——时间片轮转:

在这里插入图片描述
在这里插入图片描述
5.优先级调度算法【交互式系统】
1)算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理顺序
2)算法规则:调度时选择优先级最高的作业/进程
3)用于作业/进度调度:既可用于作业调度,也可用于进程调度。甚至,还会用于I/O调度
4)是否可抢占:抢占式、非抢占式都有。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。
5)优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。
6)缺点:若源源不断地有高优先级进程到来,则可能导致饥饿。
7)是否会导致饥饿:会

例题——非抢占式优先级调度算法

在这里插入图片描述

例题——抢占式优先级调度算法

在这里插入图片描述

6.多级反馈队列调度算法【交互式系统】
1)算法思想:对其他调度算法的折中权衡
2)算法规则:a.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大;b.新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾;c.只有第k级队列为空时,才会为k+1级队头的进程分配时间片
3)用于作业/进度调度:用于进程调度
4)是否可抢占:抢占式的算法。在k级队列的进程运行过程中,若更上级的队列(1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。
5)优点:对各类型进程相对公平(FCFS的优点)﹔每个新到达的进程都可以很快就得到响应(RR的优点)﹔短进程只用较少的时间就可完成(SPF的优点)﹔不必实现估计进程的运行时间(避免用户作假);可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/o密集型进程(拓展:可以将因I/o而阻塞的进程重新放回原队列,这样1/o型进程就可以保持较高优先级)
6)是否会导致饥饿:会

例题——多级反馈队列调度算法:

在这里插入图片描述

进程同步

解决异步问题,就是进程同步所讨论的问题。
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。

进程互斥

对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系
进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

对临界资源的访问,在逻辑上分为以下四个部分:

1.进入区⭐:负责检查是否可以进入临界区,若可进入,则应设置正在访问临界资源的标志 (上锁) ,以阻止其他进程同时进入临界区。
2.临界区⭐:访问临界资源的那段代码
3.退出区⭐:负责解除正在访问临界资源的标志 (解锁)
4.剩余区:做其他处理

为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:

1.空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
2.忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
3.有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
4.让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

进程互斥的软件实现方法

1.单标志法
两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程赋予
违背“空闲让进”原则
在这里插入图片描述

2.双标志先检查
设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]=ture”意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
先检查,后上锁
违背“忙则等待”原则
在这里插入图片描述

3.双标志后检查
先上锁,后检查。
违背“空闲让进”和“有限等待”原则
在这里插入图片描述

4.Peterson算法
在双标志后检查法的前提下,如果双方都争着进入临界区,就设置一个变量,主动让对方先使用临界区。
遵循了空闲让进、忙则等待、有限等待三个原则,但是没有遵循让权等待的原则。
在这里插入图片描述

进程互斥的硬件实现方法

1.中断屏蔽方法
利用“开/关中断指令”实现(与原语相似)
优点:简单、高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开关中断指令权限比较大,不能被用户使用)。

2.TestAndSet(TS指令/TSL指令)
是用硬件实现的,执行的过程中不允许被中断,只能一气呵成。
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

3.Swap指令(XCHG指令)
是用硬件实现的,执行的过程中不允许被中断,只能一气呵成。
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

信号量机制⭐

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置-一个初值为1的信号量。

一对原语: wait(S)原语signal(S)原语 ,可以把原语理解为函数,函数名分别为wait和signal,括号里的信号量S就是函数调用时传入的一一个参数。
wait、signal 原语常简称为P、V操作(来自荷兰语proberen和verhogen)。因此,常把wait(S)、signal(S) 两个操作分别写为 P(S)、V(S)

1.整形信号量
用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。对信号量的操作只有三种—— 初始化、P操作、V操作
在这里插入图片描述
不满足“让权等待”原则,会发生“忙等”

2.记录型信号量⭐
用记录型数据结构表示的信号量。
在这里插入图片描述
遵循了“让权等待”原则。

用信号量机制实现进程互斥

1.分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应该放在临界区)
2.设置互斥信号量 mutex,初值为1
3.在临界区之前执行P(mutex)
4.在临界区之后执行V(mutex)
在这里插入图片描述

用信号量机制实现进程同步

1.分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
2.设置同步信号量S,初始为0
3. 在 “前操作”之后 执行V(S)
4. 在 “后操作”之前执行P(S)
在这里插入图片描述

用信号量机制实现进程的前驱关系

1.要为每一对前驱关系各设置一个同步变量
2.在“前操作”之后对相应的同步变量执行V操作
3.在“后操作”之前对相应的同步变量执行P操作
在这里插入图片描述

在这里插入图片描述

  • 11
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值