更多优质内容
请关注公众号

操作系统入门(十)比信号量更简便的进程互斥同步工具——管程-张柏沛IT博客

正文内容

操作系统入门(十)比信号量更简便的进程互斥同步工具——管程

栏目:其他内容 系列:操作系统入门 发布时间:2022-02-14 12:12 浏览量:1341
本系列文章目录
展开/收起

管程

通过前面的知识知道,我们一般会使用信号量机制实现进程同步和互斥。但是信号量机制实现同步互斥需要复杂的编程,很容易出现错误。

管程是一种为了让用户更方便的进行进程同步和互斥而设计出的高级同步机制,类似于面向对象中的类。

使用管程实现同步和互斥的开发成本更低,使程序员更专注于业务,而非花大量时间处理进程的同步互斥的问题。


管程的组成:

1.局部于管程的共享数据结构(类的成员变量);

2.对该数据结构操作的一组过程(类的方法);

3.对该共享数据设置初始值的语句(类的构造函数);

4.管程的名字(类名);


管程的基本特征:

1、局部于管程的数据只能被管程的过程访问(类的成员变量只能被该类的方法访问);

2、每次只允许一个进程在管程中执行某个过程(进程只能互斥访问该管程中的方法);

3、管程中可以设置条件变量实现同步,对条件变量执行wait()阻塞进程时,也会使进程释放管程的使用权,让其他进程可以调用管程的方法不至于造成死锁。

4、进程释放管程使用权有两种方式:执行wait(),执行完管程的成员方法。

使用管程解决生产者-消费者模型


使用管程解决生产者-消费者模型

monitor ProducerConsumer
    condition full, empty;		// 条件变量,用来实现同步
    int count = 0;
    void insert (Item item){	// 把产品item放入队列
    	if(count == N)
     		wait(full);	// 可以理解为因为队列已满而等待,等待的对象是full
       	count++;
        	insert_item(item);
         	if(count == 1)	// 当队列中的产品大于0时,唤醒生产者
          		signal(empty);
    }
    
    Item remove(){	// 从队列取出一个产品
        	if(count == 0)
     		wait(empty);  // 可以理解为因为队列已空而等待,等待的对象是empty
       	count--;
        	item = remove_item();
         	if(count == N-1)	// 当队列中的产品小于N时,唤醒生产者
          		signal(full);
            return item;
    }
end monitor;

//生产者进程
producer(){
    while(1){
        item = 生成一个产品();    
        ProducerConsumer.insert(item);
    }
}

// 消费者进程
consumer(){
    while(1){           
        item = ProducerConsumer.remove();
        对产品加工(item);
    }
}





更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > 操作系统入门(十)比信号量更简便的进程互斥同步工具——管程

热门推荐
推荐新闻