操作系统概念学习笔记 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),会与悬挂进程的名称一起存储。

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

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

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

目录
相关文章
|
1月前
|
安全 算法 Unix
深入浅出操作系统:从基础概念到实践应用
【10月更文挑战第22天】本文旨在以浅显易懂的语言,为读者揭开操作系统的神秘面纱。我们将从操作系统的基本概念出发,逐步深入其核心功能与设计哲学,并通过具体代码示例,展示操作系统如何在实际中发挥作用。无论你是计算机科学的学生,还是对技术有浓厚兴趣的爱好者,这篇文章都将为你提供一次轻松愉快的操作系统之旅。
42 4
|
6月前
|
算法 数据库
操作系统:经典进程同步问题的高级探讨
操作系统:经典进程同步问题的高级探讨
80 1
|
7月前
|
算法 安全 调度
【操作系统】进程同步与进程互斥
【操作系统】进程同步与进程互斥
69 2
|
2月前
|
Ubuntu Java Linux
Linux操作系统——概念扫盲I
Linux操作系统——概念扫盲I
44 4
|
3月前
|
存储 算法 安全
深入理解操作系统:从基础概念到代码实践
【9月更文挑战第23天】本文将带领读者深入探索操作系统的奥秘,从基础概念出发,逐步揭示操作系统的工作原理和设计哲学。我们将通过实际代码示例,展示操作系统如何与硬件交互、管理资源以及提供用户界面。无论你是计算机专业的学生还是对操作系统感兴趣的开发者,这篇文章都将为你打开一扇通往操作系统世界的大门。
70 16
|
5月前
|
人工智能 Unix 物联网
深入理解操作系统:从概念到实践
【7月更文挑战第31天】本文将带领读者深入探索操作系统的世界,从基本概念、发展历程、核心组件,到实际应用场景和未来趋势。我们将揭示操作系统如何作为软件与硬件之间的桥梁,以及它如何影响计算机系统的性能和用户体验。通过本文,您将获得对操作系统设计哲学的深刻理解,并掌握评估不同操作系统特性的能力。
78 7
|
4月前
|
安全
操作系统中的同步和监视器经典问题
【8月更文挑战第23天】
35 0
|
5月前
|
算法 安全 Linux
深入理解操作系统:从基础概念到现代发展
【7月更文挑战第25天】在数字时代的心脏,操作系统(OS)扮演着至关重要的角色。本文将深入探讨操作系统的核心功能、设计哲学以及它们如何适应不断变化的技术需求。我们将从早期的批处理系统和多道程序设计开始,逐步走向现代的多任务、多用户操作系统,并探索它们是如何管理资源、提供安全性和促进用户交互的。文章还将触及开源与专有操作系统之间的辩论,并预测未来可能的发展方向。
|
5月前
|
存储 安全 物联网
深入理解操作系统:从基础概念到现代挑战
【7月更文挑战第14天】本文将探索操作系统的核心概念,并分析其在现代计算环境中面临的挑战。我们将从操作系统的定义和功能出发,逐步深入到进程管理、内存管理、文件系统以及并发和同步等关键领域。文章还将讨论操作系统在云计算、物联网(IoT)和安全性方面的新挑战,为读者提供对操作系统复杂性的全面理解和未来发展方向的洞见。
65 1