- 1
- 0
- 约1.74万字
- 约 90页
- 2019-06-04 发布于广东
- 举报
解答 semaphore s1,s2,s3,m_over; void fan1() { 买磁带和电池; 听音乐; } void fan2() { 买随身听和电池; 听音乐; } void fan1() { 买随身听和磁带; 听音乐; } wait(s1); signal(m_over); wait(s2); wait(s3); signal(m_over); signal(m_over); 解答 void boss() { while(1) { 提供任意两种物品销售; if (提供磁带和电池) else if(提供随身听和电池) else } } signal(s1); signal(s2); signal(s3); wait(m_over); 2.5 管程机制 引入原因 使用信号量处理同步问题时,同步操作wait(s)和signal(s)分散在各个进程中,并遍布整个程序。这不仅给系统的管理和程序的维护和修改带来了麻烦,而且还会因同步操作使用不当造成死锁。 管程的定义 一组局部共享变量,以及对这些局部变量进行的操作的函数,一并称为管程。 说明:共享变量和函数,一并封装在管程内,任何进程只有通过管程才能够访问共享变量,任一时刻,最多只能有一个进程在管程中执行。 条件变量 引入目的:为了描述阻塞原因 定义格式: Var x,y :condition 执行的操作 (1)wait x.wait (2)signal x.signal 注意:若没有等待进程,x.signal不起任何作用,空操作。 2.5 管程机制 利用管程解决生产者—消费者问题 2.5 管程机制 建立管程 管程名:p_c; put投入产品 get取出产品 count产品数 目 notfull缓冲 池不 全满 notempty缓 冲池 不全空 producer: begin repeat produce a item nextp PC. put (item); until false. End Consumer: begin repeat PC.get(item); Consume the item in nextc; Until false end 回顾 经典进程同步问题 生产者—消费者问题 empty=n;full=0;mutex=1 哲学家进餐问题 只有拿到两双筷子哲学家才能就餐 读者—写者问题 允许多个读者同时读; 写者必须与其他任何进程互斥。 回顾 semaphore mutex=1 公共缓冲池(临界资源,互斥访问) full=0; 满缓冲区数目为0 生产者: { 生产商品; wait(empty); /*是否有空缓冲区 */ wait(mutex) ; /*缓冲池是否可用*/ 向缓冲区投入产品; signal(mutex); /*释放缓冲池*/ signal(full);/*满缓冲区数目+1*/ } 消费者: { wait(full); /*是否有满缓冲区*/ wait(mutex) ; /*缓冲池是否可用*/ 从缓冲区取出产品; signal(mutex) ; /*释放缓冲池*/ signal(empty); /*空缓冲区数目+1*/ } empty=n; 有n个空缓冲区 2.6 进程通信 进程通信是指进程之间的信息交换,其所交换的信息量,少者是一个状态或者数值,多者是成千上百万个字节。 低级通信:进程间交换信息量少。 效率低 通信对用户不透明 高级通信:用户可直接利用操作系统所提供的一组通信命令,高效地传送大量数据的一种通信方式。 操作系统隐藏了进程通信的实现细节。 通信过程对用户是透明的。 2.6 进程通信 进程通信类型(高级通信) 共享存储器
原创力文档

文档评论(0)