1、计数信号量及其初始化
由于事件发生的次数可能不止一次,或者资源可用的数量可能不止一个,因此,信号量内部会维护一个计数器,用于表示某种事件发生的次数或者某种资源可用的数量。
信号量至少提供两种操作:一种等待信号,一种发送信号
如果信号计数=0,则进程等待;否则,计数减1,进程继续执行。
2、发送和等待信号
1)等待信号:对于等信号量而言,如果事件或资源的计数不为0,则说明事件已经发生或者资源是可用的,所以不需要等,而如果为0,则需要等待,进程不能继续往下运行。因此,需要将进程从就绪队列中移除,同时放置到信号量的等待队列等。
2)发送信号:当事件发生或者资源可用时,如果有进程在队列中等,则唤醒一个进程让其可以继续往下运行。处理方式很简单,只需要将其回插到就绪队列中,这样进程就可以继续执行了。而如果没有进程在等,则简单的将计数值+1
等待队列的排序顺序设置比较简单,当事件发生或资源可用时,最先等待的进程最先获得事件的处理权。没有基于进程的优先级进行排序。
3、互斥锁
前面通过cli和sti指令就可以快速地开关中断,进而关掉定时中断。防止进程切换。这是不太明智的。因此采用互斥锁来解决
在操作系统中,进程在进入临界区时,首先要获取这把锁,然后才能进入临界区。如果这把锁被其它进程占用了,那么此时就会类似信号量那样,在锁上进行等待;直到其它进程释放了锁之后,进程获得锁,才能继续往下运行
1)上锁
2)释放锁
如果多个进程均以只读的方式访问共享资源,那么不需要进行保护,因为资源的状态总是不变的。