什么是信号量以及它是如何产生的?

什么是信号量以及它是如何产生的?

我最近遇到了一个问题,我的 Apache 崩溃了,无法重新启动。托管公司告诉我,这与“信号量”有关,并向我发送了一段他们用来解决问题的代码片段:

/usr/bin/ipcrm sem $(/usr/bin/ipcs -s | grep www-data | awk '{print$2}')

现在很高兴有一个命令可以执行并解决我的问题,但我又不知道这是怎么回事。

信号量是什么?到底是谁放置它们?它们在哪里?以及它们是如何导致我的 Apache 崩溃的?

我很高兴得到一些一般性的解释!

答案1

正如其他人所说,信号量是 IPC(进程间通信结构)。信号量和所有 IPC 一样,用于允许不同进程相互通信。

它们基本上是使用特殊系统调用创建、访问和销毁的计数器,例如 sempost(3)、semwait(3)、semget(2) 和 semop(2)。请参阅 Linux 系统上的 sem_overview(7) 了解简要说明。

此处通信的定义相当原始。信号量的“通信”意味着通过上述系统/库调用读取、增加或减少计数器。

信号量除了本身特殊之外,还有一个特点就是每次只有一个进程可以对其执行操作,并且信号量操作保证是原子的,也就是说,您不会陷入信号量竞争状态,因为内核不会换出正在执行信号量操作的进程。

另一个特殊之处是它们是在共享内存中创建的,允许多个进程访问它们。

它们的表现/创建方式是程序使用 semget(2) 创建它们。例如,apache 在运行时创建信号。

ipcs -l 将告诉您有关系统的 ipc 资源的信息。

您可以使用 sysctls 来操纵一些系统信号量和 ipc 相关限制。尝试 sysctl kernel.sem通过 sysctl 查看信号量相关设置。如果您想要保留任何 sysctl 更改,请尝试将它们放入/etc/sysctl.conf

答案2

信号量是一种进程间通信形式(ipcrm 中的 ipc)。它们由操作系统提供,Apache 的开发人员使用它们在不同的 Apache 进程之间进行通信。它们不太可能是 Apache 崩溃的原因,但它们在崩溃时不会被释放,从而阻止启动新的 Apache 实例。

维基百科:信号量(编程)

相关内容