我正在编写一个服务器守护程序,用户可以从中查询 C 中的数据。也可以从客户端修改数据。
我考虑将数据保存在内存中。
对于每个新连接,我都会执行一个 fork()。
我首先想到的是,每次发生连接时都会生成一个数据库副本,这是对内存的浪费。
我遇到的第二个问题是我不知道如何在父进程中修改数据库。
有什么概念可以解决这些问题?
Shared memory
并且multi-threading
是在多个执行单元之间共享内存的两种方式。查看POSIX Threads以了解多线程,并且不要忘记在有人阅读时使用互斥锁和/或信号量来锁定内存区域以防止写入。
所有这些都是更大的问题的一部分concurrency
。有很多关于并发问题的书籍和整个大学课程,所以如果你发现自己迷路了,也许你需要坐下来研究一下。如果您不小心,很容易在并发 C 程序中引入死锁和竞争条件。
有什么概念可以解决这些问题?
只是一些观察:
fork()
只克隆它在执行时执行的进程的内存。如果您在此阶段尚未打开或加载数据库,则不会将其克隆到子进程中。mmap()
,MAP_SHARED
将在进程之间共享,不会被复制。在现代Linux 系统上,fork()
实现进程内存的写时复制。实际上,您不会在内存中得到两个进程副本 - 您最终会得到一个认为它已被复制两次的副本。如果您写入任何内存,那么它将被复制。这是一种效率节省,它利用了大多数进程在运行时仅更改其一小部分内存的事实,因此实际上即使您采用复制整个数据库的方法,您可能会发现内存使用量更少你所期望的——虽然这当然不能解决你的同步问题!