8

連続したメモリのかなり大きなチャンク(〜1GB)を割り当てて初期化し、それを読み取り専用としてマークし、メモリの独自のコピーを作成せずに、それを使用する複数(たとえば数十)の子プロセスをフォークしたいと思います(マシンにはこれに十分なメモリがありません)。

いつものようにメモリを使用し、それmallocを読み取り専用としてマークすると、子プロセスがメモリをコピーせずに安全に使用できるようになると思いますか?(呼び出し後に割り当てられたメモリに何も書き込もうとしないことを確認することを条件とします)。mprotect(addr, size, PROT_READ)forkmprotect

編集:すべての答えをありがとう。

フォローアップの質問-使用することを計画していましたが、使用するため、より小さな割り当てに制限されるとshmget思いました(このページの「制限」セクションを参照)。たとえば、これを使用しているサーバーでは32MBです。しかし、私は1GBの連続したメモリが必要です。この制限について間違っていますか?mm/proc/sys/kernel/shmmax

4

6 に答える 6

8

男mprotect

実装では、addrがsysconf()によって返されるページサイズの倍数である必要があります。

マッピングがmmap()の呼び出しによって確立されなかった場合、この関数の動作は指定されません。

  1. mprotect任意のバイト範囲ではなく、ページでのみ機能するため、一般的mallocには不適切です。 posix_memalign役立つかもしれませんが...
  2. 現時点ではシステムで動作する可能性がありますが、自分で作成しなかっ mprotectたものは何も表示されませんmmapmmap(0, pages*sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)代わりに使用してください。
于 2010-02-09T20:07:53.313 に答える
3

子プロセスのいずれかがmprotect()保護を削除してそこに書き込みを開始するために呼び出すことができるという理由で、あなたは正しくありません。ページがコピーされていない場合は、の原則に違反しfork()ます。

コピーオンライトがフォークされたプロセスに使用されるように機能する場合でも、私はそのように言う標準の場所を考慮していません(たとえば、POSIXはそれがコピーオンライトであるとは言いません)。

非標準の動作を使用する代わりに、標準の手段を使用してメモリを共有することができます。たとえば、POSIXはメモリを共有しshm_open、その結果としてmmap(コメントで指摘され、ephemientによる彼の投稿で説明されたように)。ファイル記述子は、フォークによって保持されます。

于 2010-02-09T20:08:51.500 に答える
2

読み取り専用としてマークする必要はありません。子プロセスにそのままにしておくだけです。

親も子も書き込みを行わない場合は、共有されたままにする必要があります。変更したくない場合は、それで構いません。

書き込みたい場合は、MAP_SHAREDでmmapを使用することをお勧めします。

于 2010-02-09T23:40:55.077 に答える
1

あなたは、カーネルがコピーオンライトの最適化を行い、mprotect-edページをコピーしないと仮定しています。でも私はそれを当てにしません。malloc-edメモリにはあらゆる種類のメタデータが浮かんでいます-ガードページなど。そしてUlrichDrepperだけがlibc内で何が起こっているかを知っています:)

mmapディスクファイルにデータを準備し、それをすべてのプロセスに組み込むか、通常のPOSIXshm_openルートを使用する方が、おそらく簡単で安全です。

于 2010-02-09T20:09:01.107 に答える
0

Linuxは子プロセスに渡されるメモリページにコピーオンライトメカニズムを使用しているので、私の理解はイエスです。

于 2010-02-09T20:01:44.060 に答える
0

あなたはそのようにそれをすることができます。

別の方法は、 mmap()を使用することです。

もう1つの方法は、POSIX共有メモリ(shm_open())を使用することです。他の主な代替手段は、System V共有メモリ(shmget()shmat())です。正式な共有メモリシステムの利点の1つは、親プロセスがメモリを作成し、それが有益である場合は、無関係のプロセスがそれに接続できることです。

于 2010-02-09T20:10:44.023 に答える