信号量与PV操作
问题的提出
- TS或swap指令管理临界区,采用忙式轮询,效率低
- 关开中断管理临界区,不便交给用户程序使用
信号量的构思
一种可动态定义的软件资源:信号量
-
核心数据结构:等待进程队列
-
信号量声明:资源报到,建立队列
-
申请资源的原语:若申请不得,调用进程入队等待
-
归还资源的原语:若队列中有等待进程,需释放
-
信号量撤销:资源注销,撤销队列
记录型信号量的定义
记录型信号量:一种带数值的软资源
PV操作解决进程互斥问题框架
semaphore s;
s = 1;
cobegin
process Pi {
···
P(s);
临界区;
V(s);
···
}
coend;
例:PV操作解决机票问题
int A[m];
semaphore s;
s = 1; // 只有相同航班的票数才是相关的临界资源,所以用一个信号量处理全部机票会影响进程并发度
cobegin
Process Pi {
int Xi;
Li:按旅客订票要求找到A[j];
P(s);
Xi = A[j];