临界资源是系统中需要仔细考虑的问题。我们在设计代码的时候经常会有多个进程同时访问同一个资源的问题,特别是修改同一个资源会导致意外的情况。一般会有几种常用的策略,关闭总中断,加锁,信号量。
关闭中断的办法是简单操作系统中经常使用的方法,在进入临界域的时候,关闭所有中断,防止操作被打断。但这个办法不适合多进程的复杂系统,会导致系统无法响应某些输入。
加锁测试也是简单系统中常用的方式,实现简单,但是比较浪费CPU时间。下例就是一个加锁的伪代码
lock(key[s])
{
L: if key[s]==0
then goto L
else key[s]=0
}
unlock(key[s])
{
key[s]= 1
}
PA()
{
L1: lock(key[s])
<s>
unlock(key[s])
goto L1
}
PB()
{
L2: lock(key[s])
<s>
unlock(key[s])
goto L2
}
PA和PB是两个进程,通过key做为锁来控制进入临界域的。
信号量法
信号量法是OS中常用的互斥控制方法,它实现的原理是任务都在一个队列中,由队列的调度任务来控制当前任务的状态。
一般对信号量的描述是这样的
设sem为信号量,则:
当sem>=0时,表示可供并发进程使用的资源实体数
当sem < 0时,表示正在等待使用资源的进程数
还有就是原语P,V操作