2012-01-19 1 views
1

Linuxでshm_openを試して問題に遭遇しています。私は頻繁に共有メモリセグメントのサイズをftruncで変更し、mmapを使ってサイズ変更されたセグメントを再マップします。しかし、20メガバイトのマークのまわりで、私はmmapからENOMEMを取得します。私はこの問題を解決するために行うことを試みてきたmmapはshm_openファイルオブジェクトでENOMEMを返します。

もの:

最初、私はこれらのsysctlのパラメータを知りました。私はそれらを再構成:

kernel.shmmax = 268435456 
kernel.shmall = 2097152 

(SHMALLはページ単位で指定されている)

問題はまだこの後に起こりました。この問題を引き起こすサイズ変更の詳細を調べると、共有メモリオブジェクトのサイズを変更するためにftruncに呼び出されたことがわかりました(/ dev/shmの対応するファイルには新しいサイズが要求されていました)。


[ENOMEM] MAP_FIXEDが指定され、範囲[ADDR、ADDR + lenが)のアドレス空間に許可することを超えて:ここから

ドキュメントhttp://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.htmlはENOMEMのerrnoにするための3つの原因が示唆しますプロセス; MAP_FIXEDが指定されておらず、アドレス空間にマッピングを行うのに十分な空きがない場合

[EN] [ML] [オプション] mlockall()が必要とする場合、システムが提供できるスペースよりも多くのスペースが必要になるため、マッピングをメモリにロックできませんでした。 [オプションの開始]

[TYM][TYM] [オプションの開始] lenバイトを割り当てるためにfildesによって指定された型付きのメモリオブジェクトに十分な未割り当てのメモリリソースが残っていません。 [オプション終了]


iがMAP_FIXEDまたはロックを使用していない、と/ dev/SHMの画像のサイズは、第三の理由は問題ではないことを示唆しています。私のmmapコールは、次のようになります

のmmap(MEM、長さ、PROT_READ | PROT_WRITE、MAP_SHARED、FD、0)

MEMは、最初は0で、その後に成功マッピングされた最後のアドレスはmmapを参照

私は、ulimit設定がメモリを1つのプロセスにマップ可能に制限している可能性があることを示す情報を見つけましたが、ここに問題はないと思います。念のためには、ulimit -aは、私のマシン上で次のようになります。

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 20 
file size    (blocks, -f) unlimited 
pending signals     (-i) 16382 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 65536 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) unlimited 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

私は、これは簡単なものであると思います:)

+1

'shmmax'と' shmall' sysctl調整パラメータはPOSIX SHMではなくSysV SHM用です。 –

答えて

1

がよく、私は私の問題は、他の日だったものが分かりました。私はmmapのドキュメントを誤読しています。これは、mmapが最初のパラメータ(私の場合は以前にマップされたアドレス)に基づいてマッピングを返し、その結果が実装によって定義されていると言います。私はmmapが私のために私の以前のマッピングを再マップするかもしれないという提案としてこれを取ったが、これは確かにそうではなかった。これは、MAP_FIXEDフラグを使用した場合にのみ当てはまるかもしれませんが、ドキュメントが推奨されているので、これを避けています。いずれにしても、新しいマップを作成する前にmunmapを使用して以前のマッピングを削除する必要がありました。私はこの投稿が私と同じ愚かな誤読をしている人を助けることを願っています

関連する問題