库可以替换 C/C++ 中的本地套接字吗?

Can libraries replace local socketing in C/C++?

我正在尝试用 C++ 开发一个特定的数据库服务器,我有两个问题:

据我所知,通过库对数据库服务器进行本机调用可以消除序列化和套接字系统调用的开销(即使它添加了对动态库的调用)。此外,我不确定如何与库共享内存,但如果可以的话,"almost" 作为客户端与服务器共享内存可能非常有益。

是的,如果您的数据库客户端与您的数据库服务器位于同一台机器上,它们可以使用共享内存 IPC 等技术直接通信。但是,这通常没有用,因为:

  • 所有客户端都在一台机器上的数据库很少见。
  • 除了管理界面之外,在同一台机器上甚至只有一个客户端的数据库也不是典型的。
  • 像 Linux 这样的系统已经为本地主机套接字通信内置了优化,因此它根本不通过网络——只通过内核。
  • 由于系统调用,性能受套接字IPC限制的数据库可以通过简单地使用第三方内核绕过网络通信解决方案轻松克服这个问题,这根本不需要任何特殊代码——只需插入一个内核绕过 TCP 堆栈——您可以对许多现有数据库执行此操作。

(我主要关注 Linux 和 POSIX,但原理在其他操作系统上是相同的,例如 Windows、Android, MacOSX)

数据库客户端和数据库服务器之间的通信很可能发生在 socket(7)s or some similar byte stream, like pipe(7)s or fifo(7)s. Using shared memory (shm_overview(7)...) for that communication is unusual, and you still need some synchronization mechanism (e.g. semaphores sem_overview(7)...)。

有一些库(在套接字之上)可以促进这种通信,例如 0mq.

有些数据库库可以在 无需 与某些数据库服务器通信的情况下工作,特别是 sqlite, which manage the database storage directly (in your client process). You might have some issues if several processes are accessing the same database concurrently (so ACID 属性可能无法得到保证,至少如果使用 sqlite 不小心)。

注意 local inter-process communications are quite efficient on Linux. It is not unusual to have a bandwidth of several hundreds of megabytes per second on a local pipe (use rather large buffers, e.g. of 64 Kbytes or a megabyte, for read(2) & write(2)...)

实际上,在数据库中,索引和磁盘访问比客户端 <-> 服务器通信更可能成为瓶颈,至少在同一台本地主机上是这样。如果服务器是远程主机,网络通信可能是瓶颈(至少在普通 gigabit/sec 以太网上)。

另请阅读 this,尤其是 答案 部分中的 table。

也许 gdbm, redis, mongodb, postgresql 可能与您的问题相关。