操作系统概念学习笔记 12 进程同步(二)管程

操作系统概念学习笔记 12

进程同步(二)


管程

基本的、高级的同步构造,即管程(monitor)类型。

使用:

管程类型提供了一组由程序员定义的、在管程内互斥的操作。管程类型的表示包括一组变量的声明(这些变量的值定义了一个类型实例的状态)和对这些变量操作的子程序和函数的实现。管程的类型表示不能直接为各个进程所使用。因此,在管程内定义的子程序只能访问位于管程内那些局部声明的变量和形式参数。类似的,管程的局部变量能被局部子程序访问。

管程结构确保一次只有一个进程能在管程内活动。不需要显示的编写同步代码。而对于特定同步方案,需要额外的同步机制,这些由条件(condition)结构来提供。

condition x,y;
x.wait();
x.signal();

管程的语法:

monitor monitor name{

  //shared variable declarations

  procedure P1(…){

…

}

procedure P2(…){

…

}

…

procedure Pn(…){

…

}

initialization code(…){

…

}

}

哲学家进餐问题的管程解法

这个解决方案要求哲学家在两只筷子都可以使用时才会拿起筷子。

为此,引入如下数据结构:

enum {THINKING, HUNGRY, EATTING} state[5];

加入条件,哲学家i只有在其两个邻居不再进餐时才能将变量state[i]设置为eating:

(state[(i+4)%5]!=eating)和(state[i+1]%5!=eating)

哲学家i必须按以下顺序来调用操作

dp.pickup(i)

...

eat

...

dp.putdown(i)

基于信号量的管程实现

基于信号量的哲学家进餐问题的管程解法:每个管程都有一个信号量mutex(初始化为1),进程在进入管程之前,必须执行wait(mutex),在离开管程后必须执行signal(mutex)。

monitor dp{

  enum{THINKING,HUNGRY,EATING}state[5];

  condition self[5];

  void pickup(int i){

 state[i]=HUNGRY;

 test(i);

  if(state[i]!=EATING)

    self[i].wait();

}

void putdown(int i){

  state[i]=THINKING;

  test((i+4)%5);

  test((i+1)%5);

}

void test(int i){

  if((state[(i+4)%5]!=EATING)&&(state[i]==HUNGRY)&&(state[(i+1)%5]!=EATING)){

    state[i]=EATING;

    self[i].signal();

}

}

initialization_code(){

  for(int i=0;i<5;i++)

    state[i]=THINKING;

}

}

条件变量的实现:对于每个条件变量x,引入信号量x_sem和整数变量x_count,两者均初始化为0。由于信号进程必须等待,引入另一个信号量next以供信号进程挂起自己,next_count以对挂起在next上的进程进行计数。

x.wait()的实现:

x_count++;

if(next_count > 0)

  signal(next);

else

  signal(mutex);

wait(x_sem);

x_count--;

x.signal()的实现:

if(x_count>0){

  next_count++;

  signal(x_sem);

  wait(next);

  next_count--;

}

管程内的进程重启

等待最长的进程先重新运行。也可以使用条件等待构造。

x.wait(c);其中c表示优先值(priority number),会与悬挂进程的名称一起存储。

使用管程来管理资源时,为确保系统的正确,有两个条件是必须检查的:

第一,用户进程必须总是按正确顺序来对管程进行调用;

第二,必须确保一个不合作的进程不能简单地忽略由管程所提供的互斥关口,以及在不遵守协议的情况下直接访问共享资源。

时间: 2024-10-13 06:59:49

操作系统概念学习笔记 12 进程同步(二)管程的相关文章

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分

操作系统概念学习笔记 13 死锁(一)

操作系统概念学习笔记 13 死锁(一) 所有申请的资源都被其他等待进程占有,那么该等待进程有可能在无法改变其状态,这种情况称为死锁(deadlock). 系统模型 进程在使用资源之前必须先申请资源,在使用资源之后要释放资源.进程所申请的资源数量不能超过系统所有资源的总量. 在正常操作模式下,进程只能按如下顺序使用资源: ①申请:如果申请不能立即被允许,那么申请进程必须等待,直到它获得该资源为止. ②使用:进程对资源进行操作. ③释放:进程释放资源 资源的申请与释放为系统调用.其他资源的申请与释放

操作系统概念学习笔记 8 进程

操作系统概念学习笔记 8 进程 概念 进程 进程是执行中的程序,这只是非正式的说法.进程不只是程序代码,程序代码称为文本段(代码段),还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示.此外,进程还包括进程堆栈段(临时数据.函数参数.局部变量.地址)和数据段(包括全全局变量.还可能包括堆(leap),是在进程运行期间动态分配内存. 程序是被动实体,如存储在磁盘上包含一系列指令的文件内容(可执行文件),而进程是一个活动实体,他有一个程序计数器来表示下一个要执行的命令和相关资源集合. 虽然

操作系统概念学习笔记 5 操作系统管理简述

操作系统概念学习笔记 5 操作系统管理简述 进程管理 处于执行中的程序被称作进程. 进程需要一定的资源(包括cpu时间.内存.文件.I/O设备)来完成任务.这些资源可以在进程创建时分配给进程,也可以在执行时分配给进程.除了在创建时得到各种物理和逻辑资源外,进程还可以接受传输过来的各种初始化数据. 程序本身并不是进程,程序是被动的实体.而进程是活动的实体.进程是系统工作的单元. 单线程进程具有一个程序计数器来明确下一个执行的指令,直到进程终止. 在任何时候,最多只有一个指令代表进程被执行.因此,尽

操作系统概念学习笔记 9 线程

操作系统概念学习笔记 9 线程 概述 单个进程可以包括多个控制线程. 线程 --一种CPU利用的基本单元,它是形成多线程计算机的基础. 线程是CPU使用的基本单元,它由线程ID.程序计数器.寄存器集合和栈组成.它与属于统一进程的其他线程共享代码段.数据段和其他操作系统资源. 一个传统重量级的进程只有单个控制线程,如果进程有多个控制线程,那么能同时做多个任务. 单线程与多线程 动机 一个应用程序通常是作为一个具有多个控制线程的独立进程实现的.如一个忙碌的网页服务器如果有多个(或数千个)客户并发访问

操作系统概念学习笔记 15 内存管理(一)

操作系统概念学习笔记 15 内存管理(一) 背景 内存是现代计算机运行的中心.内存有很大一组字或字节组成,每个字或字节都有它们自己的地址.CPU根据程序计数器(PC)的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入. 一个典型指令执行周期,首先从内存中读取指令.接着该指令被解码,且可能需要从内存中读取操作数.在指令对操作数执行后,其结果可能被存回到内存.内存单元只看到地址流,而并不直到这些地址是如何产生的(由指令计数器.索引.间接寻址.实地址等)或它们是什么地址(指令或数

《30天自制操作系统》笔记(12)——多任务入门

<30天自制操作系统>笔记(12)——多任务入门 进度回顾 上一篇介绍了设置显示器高分辨率的方法.本篇讲一下操作系统实现多任务的方法. 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好. 多任务就是让电脑同时运行多个程序(如一边写代码一边听音乐一边下载电影). 电脑的CPU只有固定有限的那么一个或几个,不可能真的同时运行多个程序.所以就用近似的方式,让多个程序轮换着运行.当轮换速度够快(0.01秒),给人的感觉就是"同时"运行了. 多任务之不实用版 我们首先从

操作系统概念学习笔记 10 CPU调度

操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU,操作系统可以提高计算机的吞吐率. 对于单处理器系统,每次只允许一个进程运行:任何其他进程必须等待,直到CPU空闲能被调度为止. 多道程序的目标是在任何时候都有某些进程在运行,以使CPU的使用率最大化.多道程序的思想较为简单,当一个进程必须等待时,操作系统会从该进程拿走CPU的使用权,而将CPU交给其他进程. CPU-I/O 区间周期 CPU的成功调度依赖于进程的如下属性: 进程执行由CPU执行周期和I/O等

操作系统概念学习笔记 3 存储结构和I/O结构

操作系统概念学习笔记 3 存储结构与I/O结构 存储结构 计算机必须在内存或RAM(随机访问内存random access memory)运行,内存是处理器可以直接访问的唯一大容量存储区域. 内存和处理器本身内置寄存器是cpu能直接访问的唯一存储介质. 指令load能将内存中的字移到cpu内部的寄存器中.而指令store能将寄存器的内容移动到内存.除了显式使用load和store,cpu可自动从内存中装入指令以执行. 内存比较小,并且是易失性存储设备,所以计算机系统提供辅助存储器作为内存的扩充.