【问题标题】:POSIX Semaphore or RW lock inside shared memory共享内存中的 POSIX 信号量或 RW 锁
【发布时间】:2014-06-02 09:14:12
【问题描述】:

我有一个服务器 C 应用程序,它使用 write(2) 以同步模式写入日志,但正因为如此,它有时会阻塞 100-400 毫秒(有时更长),因为服务器机器上的 IO 负载非常高.

我想将日志写入进程地址空间中的一个 POSIX 共享内存区域 mmap-ed。在这种情况下,另一个进程只会从该 POSIX 共享内存中读取数据并写入磁盘。这样,如果进程崩溃,日志信息不会丢失,唯一的问题是在断电的情况下。

将 POSIX 信号量或 POSIX RW 锁放在共享内存中(因此放在 mmap-ed 区域内)以实现写入器和读取器之间的同步是否安全?在这种情况下,有什么特别需要考虑的吗?

【问题讨论】:

  • 只要确保它被初始化为 PTHREAD_PROCESS_SHARED 就可以了。

标签: c linux posix shared-memory


【解决方案1】:

您当然可以重新发明轮子,但您可能需要考虑使用 syslog [1]。但是,如果您确定必须按照自己的方式做事,您可能需要考虑将 mqueues[2] 或命名信号量[3] 与共享内存结合使用。

[1]http://www.gnu.org/software/libc/manual/html_node/Syslog.html#Syslog
[2] 人 7 mq_overview
[3] man 7 sem_overview

【讨论】:

  • 我知道我可以将命名信号量与共享内存结合使用,但我对将信号量放置在此共享内存中的情况感兴趣。关于重新发明轮子,我不能使用 syslog,因为我有一些不同的日志轮换和压缩策略。
  • 从学术角度来看,知道这是否确实安全会非常有趣。然而,对我来说,这听起来像是我想做一些很酷的事情,所以我塑造我的问题以适应所需的解决方案。 syslog 文件的轮换和压缩可以通过 logrotate 配置进行配置(在文件上,因此在设施级别上)。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2010-10-26
  • 2010-11-27
相关资源
最近更新 更多