ユーザーがCでデータを照会できるサーバーデーモンをプログラミングしています。データはクライアントからも変更できます。
データをメモリに保存することを考えました。
新しい接続ごとに、fork()を実行します。
私が最初に考えたのは、これにより接続が行われるたびにデータベースのコピーが生成されるため、メモリの浪費になります。
私が抱えている2番目の問題は、親プロセスでデータベースを変更する方法がわからないことです。
これらの問題を解決するためにどのような概念がありますか?
Shared memory
とmulti-threading
は、複数の実行ユニット間でメモリを共有する 2 つの方法です。マルチスレッドについてはPOSIX Threadsを確認してください。また、mutex やセマフォを使用して、誰かが読み取りを行っているときにメモリ領域を書き込みからロックすることを忘れないでください。
これはすべて、 のより大きな問題の一部ですconcurrency
。並行性の問題については、複数の書籍や大学全体のコースがあるため、道に迷った場合は、座って少し勉強する必要があるかもしれません。注意しないと、並列 C プログラムにデッドロックや競合状態が非常に簡単に発生します。
これらの問題を解決するためにどのような概念がありますか?
いくつかの観察:
fork()
実行時に実行するプロセスのメモリのみを複製します。この段階でデータベースを開いたりロードしたりしていない場合、子プロセスに複製されません。mmap()
、MAP_SHARED
プロセス間で共有され、複製されないメモリです。脇最新の Linux システムでfork()
は、プロセス メモリのコピー オン ライト コピーを実装します。実際には、メモリ内にプロセスの 2 つのコピーが存在することはありません。2 回コピーされたと認識される 1 つのコピーが存在することになります。いずれかのメモリに書き込むと、コピーされます。これは、大部分のプロセスが実行時にメモリのごく一部しか変更しないという事実を利用した効率的な節約です。したがって、実際には、データベース全体をコピーするアプローチを採用した場合でも、メモリの使用量が少なくなることがあります。もちろん、それで同期の問題が解決するわけではありません。