2013-08-20 138 views
1

信号量的当前实现如何工作?它使用自旋锁或信号吗?Linux信号量:自旋锁或信号?

如果使用信号,调度程序如何知道调用哪一个?

它又如何在用户空间中工作?内核锁定建议螺旋锁,但用户空间不。那么用户空间和信号量的内核空间的实现是不同的?

+0

如果您在提问时注意到右侧,您会看到它提示“提供详细信息”。分享您的研究成果.'..请这样做,以便我们知道您看过的地方,您找到的并帮助您! –

+0

@ user1761555问题是绰绰有余 – user567879

回答

5

使用开源的力量 - 只要看看源代码。

内核空间旗语被定义为

struct semaphore { 
    raw_spinlock_t  lock; 
    unsigned int  count; 
    struct list_head wait_list; 
}; 

lock用于保护countwait_list

等待信号量的所有任务都驻留在wait_list中。当信号量被提升时,一个任务被唤醒。

用户空间信号量应该依赖于信号量相关的系统调用,Kernel提供。用户空间信号的定义如下:

/* One semaphore structure for each semaphore in the system. */ 
struct sem { 
    int    semval;  /* current value */ 
    int    sempid;  /* pid of last operation */ 
    spinlock_t  lock;  /* spinlock for fine-grained semtimedop */ 
    struct list_head sem_pending; /* pending single-sop operations */ 
}; 

内核使用类似于内核空间信号量的用户空间信号量的定义。 sem_pending是一个等待进程的列表加上一些额外的信息。

我应该再次强调内核空间信号量和用户空间信号量都不使用自旋锁来等待锁定。 Spinlock仅包含在两种结构中,以保护结构成员免受并发访问。在结构被修改之后,释放螺旋锁并且任务停留在列表中直到唤醒。

此外,自旋锁不适合等待来自另一个线程的某个事件。在获取自旋锁之前,内核禁用抢占。所以,在这种情况下,在单处理器机器上,自旋锁永远不会被释放。

我还应该注意到,在代表用户空间服务时,用户空间信号在内核空间中执行。

P.S.内核空间信号量的源代码位于include/linux/semaphore.hkernel/semaphore.c,用户空间一个在ipc/sem.c

+0

我的问题是为什么它有spinlock而不是睡眠机制? – user567879

+1

自旋锁仅包含用于保护'count'和'wait_list',并在编辑它们时避免竞争条件。任务添加到'wait_list'后,释放spinlock并将任务放在'wait_list'中直到唤醒。 –

+1

用户空间和内核空间中是否有任何信号量的实现? – user567879