【问题标题】:Do semaphores require syscalls?信号量需要系统调用吗?
【发布时间】:2017-07-31 15:03:12
【问题描述】:

我正在通过过去的考试来准备有关操作系统的考试。它主要是关于 Unix 系统,C 编程语言,它提到了很多 POSIX,所以最好在这里问这个问题。

问题是:

给出简单自旋锁和/或信号量的三个缺点。解释相应的其他机制如何改进该问题。

给出的 3 个缺点之一 + 解释如下:

即使线程可以立即继续,信号量也需要系统调用。 (0.5 P) 另一方面,自旋锁可以完全在用户空间中实现,不需要系统调用。它们对于较短的等待时间非常有效。 (0.5P)

为什么信号量需要系统调用?它们必须在内核空间中吗?它们是否需要执行特权指令?

单处理器和多处理器系统都需要考虑。

【问题讨论】:

  • 我给你一个提示:什么是信号量,它是如何实现的?我建议在一些问题中尝试理解它们,而不是记住答案,至少如果您对该主题感兴趣的话。
  • @RuiFRibeiro 我对这个主题很感兴趣,并且可以考虑在用户空间实现它的方法和在内核空间实现它的方法。我确实理解需要系统调用 if 在信号量上调用 wait() 的进程必须等待(例如,信号量已完全使用)并且 if 一对一一种线程模型用于屈服。但是,除此之外,我不明白为什么操作系统必须参与其中。该解决方案的字面意思是:“即使线程可以立即继续,信号量也需要系统调用。” 明天就要考试了,希望能尽快回答。
  • 你有特殊的系统调用信号量tldp.org/LDP/lpg/node51.html 或者作为一个穷人信号量你甚至可以有一个文件,甚至是共享内存中的一个变量......我会建议一些与教授一起澄清的疑问,因为他们通常对主题有自己的特殊解释,并给他们的意见更多的点。
  • 请注意,该解决方案在客观上是错误的。 futexes 旨在支持信号量,并且这样做不需要在非竞争情况下需要系统调用。
  • 我对信号量在任何情况下都需要系统调用的答案提出异议。只有当您处理相互不信任的进程时,您才需要内核来监督信号量。在这种情况下,使用信号量需要一个系统调用。如果您有“遵守规则”的进程,则可以在用户空间中实现和使用信号量。

标签: kernel cpu privileges system-calls semaphore


【解决方案1】:

一些历史背景会让事情变得更清楚。在 POSIX IPC 出现之前,信号量最初是 System V 进程间通信包(System V IPC)的一部分。这些名称可能会为您提供有关事情发展方向的线索。最初的用例是由合作进程共享的锁。 (我 99.99% 确定 IPC 比线程早了很长一段时间。)

POSIX 信号量与进程或线程一起工作,因此涉及操作系统。上下文在这里很重要,因为答案显然是关于标准信号量的实现,而不是信号量的抽象概念。

【讨论】:

    【解决方案2】:

    是的,信号量需要系统调用,除非在非常特殊的情况下。信号量必须能够等待其他竞争者释放资源。等待需要系统调用。

    如果锁上的竞争者可以访问共享内存空间并且他们相互信任以遵守信号量协议,这主要是当锁位于同一进程的线程之间时,那么锁并不总是需要一个系统调用:它可以使用非特权处理器指令来检查和更改锁定状态。这允许在锁空闲时获取锁,然后释放锁,但等待锁空闲是另一回事。

    自旋锁一直忙(“自旋”),直到锁空闲。如果已知争用锁的线程在不同的 CPU 上运行,这可能是一个有效的策略。如果线程可能在同一个 CPU 上运行,那么等待锁的线程需要允许另一个线程运行,因此它需要让步。使用用户态线程,这可以在没有系统调用的情况下完成。

    信号量应该休眠直到锁准备好。在现实世界中,通过旋转睡觉是很少被接受的。休眠几乎总是需要系统调用:内核将等待线程从调度程序的就绪列表中移出,并移到信号量对象的等待列表中。

    【讨论】:

      猜你喜欢
      • 2014-09-10
      • 2020-02-16
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多