2011-01-31 9 views
2

Iは、組み込みシステム上たshmgetを使用して共有メモリの大きなブロックを割り当てている:"shmget"を使用して大量のメモリブロックを割り当てる場合、System V IPCはどのように断片化を処理しますか?

shmid = shmget(key, 16777216, IPC_CREAT | 0666) 

システムは、スラブ・アロケータを使用してuClinuxを(2.6.28 Linuxカーネル)を実行しています。私はCPU上にMMUを持っていません。

上記のshmgetコマンドを実行すると、しばらくしてページの割り当てに失敗します。私は利用可能なRAMが不足しているときにもこれが発生しますが、これはRAAが十分に利用可能になってからしばらくしています。

私は、IPCサブシステムがこの手順で連続した物理16Mbセグメントを必要とし、フラグメント化されているために1つを見つけることができないため、このエラーが発生する可能性があることを確信しています。メモリが不足していたり​​、割り当てが失敗したり、他の場所に問題がありますか?

+0

これは断片化によるもので、カーネルログに 'page allocation failure:order x'の行に何かがあり、空きメモリチャンクのリストの下に数行あります。' x * 4Kb y * 8Kb z * 16Kb ...などとなります。 "Order"は、割り当てのサイズを取得するためにページサイズをシフトするビットの数です。 – ninjalj

+0

@ ninjaljええ、それは私が受け取っているエラーです。 – lxe

答えて

5

!MMUシステムでは、仮想メモリがないため、想定通りです。物理メモリの連続したブロックが必要です。

複数の小さな共有メモリブロックを使用するようにアプリケーションをリファクタリングしたり、起動後に可能な限り早く共有メモリを割り当てることで、この問題を軽減できます。

+0

私はブート時にセグメントをすぐに割り当てることは考えていませんでした。これはメモリホッグになりますが、これは実行可能な解決策かもしれません。 – lxe

関連する問題