信号量是否需要系统调用?

时间:2017-03-09 20:10:41

标签: kernel cpu privileges system-calls semaphore

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

问题是:

  

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

给出的3个缺点之一+解释是这样的:

  

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

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

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

2 个答案:

答案 0 :(得分:3)

一些历史背景会使事情更加清晰。在POSIX IPC出现之前,信号量最初是System V进程间通信包(System V IPC)的一部分。这些名字可能会让你知道事情的发展方向;原始用例是由合作进程共享的锁。 (我有99%的百分比肯定IPC早就有线了。)

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

答案 1 :(得分:0)

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

如果锁上的竞争者有权访问共享内存空间并且他们彼此信任以尊重信号量协议,这主要是当锁在同一进程的线程之间的情况时,则锁定不会。 t总是需要系统调用:它可以使用非特权处理器指令来检查和更改锁定状态。这允许获取锁定,如果它是空闲的,并释放锁定,但等待锁定是免费的是另一回事。

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

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