信号量与管程

来源:互联网 发布:java continue label 编辑:程序博客网 时间:2024/06/18 14:06

基本同步方法

信号量semaphore:操作系统提供的一种协调共享资源访问的方法:OS是管理者,地位高于进程;信号量表示系统资源的数目。是一种抽象的数据类型:一个整形变量sem和两个原子操作(p(),申请,sem减1,如sem<0,进入等待,否则继续;v(),释放,sem加1,如sem<=0,唤醒另一等待进程)。

信号量是被保护的整数变量,初始化只能有p(),v()完成,由操作系统完成保证pv原子性。P()可能阻塞,v()不会阻塞。


信号量分类:二进制信号量、资源信号量

信号量使用:互斥访问(临界区)、条件同步(线程间)。

(1)互斥访问。信号量为1,p(),v()成对使用,用p保证互斥,用v操作保证释放临界资源。


(2)条件同步:信号量初值为0,


生产者-消费者问题:


问题分析:

任何时刻只能有一个线程操作缓冲区(互斥访问);

缓冲区空时,消费者必须等待生产者(条件同步);

缓冲区满时,生产者必须等待消费者(条件同步)

信号量描述:二进制信号量mutex,资源信号量fullBuffers,资源信号量emptyBuffers


用信号量解决生产者-消费者问题

 

 

管程:


管程Moniter:是一种用于多线程互斥访问共享资源的程序结构,采用面相对象的方法;任一时刻最多只有一个线程执行管程代码;正在管程中的线程可临时放弃管程的互斥代码,等待事件出现时恢复。在对象/模块中,收集相关共享数据,定义访问共享数据的方法。

管程组成:一个锁、0个或多个条件变量Condition Variable(是管程内的等待机制,每个条件变量表示一种等待原因,对应一个等待队列)。

Wait():将自己阻塞在等待队列中,唤醒一个等待者或释放管程的互斥访问。

Signal():将等待队列中的一个线程唤醒。条件变量的初值是0,


用管程解决生产者-消费者问题:


管程条件变量的释放处理方式:

Hansen管程当前的优先级更高T2,主要用于真实OS,Java;Horare管程等待条件变量的优先级更高T1,用于教科书中。


 

(1)读者——写者问题:共享数据的两类使用者,读读允许,读写互斥,写写互斥。

用信号量描述每个约束:信号量WriteMutex控制读写操作的互斥,初始值1;读者计数Rcount,正在进行读操作的读者数目,初始化0;信号量CountMutex,1。


用管程解决读者-写者问题:


(3)哲学家就餐问题:同步互斥

方案:1:

方案2:任何时刻只允许一个哲学家拿到刀叉 ,方法效率低


方案3:变成临界区的操作,两个人可以就餐


0 0
原创粉丝点击