shm_open()
mmap()
定義済みの大きなlength
fork()
(数回)ftruncate()
意のままに
これのポイントは、生成されたすべてのプロセスfork()
が同じアドレスに共有セグメントを持つようにすることです。それでも、RAMを常にビジー状態にしたくはありませんが、動的にサイズを変更します(サイズは 0 - big にまたがりますlength
)。
これは機能しますか?UBはありますか?
shm_open()
mmap()
定義済みの大きなlength
fork()
(数回)ftruncate()
意のままにこれのポイントは、生成されたすべてのプロセスfork()
が同じアドレスに共有セグメントを持つようにすることです。それでも、RAMを常にビジー状態にしたくはありませんが、動的にサイズを変更します(サイズは 0 - big にまたがりますlength
)。
これは機能しますか?UBはありますか?
いいえ、大丈夫です。基になるファイルはいつでも切り捨てることができますがSIGBUS
、ファイルの境界を超えてメモリにアクセスすると、エラーが発生する可能性があります。そのため、ファイルの現在の長さを超えてメモリにアクセスしないように (またはキャッチして処理しないように)、細心の注意を払う必要がありますSIGBUS
。
からman 2 mmap
:
マップされた領域を使用すると、次のシグナルが発生する可能性があります。
SIGBUS
ファイルに対応しないバッファの部分へのアクセスが試みられました (たとえば、別のプロセスがファイルを切り捨てた場合を含め、ファイルの終わりを超えて)。
実際に使用しない限り、「RAM をビジー状態に保つ」ことはありません。
使い終わった後にRAM をビジー状態にしておくことが心配な場合は、呼び出します。madvise(MADV_DONTNEED)
これにより、ページがパージされ、再度アクセスした場合にゼロ プールから新しいページが返されます。
サイズを変更しないでください。
RAM を常にビジー状態に保ちたくない
それが、仮想メモリを使用してカーネルが行うことです。mlock()
またはを使用しない限り、必要に応じて/適切にページングされますMAP_LOCKED
。