什么是信号量,它们是如何引起的?


8

最近,我开始遇到我的Apache崩溃且无法重新启动的问题。然后,托管公司告诉我,这与“信号量”有关,并向我发送了此信息,以解决问题:

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

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

什么是信号量?到底是谁放的?它们在哪里?它们如何使我的Apache崩溃?

我为一些一般性的解释感到非常高兴!

Answers:


9

就像其他人所说的那样,信号量是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查看与sempahore相关的设置。如果要保留任何sysctl更改,请尝试将它们放入/etc/sysctl.conf


4

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

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


关于StackOverflow的话题也有一个话题:stackoverflow.com/questions/34519/what-is-a-semaphore
James Sneeringer,2010年

您的URL中有一个错误。该URL缺少正确的)这似乎是Serverfault软件中的一个错误……
tegbains 2010年

grumble 它可以在预览中正确获取URL,并在保存时删除。
pgs 2010年

到目前为止谢谢。但是它们是什么,它们如何体现?它们是文件,还是日志中的条目?他们与记忆力有什么关系?它们可能是由于错误的php编程(如我的托管公司告诉我的)引起的吗?
markus

它们是共享内存和内核结构。PHP不是线程安全的,因此您应该使用Apache2的prefork多处理模块。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.