Download presentation
Presentation is loading. Please wait.
1
信号量(Semaphore)
2
信号量(Semaphore) 信号量S 是个整型变量 信号量S只允许两个标准操作: wait() 和 signal()
或者,发明人称之为 P操作、V操作 wait() 和 signal()是原子操作 (atomic operations)
3
如何实现这种信号量 ? wait操作 wait (S){ value--; if (value < 0) {
add this process to waiting queue block(); } }
4
如何实现这种信号量 ? signal操作 signal (S){ value++; if (value <= 0) {
remove a process P from the waiting queue wakeup(P); } }
5
如何实现这种信号量 ? 为信号量设计一个等待队列queue 等待队列的节点(node)类型一致,都包含2项数据单元: int value;
pointer to next node in the queue
6
如何实现这种信号量 ? 等待队列带2个操作函数: Block() – 阻塞自己,主动交出CPU,引起新一轮CPU调度
Wakeup() – 唤醒等待队列里的一个进程,将它移入就绪队列
7
信号量解决无限多进程的临界区问题 进程的临界区必须符合如下框架 Semaphore S; // 初始值为 1 do{ wait (S);
Critical Section; signal (S); remainder section; } while(1);
8
WHY ? 此临界区框架符合Mutual Exclusive 此临界区框架符合Progress
此临界区框架符合Bounded Waiting
9
信号量解决一般性进程同步问题 假设要求:执行完进程Pi 的 A 之后,才允许执行进程 Pj 的 B 定义信号量 flag ,初值为 0
代码框架: Pi Pj A wait(flag) signal(flag) B
10
END
Similar presentations