4. 8.1信号量
进程间对共享资源的互斥访问是通过“信号量”机制来实现的。信号量机制是操作系统教材中比较重要的内容之一。Linux内核中提供了两个函数down()和up(),分别对应于操作系统教材中的P、V操作。
信号量在内核中定义为semaphore数据结构,其位于include/i386/semaphore.h:
struct semaphore {
atomic_t count;
int sleepers;
wait_queue_head_t wait;
#if
WAITQUEUE_DEBUG
long __magic;
#endif
};
其中的count域就是“信号量”中的那个“量”,它代表着可用资源的数量。如果该值大于0,那么资源就是空闲的,也就是说,该资源可以使用。相反,如果count小于0,那么这个信号量就是繁忙的,也就是说,这个受保护的资源现在不能使用。在后一种情况下,count的绝对值表示了正在等待这个资源的进程数。该值为0表示有一个进程正在使用这个资源,但没有其他进程在等待这个资源。
Wait域存放等待链表的地址,该链表中包含正在等待这个资源的所有睡眠的进程。当然,如果count大于或等于0,则等待队列为空。为了明确表示等待队列中正在等待的进程数,引入了计数器sleepers。
down()和up()函数主要应用在文件系统和驱动程序中,把要保护的临界区放在这两个函数中间,用法如下:
down();
临界区
up();
这两个函数是用嵌入式汇编实现的,非常麻烦,在此不予详细介绍。