1

我正在编写一个服务器守护程序,用户可以从中查询 C 中的数据。也可以从客户端修改数据。

我考虑将数据保存在内存中。

对于每个新连接,我都会执行一个 fork()。

我首先想到的是,每次发生连接时都会生成一个数据库副本,这是对内存的浪费。

我遇到的第二个问题是我不知道如何在父进程中修改数据库。

有什么概念可以解决这些问题?

4

2 回答 2

3

Shared memory并且multi-threading是在多个执行单元之间共享内存的两种方式。查看POSIX Threads以了解多线程,并且不要忘记在有人阅读时使用互斥锁和/或信号量来锁定内存区域以防止写入。

所有这些都是更大的问题的一部分concurrency。有很多关于并发问题的书籍和整个大学课程,所以如果你发现自己迷路了,也许你需要坐下来研究一下。如果您不小心,很容易在并发 C 程序中引入死锁和竞争条件。

于 2012-06-16T13:39:19.043 回答
1

有什么概念可以解决这些问题?

只是一些观察:

  1. fork()只克隆它在执行时执行的进程的内存。如果您在此阶段尚未打开或加载数据库,则不会将其克隆到子进程中。
  2. 共享内存——即映射的内存mmap()MAP_SHARED将在进程之间共享,不会被复制。
  3. 进程间通信的总称是进程间通信,它有多种类型和种类,具体取决于您的需要。

在现代Linux 系统上,fork()实现进程内存的写时复制。实际上,您不会在内存中得到两个进程副本 - 您最终会得到一个认为它已被复制两次的副本。如果您写入任何内存,那么它将被复制。这是一种效率节省,它利用了大多数进程在运行时仅更改其一小部分内存的事实,因此实际上即使您采用复制整个数据库的方法,您可能会发现内存使用量更少你所期望的——虽然这当然不能解决你的同步问题!

于 2012-06-16T13:43:53.130 回答