操作系统之进程管理

文章目录

进程与线程

1.进程的概念

Windows的资源管理器里面每一条就是一个进程。
程序的执行分为:
 顺序执行
 并发执行
程序并发执行会带来一些问题
如果程序A、B,他们共享一个变量N,程序AB以不同速度执行(失去了封闭性,导致不可再现性)
A程序

N = N+1;

B程序

print(N);
N = 0;

并发执行结果有三种

  1. N = N + 1;–>print(N);->N=0;
  2. print(N);–>N = N + 1;->N=0;
  3. print(N);–>N=0;->N = N + 1;

为了解决在多道程序设计的环境下,为了描述程序在计算机系统内的执行情况,引入新的概念–进程
进程定义:计算机中的所有程序(软件),按照某种顺序运行,这种运行过程称之为进程。
程序与进程的区别:
程序是静态的,永久存在
进程比较典型的定义:
  是程序的一次执行
  是一个程序及数据在处理机上顺序执行时所发生的活动
  是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立的单位
  引入进程实体的概念后,进程的定义:是进程实体运行的过程,是系统进行资源分配和调度的一个独立的单位
一个进程应该包括什么(进程实体的概念)?
程序运行时的所有信息

  1. 程序的代码和数据
  • CPU寄存器的数值
  • 堆和栈
  • 系统资源,地址空间,打开的文件
    2.进程控制块(PCB-Process Control Block)
    就是一个数据结构,用来存储程序向前推进的执行过程中要记录的有关运行信息,即进程动态执行的相关资料。

进程实体= 程序段+数据段+PCB

2.进程的状态与转换

  • 就绪状态Ready
    可运行的,已获得CPU外的所有资源,等待分配CPU一个系统中多个处于就绪状态的进程排成就绪队列
  • 执行状态Runing
    占用CPU运行,处于此状态的进程的数目<=CPU数,没有其他进程执行时(如程序进程都在阻塞状态),通常会自动执行系统的idle进程(空操作)
  • 阻塞状态Blocked
    等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即时把处理机分配给该进程,也无法执行,通常阻塞进程也排成一个阻塞队列。
  • 创建状态
    进程刚建立,还未进入就行队列
  • 终止状态
    进程已(正常或异常)结束,已从就绪队列中移出,但尚未撤销。暂留,以便其他进程收集该进程的有关信息。

进程的三种基本状态转换图
进程的三种基本状态
挂起状态(静止状态):源于我们的虚拟存储,由于程序优先级的引入,一些低优先级进程可能等待时间较长,从而被对换至外存。

  • 提高处理机效率:就绪进程表为空时,要提交新进程,以提高处理机效率。
  • 为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张
  • 用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写)
    挂起的3中状态
  • 就绪挂起:进程不调度
  • 阻塞挂起:进程即使引起阻塞的事件消失也不调度
  • 运行到就绪挂起:进程暂停
    激活状态:进程从外存转到内存
  • 就绪激活:静止就绪到活动就绪
  • 阻塞激活:静止阻塞到活动阻塞
    在这里插入图片描述

3.进程控制

进程控制之前先描述PCB(进程控制块)
PCB块(进程控制块)的所用:(是系统感知进程存在的唯一标识)是使一个在多道程序环境下不能独立运行的程序(含数据)称为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。或者说OS是根据PCB来对并发执行的进程进行控制和管理的

3.1进程控制块的信息

3.1.1进程标识符

用于唯一的标识一个进程。通常有两种标识符:

  • 内部标识符,在所有的操作系统中,都为每一进程赋予一个唯一的数字标识符,方便系统使用。

在Linux中:杀死进程kill -9 PID,这里的PID就是内部标识符
在Windows:进程管理详细里面的PID也是内部标识符

  • 外部标识符,它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。为了描述进程的家族关系,还应设置父进程标识及子进程标识。此外,还可设置用户标识,以指示拥有该进程的用户。
3.1.2处理机状态(CPU现场保护区)

主要由CPU的各种寄存器中的内容组成

  • 通用寄存器:用户可视寄存器,使用户程序可以访问的,用于暂存信息。
  • 指令寄存器:存放要访问的下一条指令的地址;
  • 程序状态字PSW其中含有状态信息,如条件码、执行方式、中断屏蔽标志;
  • 用户栈指针:指每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶。
3.1.3进程调度信息

存放与进程调度和进程对换有关的信息,包括

  • 进程状态:指明进程的当前状态,作为进程调度和对换时的依据。
  • 进程优先级:描述进程使用处理机的优先级别的一个整数,调度依据,高者优先获取处理机。
  • 进程调度所需的其他信息:他们与所采用的进程调度算法有关,比如:进程已等待CPU的时间总和、进程已执行的时间总和等。
  • 事件:是指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
3.1.4进程控制信息
  • 程序和数据的地址:是指进程的程序和数据所在的内存或外存地址,以便再调度到该进程执行时,能从PCB中找到其程序和数据;
  • 进程同步和通信机制:指实现进程同步和进程通信必须的机制,如消息队列指针、信号量等;他们可能全部或部分放在PCB里。
  • 占用资源清单:列出除CPU以外的、进程所需的全部资源以及分配到该进程的资源清单;
  • 链接指针:它给出本进程(PCB)所在的队列中的下一个进程的PCB的首地址。
  • 家族联系:指明本进程与家族的关系。如它的子进程与父进程的标识。

3.2进程控制

  • 对系统中全部进程实施有效管理:包括
  1. 创建新进程:
    进程图:用于描述一个进程的家族关系的有向树,树中的节点表示进程。
    在进程Pi创建了进程Pj之后称Pi是Pj的父进程,Pj是Pi的子进程。子进程可以继承父进程的资源。
    撤销父进程时必须同时撤销子进程
    进程图示例:
    进程图
    引起创建进程的事件:在多道程序环境中,要运行程序,必须为其创建进程(就是要不要创建PCB块)
    1)用户登录:分时系统的用户在终端登录后,如:合法用户,系统将为其创建一个进程,并插入就绪队列
    2)作业调度:在批处理系统中,当作业调度程序调度到某作业时,将该作业装入内存,为它分配资源并创建进程。
    3)提供服务:当运行中的用户进程提出某种请求后,系统将专门创建一个进程来提供服务,如打印服务。
    4)应用请求:由应用程序为自己创建进程,以便能并发执行,如:输入、计算、输出程序。
    创建过程
    1)申请空白PCB:为新进程申请唯一的数字标识符,并从PCB集合中索取一个空白的PCB
    2)为新进程分配资源:为新进程的程序和数据分配内存
    3)初始化进程控制块:
    a.初始化标识信息:将系统标识信息写入新PCB
    b.初始化处理机状态信息:使程序计数器指向程序的入口地址,栈指针指向栈顶。
    c.初始化处理机控制信息:将进程的状态设为就绪状态或静止就绪状态。
    4)将新进程插入就绪队列:如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。
  2. 终止已结束进程:引起进程终止的事件
    1)正常终止:应有一个通知OS进程已经运行完成的指令,如:在批处理系统中,通常在程序最后安排一条Halt指令或终止的系统调用。当程序执行Halt指令时,将产生一个中断,通知OS本进程已经完成。
    2)异常终止:在程序运行期间,由于出现某些错误和故障而迫使进程终止。
    a.越界错误:这是指进程所访问的存储区,已经越出该进程的区域。
    b.保护错:进程试图访问一不允许访问的资源或文件,或者以不适当的方式进行访问
    c.非法指令:程序试图执行一条不存在的指令。出现该错误的原因,可能是程序错误的转移到数据区,把数据当成指令
    d.特权指令错:用户试图去执行一条只允许OS执行的指令
    e.运行超时
    f.等待超时
    g.算数运算错
    h.I/O故障
    引起进程终止的事件
    外接干预:关机、点击×号
    终止的过程
    1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读取该进程的状态。
    2)若被终止进程正在处于执行状态,应立即终止该进程的执行,并置调度标志为真,以便进程撤销后将处理机分配给其他进程。
    3)若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控制的进程。
    4)将被终止的进程所有拥有的全部资源,或者归还给其他父进程,或者归还给系统
    5)PCB释放
  3. 终止由于某事件而无法运行下去的进程、
  4. 负责进程的状态转换
  • 一般由操作系统的内核实现。把与硬件紧密相关的模块、运行频率较高的模块及一些公用的基本操作安排在靠近硬件的软件层次中,并常驻内存,以提高系统运行效率。
  • 原语:由若干条指令构成“原子操作”过程,作为一个整体而不可分割–要么全都做,要么全都不做。
    • 系统调用并不都是原语
    • 进程A调用read(),因无数据而阻塞,在read()里未返回。然而进程B调用read(),此时read()被重入
    • 系统调用不一定一次执行完并返回该进程。有可能在特定的点暂停,而转入到其他进程

4.进程组织

组织方式

  • 链接方式:把具有同一状态的PCB用其中的链接字链接成一个队列,可以形成就绪队列、若干个阻塞队列和空白队列
    链接方式
  • 索引方式:系统根据所有进程的状态建立几张索引表,如就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在专用单元中。索引表中记录的是PCB在PCB表中的地址
    索引方式

5.进程通信

为了协调完成某一任务,几个进程之间应保持联系,即交换一定数据量的信息

5.1通信类型

低级通信:仅交换少量数据和一些状态,如前述的同步与互斥方式(P、V操作)
高级通信:交换信息量大,用户可以直接利用OS提供的通信命令高效的传送大量数据(OS隐去了实现细节,对用户是透明的)

共享存储系统

1)基于共享数据结构的通信方式
a.要求诸存进程共享某些数据结构,借以实现进程间的数据交换。如生产消费者问题中,用有界缓冲区来实现进程通信。
b.对用户透明,程序负担太重,操作系统效率低,只适合传递少量的数据,属于低级通信方式。
2)基于共享存储区的通信方式
a.在存储器中划出一块共享存储区,诸进程可通过对共享存储区中的数据读写来实现通信。
b.属于高级通信,适合传送大量数据

  • 消息传递系统
    进程之间的数据交换,是以格式化的消息(message)为单位的;在计算机网络中又把message称为报文(自己)
    实现方式:程序员直接利用系统提供的一组通信命令(原语 )进行通信。
    消息传递的通行方式属于高级通信方式。可分为直接通信方式(发送进程直接将消息发送给接收进程,并将消息挂在接收进程的消息队列上,接收进程从消息队列中取得消息)和间接通信方式(发送进程发送消息到“信箱”中,接收进程从“信箱”中取得消息,相应的系统称为电子邮件系统:信箱分为三种类,私用信箱用户可以自己建立,公用信箱操作系统创建,共享信箱某个线程创建)。
    优点:传递信息量大、对用户透明、应用广泛
    广泛应用于单片机系统、多机系统、计算机网络
  1. 管道通信(共享文件的方式)
    管道是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名“Pipe”文件
    向管道(共享文件)提供输入的发送进程(即写进程)以字符流形式将大量数据送入管道;而接收管道输出的接收进程(即读进程),则从管道中接收(读)数据
    由于发送进程和接收进程是利用管道进行通信的,故称为管道通信。
    这种方式首创与UNIX系统,由于它能有效的发送大量的数据,因而又被引用到许多其他的系统。
    管道机制必须提供以下三个方面的协调能力:
    1) 互斥:即当一个进程在对pipe执行读/写操作时,其他进程必须等待
    2) 同步:指当写进程把一定量数据写入pipe,便去睡眠等待,直到读进程把数据取走后,再把他唤醒。当进程读为空pipe是,应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。
    3) 确定对方是否存在,只有确定对方存在时,才能进行通信。

5.2实现方法

6.线程概念与多线程模型

为什么要有线程?
为了满足实体之间可以并发的执行,可以共享相同的地址空间。这种实体就是线程。线程的引入为了简化进程间的通信,以小的开销来提高进程内的并发程度从而提高系统的吞吐量20世纪80年代中期引入线程。将进程的两个属性分开,作为调度和分派的基本单位,不同时作为进程的拥有者,就形成了进程的概念。线程是进程中的一个运行实体,是CPU调度单位,资源的拥有这还是进程。

6.1进程的两个基本属性

  • 可拥有资源的独立单位:给每个进程分配空间,保存进程映像,控制一些资源(文件、I/O设备),有状态、优先级、调度。
  • 可以独立调度和分派的基本单位:进程是一个执行轨迹

6.2线程概念:

  • 具有执行状态(状态转换)
  • 不运行时保持上下文:不用保存
  • 有一个执行栈
  • 有一些局部变量的静态存储
  • 可存储所在进程的内存和其他资源
  • 可以创建、撤销另一个线程

6.3线程的属性:

  • 轻型实体:只拥有必不可少资源(如:线程状态、寄存器上下文和栈)
  • 是一个独立调度和分派的单位:
    1)具有就绪、阻塞、运行三种基本状态
    2)线程创建、终止时间比进程短(不用释放文件、不用释放内存)
    3)同进程内线程切换时间比进程短,系统开销小。
  • 可以并发执行
    1)同一进程内的线程并发执行
    2)不同进程间的线程并发执行
  • 共享进程资源:由于同进程线程间共享内存和文件资源,可以直接进行不通过内核的通信。

6.4线程控制块–TCB

  • 状态参数
    在OS中每个线程都可以利用线程标识符和一组状态参数进行描述。通常有
    1)寄存器状态:包括程序计数器PC和堆栈指针中的内容
    2)堆栈:在堆栈中通常保存有局部变量和返回地址。
    3)优先级:描述线程执行的优先程度。
    4)线程专有存储器,用于保存线程自己的局部变量拷贝。
    5)信号屏蔽:即对某些信号加以屏蔽
  • 线程的状态
    如同传统的进程一样,在各线程间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应的线程在运行时也具有三种基本状态:执行、就绪、阻塞

6.5线程的创建和终止

在多线程OS环境下,应用程序在启动时,通常仅有一个线程在执行,该线程被人们称为“初始化线程”。它可根据需要再去创建若干线程。
在创建线程时,需要利用一个线程创建函数(或系统调用),并提供相应的参数,如:指向线程主程序的入口指针、堆栈大小,以及用于调度的优先级等。在线程函数执行完后,将返回一个线程标识符供以后使用
终止线程的方式有两种:
1)线程完成了自己的工作资源退出;
2)线程在运行过程中出现错误或由于某种原因而被其他线程强行停止。

6.6多线程OS中的进程

在多线程OS中的,进程是作为拥有系统资源的基本单位。通常进程都包含多个线程并为他们提供资源,但此时的进程就不再作为一个执行实体。
多线程OS中的进程有以下属性:
1)作为系统资源分配的单位
2)可包括多个线程
3)进程不是一个可执行的实体

6.7线程和进程的关系

  • 单进程,单线程
  • 单进程,多线程
  • 多进程,一个进程单线程
  • 多进程,一个进程多线程

多线程进程模型
多线程进程模型

6.8引入线程的好处

  • 创建一个新的线程花费时间少,结束也少
  • 两个线程间切换花费时间少
  • 线程之间通信无需调用内核,因为进程内线程共享内存和文件
  • 适合多处理机系统

6.9进程与线程的比较

进程线程
调度作为拥有资源的基本单位作为调度的基本单位,同进程中线程切换不引起进程切换,当不同进程的线程切换才引起进程切换
并发性一个进程间的多个线程可并发
拥有资源拥有资源的独立单位拥有隶属进程的资源
系统开销

6.10线程的实现方式

有两个实现方式:内核支持线程、用户级线程

6.10.1内核支撑线程

(CPU分配时间片较长,因对线程可见)

  • 用户进程和系统进程都是在操作系统内核的支持下运行的,与内核紧密相关。
  • 内核支持线程由操作系统直接支持,内核在其空间内执行线程的创建、调度和管理
  • 所有线程管理都是有核心(操作系统或内核)完成
  • 没有线程库,但对核心线程工具提供API(应用编程接口)
  • 核心维护进程和线程的上下文
  • 线程之间的切换需要使用核心支持
  • 进程调度以线程为基础

优点

  • 对多处理器,核心可以同时调度同一进程的多个线程。
  • 阻塞是线程一级完成的
  • 核心例程是多线程的

缺点:

  • 在同一进程内线程切换调用内核,导致速度下降

6.10.2用户级线程

(CPU分配时间片较短,以PCB分配因为对线程不可见)

  • 用户级线程在核心之上的支持,并在用户层通过线程库来实现。线程库提供对线程创建、调度和管理的支持无需内核支持。
  • 调度单位仍以进程为单位
  • 所有线程的创建、调度在用户空间内进行的,无需内核干涉。因为内核并不知道用户级线程。
  • 由于切换规则远比进程调度和切换的规则简单,因而使线程的切换速度特别快。
  • 这种线程与内核无关
    优点
  • 线程切换不调用核心
  • 调度是应用程序特定的:可以选择最好的算法
  • ULT可运行在任何操作系统上(只需线程库)

缺点

  • 大多数体统调用是阻塞的,若核心阻塞进程,则进程中所有线程将被阻塞。
  • 核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上。

6.10.3线程实现方式组合

线程实现方式组合

二、处理机调度

1.调度的基本概念

作业是用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合,包括用户程序、所需的数据及命令等
作业的状态:一个作业进入系统到操作结束一般需要经历收容、运行和完成三个阶段,与之相对应的是作业的三种状态后备状态、运行状态、完成状态

2.调度时机、切换与过程

3.调度的基本准则

4.调度方式

5.典型的调度算法

  • 先来先服务调度算法
  • 短作业优先
  • 时间片轮转调度算法
  • 优先级调度算法
  • 高响应比优先调度算法
  • 多级反馈队列调度算法

三、同步与互斥

1.进程同步的基本概念

1.1两种的相互制约关系

  • 间接相互制约关系–互斥
    同处于一个系统中的进程必然共享某种资源,如CPU、I/O设备等,间接相互制约即源于资源共享。如A、B共享打印机,若A申请打印机时,打印机已经分配给B,则A只能阻塞,等B释放后再改为就绪。
  • 直接相互制约关系–同步
    这种制约关系源于进程之间的合作关系。如:进程A向B提供数据,当输入缓冲空时,B不能得到数据而阻塞;反之当缓冲满时,A无法写入而阻塞。

1.2互斥中两种现象

  • 饥饿:一个就绪的进程所申请的资源总是被优先于自己的其他线程所占有,而始终处于不能被调度执行的状态。
  • 死锁:有可能出现某些进程相互之间都在等待对方资源且都无法运行的局面,即在进程集合中的这些进程处于永远阻塞的状态。

1.3进程同步与进程互斥的相似之处

进程互斥实际上是进程同步的一种特殊情况,即逐次使用互斥资源,这也就是对进程使用资源次序的一种协调。因此,可以将进程互斥和进程同步统称为进程同步

1.4进程同步与进程互斥的区别之处

进程互斥是进程之间共享互斥资源的使用权,这种竞争没有确定的必然联系。在进程同步中,涉及共享互斥资源的并发进程之间有一种必然的联系;在当前运行的进程执行过程中需要进行同步时,即使没有其他进程在使用互斥资源,在没有得到协调工作的其他合作进程发来的同步消息之前,当前进程也不能去使用该资源。

1.5临界资源

一次仅允许一个进程使用的资源
系统中许多硬件如打印机等,诸进程之间只能用互斥的方式进行访问。请看例子5.1生产者-消费者问题。
根据临界资源我们创建一个资源:临界区
定义:每个进程中访问临界资源的那段代码称为临界区
不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。则:每个进程进入临界区之前先对预访问的临界资源进行检查,看是否正在被访问。如果此刻该临界区资源未被访问,该进程可进入临界区,并设置它正在访问的标志,在临界区之前执行的这段代码称为进入区。在临界区之后也要加上一段代码,用于临界区被访问标志恢复为未被访问标志,称为退出区。
同步机制应遵循的原则

  • 空闲让进:当无进程处于临界区时,应允许一个进程进入临界区。
  • 忙则等待:当已有进程进入临界区,其他进程必须等待。
  • 有限等待:对要求访问临界资源的进程,应保证在有限时间内进入自己的临界区,防止“死等”
  • 让权等待*:当进程不能进入自己的临界区时,应立即释放处理机,防止“忙等”

2.实现临界区互斥的基本方法

2.1软件实现方法

2.1.1单标记法

也叫做强制轮流法,加锁法(此法不佳):发钥匙,钥匙对上才能进
加锁法

2.1.2双标记法先检查:初始为false

挂牌的方式:设置一个flag数组,每个进程持有一个flage中的一个空间,值为true或false(此法不佳)
双标记先检查

2.1.3双标记法后检查:初始为false

先挂牌,后检验(此法不佳)
双标记法后检查

2.1.4Peterson’s Algorithm

把前面两种方式统一起来,既挂牌子又给钥匙
是用软件的方法来实现互斥同步问题的唯一解决方法。(好用
Peterson's Algorithm

2.2硬件实现方法

2.2.1开关中断指令
  • 开关中断指令又称为硬件锁,使用它来实现进程互斥最简单
  • 具体方法是:进程在进入临界区之前先执行“关中断”指令来屏蔽掉所有中断。进程完成临界区的任务后,在执行“开中断”指令将中断打开。
  • 只适用单CPU系统,如果中断时间过长,会使系统效率下降。
  • 若关中断不当,有可能导致系统无法正常调度进程运行
2.2.2测试与设置指令TS(Test and Set)
  • 采用TS方法则要为每个临界资源设置一个整型变量s,可以将它看做一把锁
  • 若s的值为0(开锁状态),则表示没有进程访问该锁对应的临界资源
  • 若s的值为1(关锁状态),则表示该锁对应的临界资源已被某个进程占用。
    测试与设置指令TS
2.2.3swap指令(或exchenge指令)
  • 功能是交换两个字的内容
  • 每个临界值资源设置一个整型的全局变量lock。Lock=0,空闲,反之,有进程。
  • 每个进程设置一个整型局部变量key。只有当lock的值为0并且key的值为1时,本进程才能进入临界区。进入临界区后,lock的值为1且key的值为0
  • 退出临界区时,应将lock的值置为0
    swap指令

2.3方法总结

以上方法都是基于繁忙等待的策略:一个进程想要进入临界区,首先检查是否允许进入,否则就循环等待。
缺点:

  • 浪费CPU
  • 导致意外结果(优先级问题)
    高优先级进程要等待低优先级进程退出,但低优先级无法获取CPU(因为抢不过高优先级),无法退出。

解决方法:

  • 当一个进程无法进入临界区,应该阻塞
  • 当一个进程离开临界区,应该唤醒被阻塞的进程
  • 克服繁忙等待的缺点
    看信号量来解决。

3.信号量

描述:
原来,两个或多个进程想要进入临界区,而只有一个可以进入。现在,两个或多个进程想要进入临界区,而只允许N个进程同时进入,N>=1。如何解决现在的问题(举例:3个打印机可以进入4个人进程)?

3.1信号量机制

1965年,荷兰学者Dijkstra提出的信号量机制。
是一种有效的进程同步工具,所以P、V分别是荷兰语test(Proberen)和increment(verhogen)

  • 信号量机制已从整型信号量发展为记录型信号量,又进一步发展成为信号量集
  • 信号量就是OS提供的管理公有资源的有效手段
  • 信号量代表可用资源实体的数量
3.1.1整型信号量

最初是由Dijkstra把整型型号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作wait(S)/P(S)和signal(S)/V(S)来访问
这两个操作一直被分别称为P、V操作
整型信号量
P、V都是原子操作,执行时不可中断。
在wait操作中,对S的测试和做S=S-1操作时都不可中断,信号量只能通过原语操作来访问,不能被进程调度所打断。
缺点:信号量s<=0时“忙等”,未遵循让权等待(没什么用这种方法,但提出了一种思路)

3.1.2记录型信号量

采取了“让权等待”的策略,是一种不存在“忙等”现象的进程同步机制。在采取了让权等待的策略后,又会出现多个进程等待访问同一临界资源的情况。在记录型信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。

记录型的数据结构:
记录数据结构
P、V操作如下:
P、V操作
在记录型信号量机制中,S.value的初值表示系统中某类资源的数目,因而又被称为资源信号量
对信号量S.value每次P操作,
S.value = S.value-1
S.value > 0时,有该类资源
S.value<0时,该类资源已被分配完毕,|S.value|=该信号量链表中已阻塞进程的数目。
对信号量S.value的每次V操作,S.value = S.value+1
若加一后仍是S.value<=0,表示该信号量链表中仍有等待该资源的进程被阻塞,则应调用wakeup原语,将S.L链表中的第一个等待进程唤醒。
若S.value的初值为1,表示只允许一个进程访问临界资源,此时信号量转化为互斥信号量。

3.1.3AND型信号量

AND型信号量:在有些任务中,一个进程要获得多个共享资源后才能执行,若进程A和B都要访问共享数据D和E,设信号量Dmutex和Emutex mutex的初值均为1。
在两个进程中都要包含两个操作Dmutex和Emutex 的操作,若
交替执行
AND同步机制的基本思想是:

  • 将进程在整个运行过程中需要所有的资源,一次性全部地分配给进程,待进程使用完后再一起释放。
  • 对若干个临界资源的分配,采用原子操作方式:要么全部分配到进程,要么一个也不分配。
  • 由死锁理论可知,这样就可避免上述死锁的情况发生
  • 在P操作中,增加一个“AND”条件,故被称为AND同步,或被称为同时P操作
    Swait(Simultaneous wait)
    AND同步
    这个解决哲学家就餐问题很有效。
3.1.3信号量集

对AND信号量进行的一个扩充。

  • 在记录型信号量机制中,wait(s)和signal(S)操作仅能对信号量施以加1或减1操作,以为这每次只能获得或释放一个临界资源,效率低
  • 存在有些情况,当资源数量低于某下限值时便不予分配。因而,在每次分配前,都必须测试该资源的数量,看其是否大于等于下限值。
  • 在对AND信号量机制扩充的基础上,形成一般化的“信号量集”机制
    在这里插入图片描述
    特殊情况
    特殊情况

3.2信号量的应用

4.管程

管程引导
在引入信号量后,使用P、V操作时,也会造成错误。如
(1)P、V执行顺序颠倒:可能导致几个进程同时进入临界区
(2)误写成两个P或两个V
基于上述情况,Dijkstra于1971年提出,把所有进程对某一临界资源的同步操作都集中起来,构成一个所谓的“秘书”进程,凡是要访问临界资源的进程,都需先报告秘书,由秘书来实现诸进程的同步。
1973年,Hansan和Hoare又把“秘书”进程思想发展成管程概念;把并发进程间的同步操作,分别集中于相同的管程中。
管程定义
一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
管程组成(有四个部分)

  • 局部于管程的共享变量说明
  • 对数据结构进行操作的一组过程
  • 对局部于管程的数据设置初始值的语句
  • 管程的名字
    理解:就相当于现在面向对象的设计,它设计了一个类
    在这里插入图片描述
    暂时不能用于生活
    管程不足

5.经典同步问题

5.1生产者-消费者问题

描述
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将他所生产的产品放入一个缓冲区中;消费者进程可以从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但他们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
解决思路
利用一个数组来表示上述的具有n个缓冲区的缓冲池。用输入指针in来标示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,输入指针加1,用一个输出指针out来标示下一个可从中获取产品的缓冲区,每当消费者进程取走一个产品后,输入指针加1。(循环队列)
即:
指针加1:in = (in + 1) mod n;
输出指针+1:out = (out + 1) mod n;
缓冲池满:(in + 1) mod n = out;以牺牲一个存储空间的大小为代价判断缓冲池满
缓冲池空:in = out
当然:
为了方便,引入一个整型变量counter,其初始值为0,每当生产者进程向缓冲池中投放一个产品后,使counter加1;反之,每当消费者线程从队列中取走一个产品时,使counter减1。counter=0表示队空,counter= n-1表示队满
伴随问题
顺序执行时其结果也是正确,但若并发执行时,就会出现差错,问题就在于这两个进程共享变量counter。生产者加1,消费者减1,谁先谁后,不知道,引起互斥问题,这里的counter就是一个临界资源–查看1.5临界资源。

5.2读者-写者问题

5.3

四、死锁

1.死锁的概念

2.死锁的处理策略

3.死锁的预防

4.死锁的避免

系统安全状态:银行家算法

5.死锁的检测和解除

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长的牧歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值