信号量(Semaphores)机制是一种卓有成效的进程同步工具。信号量机制已被广泛应用于单处理机和多处理机系统以及计算机网络中。
信号量机制的发展:
整型信号量 “忙等”,未遵循“让权等待”准则
记录型信号量——重点
AND型信号量、信号量集
需要一个用于代表临界资源数目的整型变量value;还要一个在该资源上阻塞的队列(链表)指针L。故信号量应采用记录型(C语言中为结构型)的结构:
- struct semaphore //记录型信号量的结构定义
-
-
- {
-
- int value ;
-
- PCB *L ;
-
- };
信号量除初始化外,只能通过两个原子操作(称为原语)
wait(S)和signal(S)来访问。它们以前被称为P、V操作。
wait和signal操作可用C/C++语言描述如下:
- void wait( semaphore S)
- {
- S.value = S.value – 1 ;
- if (S.value <0 )
- block (S.L ) ;
- /* 让权等待 */
- }
- void signal (semaphore S )
- {
- S.value = S.value + 1 ;
- if ( S.value > 0 )
- wakeup ( S.L ) ;
- /*唤醒第一个等待的进程 */
- }
Win32中创建信号量对象的API函数是CreateSemaphore( );
对应的wait操作是wait类函数;
例如WaitForSingleObject( )或WaitForMultipleObjects( )等;
与signal操作对应的API函数是 ReleaseSemaphore( )。
wait和signal操作的物理意义:
对信号量S的每次wait操作,意味着进程请求一个该类临界资源,因此描述为S.value=S.value-1;当S.value<0时,表示该类资源已分配完,因此进程应调用block原语进行自我阻塞,放弃处理机,并插入到信号量链表S.L(阻塞队列)中。可见该机制遵循了“让权等待”准则。