【问题标题】:Linux semaphores: spinlock or signals?Linux 信号量:自旋锁还是信号?
【发布时间】:2013-08-20 06:18:42
【问题描述】:

信号量的当前实现是如何工作的?它使用自旋锁还是信号?

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

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

【问题讨论】:

  • 如果您在提问时注意到右侧,您会看到上面写着Provide details. Share your research...请这样做,以便我们知道您在哪里查看,找到了什么并为您提供相应的帮助!
  • @user1761555 这个问题已经足够详细了

标签: linux linux-kernel semaphore


【解决方案1】:

利用开源的力量 - 只需查看源代码。

内核空间信号量定义为

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

lock 用于保护countwait_list

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

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

/* 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 是等待进程列表以及一些附加信息。

我应该再次强调一点,内核空间信号量和用户空间信号量都没有使用自旋锁来等待锁定。自旋锁包含在这两个结构中只是为了保护结构成员免受并发访问。结构修改后,自旋锁被释放,任务在列表中停留直到被唤醒。

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

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

附:内核空间信号量的源代码位于include/linux/semaphore.hkernel/semaphore.c,用户空间信号量位于ipc/sem.c

【讨论】:

  • 我的问题是为什么它有自旋锁而不是休眠机制?
  • 自旋锁仅用于保护countwait_list 并在编辑它们时避免竞争条件。任务添加到wait_list 后,自旋锁被释放,任务在wait_list 中休息直到被唤醒。
  • 用户空间和内核空间有没有信号量的实现?
  • 我添加了有关用户空间信号量的内核实现的详细信息
猜你喜欢
  • 2010-09-16
  • 2010-10-30
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多