4.    8.1信号量

  进程间对共享资源的互斥访问是通过“信号量”机制来实现的。信号量机制是操作系统教材中比较重要的内容之一。Linux内核中提供了两个函数down()up(),分别对应于操作系统教材中的PV操作。

信号量在内核中定义为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();

  这两个函数是用嵌入式汇编实现的,非常麻烦,在此不予详细介绍。