而管程每次只允许一个进程处于管程,从而推动了进程互斥

管程的核心模式就是相当于构造了一个管理进程同步的“IOC”容器。
管程是一个语言的构成成分(非操作系统支持个别),管程的互斥访问完全由编译程序在编译时手动添加上,无需程序员关心,而且确保正确
一般的 monitor 实现方式是编程语言在词汇上提供语法糖,而如何推动 monitor 机制,则属于编译器的工作
比如,Java中使用synchronized时,这是不是一种管程理念?你也是写了一个synchronized关键字(语法糖),多线程的共享同步完全不用你操心了
(注意:并不是所有的语言都支持管程的概念)

管程可以确保互斥,同一时刻仅有一个进程处于管程,所以他必然还要同步软件,如两个同步操作线程 wait和 signal,他还应该互斥量用以控制管程进入的同步
当某进程通过管程请求获取临界资源而无法满足时,管程便调用 wait 原语使该进程等待,并将其排在等待队列上
仅当另一进程访问完成并传递该资源以后,管程调用signal原语,唤醒等待队列中的队首进程
但是,仅仅这个互斥量是不够的
比如,如果还要处理之前提到过的“执行排序控制”,如何控制前驱关系?
当一个进程调用了管程,在管程中时被阻塞或挂起,直到阻塞或挂起的诱因解除,而在此期间,如果该进程不释放管程,则其它进程能够开启管程,被迫长时间地期待。
所以还应该其他的信号量用于针对其他条件进行同步,这些就是条件变量,所以一个完整的管程定义为:
Minitor{
管程内部的变量结构以及说明;
condition 条件变量列表;
函数1(){
}
......
函数N(){
}
init(){
对管程中的局部变量进行初始化;
}
}

条件函数就是当读取管程过程的进程能够运行时,用于阻塞进程的一种信号量
管程中对每个条件变量都须给予说明,其方式为:Var x,y:condition。
对条件变量的操作仅仅是wait和signal,条件变量也是一种抽象数据类型,每个条件变量保存了一个链表,用于记录因该条件函数而阻塞的所有进程,同时提供的两个操作即可表示为 x.wait和x.signal,其含义为:
① x.wait:正在读取管程的进程因 x 条件应该被阻塞或挂起,则读取 x.wait 将自己插入到x条件的等候队列上,并释放管程,直到x条件差异。此时其它进程可以使用该管程。
② x.signal:正在读取管程的进程发现 x 条件出现了变化,则读取 x.signal,重新启动一个因 x 条件而阻塞或挂起的进程。如果存在多个这样的进程,则选择其中的一个,如果没有,则继续执行原进程,而不造成任何结果。这与信号量机制中的 signal操作不同,因为后者总是要执行s:=s+1操作,因而就会改变信号量的状况。
如果有进程Q因x条件进入阻塞状况, 当正在读取管程的进程P执行了x.signal操作后,进程Q 被重新启动,此时两个进程 P和Q,如何确认哪个执行,哪个等待,可选用以下两种方法之一进行处理:
(1) P等待,直至Q 离开管程或等候另一条件。
(2) Q等待,直至P离开管程或等候另一条件。
采用哪种处理方法,当然是各执一词。
Hoare 采用了第一种处理方法
而 Hansan 选择了两者的折衷,他要求管程中的过程所执行的signal 操作是过程体的最后一个操作,于是,进程P执行signal操作后及时撤出管程,因而进程Q马上被修复执行。
进程控制是操作系统的一种硬性管理,是需要要有的,如果没有进程控制,就没办法合理安排运行进程, 根本没法完成状况的切换维护等。
进程的同步是一种软逻辑上的,如果不做,并不会导致平台出难题或者进程能够运行,但是如若不进行同步,结果却很可能是出错的,所以也有需要做的
类比装修的话,进程控制就是硬装,不装无法住,总归要水电搞搞好,进程同步就是家具电器和装修,硬装后住下去不会出现“生存问题”(至少有水喝有电用),但是你要是连个热水壶都没有是准备要喝开水么
进程同步的概念多很复杂抽象,因为貌似是概念描述,没有涉及到详细的推动细节。
进程同步的核心是针对临界资源的访问控制,也就是对于临界区的访问。
不管是临界区算法还是信号量机制还是管程机制,终归也都是控制处于临界区的不同的谋求思路。
每种不同的算法、机制都各自有各自的传统,场景。
信号量机制将临界资源的访问的互斥,演化为可以多个进程访问资源(整型信号量),记录型信号量对整型信号量机制进行改进,处理了忙等的弊端
然后继续演变出AND型,可以对不同的资源进行同步,而不仅仅是同一种资源
最后发展为信号量集的方式,可以对不同的资源、不同的个数、不同的限制进行处理,变得更为通用。
管程更多的是一种设计思维,管程就是管理进程的程序,进程对于资源的同步操作全都依赖管程这一“大管家”,管程是编程语言级别的,不需要程序员进行过多的处理,一般会提供语法糖
需要切记并不是所有的语言都有管程的概念(Java是有的),管程让你从同步的细节中解放下来,可以在众多画面下简化同步的推动。
管程的概念是“线程同步”的“IOC”,大大简化了同步的代价。
不管临界区算法还是信号量机制还是借助于管程,他们都是一种同步软件,可以觉得人们就是一组“方法”,“方法”的逻辑就是本文前面介绍的机理
在应该进程同步问题的缓解策略中,可以直接使用“封装好的方式”
以上,尽管都是在说操作系统关于进程的同步的处理,其实,在同步问题上进程和线程的设计模式是相通的
因为这本质上都是在说并发----多道程序运行的操作系统,通常使用轮转时间片的方法并发的运行多个进程
原文地址:进程同步概念简介 多线程上篇(四)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-120618-2.html
遇过里面有活着的小虫
那我肯定不说了
中国动作太快了
伊拉克依靠美国反恐只能越反越恐