ロックフリーのプログレス保証を満たすアルゴリズムまたはデータ構造の難点の1つは、ダイナミックメモリ割り当てです。malloc
またはnew
のようなものは、ポータブルな方法でロックフリーであることが保証されていません。しかし、malloc
またはnew
の多くのロックフリー実装が存在し、ロックフリーアルゴリズム/データ構造を実装するために使用できるさまざまなロックフリーメモリアロケータもあります。ダイナミックロックフリーメモリアロケータ
しかし、私はまだあなたは、特に、いくつかの事前に割り当てられたスタティック・メモリ・プールにデータ構造やアルゴリズムを制限しない限り、これは実際には完全に、ロックフリー進捗保証を満たすことができる方法を理解していません。しかし、の動的メモリ割り当てであるが必要な場合は、ロングランでロックフリーのメモリアロケータが本当にロックフリーになることはありません。問題は、ロックフリーのmalloc
またはnew
がどれほど驚異的であっても、最終的にメモリが不足している可能性があります。その時点で、オペレーティングシステムにより多くのメモリを要求する必要があります。つまり、最終的にはbrk()
またはmmap()
またはそのような低レベルの同等物に電話して、実際にはより多くのメモリにアクセスする必要があります。また、これらの低レベル呼び出しのどれかがロックフリーの方法で実装されているという保証はありません。
メモリ保護を提供しないMS-DOSなどの古代OSを使用していないか、完全にロックフリーのオペレーティングシステムを作成しない限り、実用的ではない2つのシナリオおそらくどのような動的メモリアロケータが本当にロックフリーであるのでしょうか?
アロケータはOSから大きなブロックを要求するだけなのでそれをタイムリーにリリースする必要はありません。 'sbrk()'への呼び出しの総数や、それが問題ではないところまで厳密に制限できるものはありません。もちろん、これは厳しいリアルタイム要件を満たすものではありませんが、完全にロックフリーであっても、動的割り当てがそのような要件を満たすとは思いません。 –
待ち時間が心配ですか、またはhttps://en.wikipedia.org/wiki/Nonblocking_algorithmを使用することを心配していますか?後者の場合、最も良いOSは、他のスレッドがmmapを使用することを妨げるロックを保持している間にスレッドがカーネル内でスリープするのを不可能にすると思います。だから非ブロッキングアルゴリズムを書く限り、私はそれが技術的には 'mmap'を使うのは問題ではないと思います。クリティカルセクションの中のいくつかのCPUキャッシュミスはおそらく最悪の場合があります。 –
実際のシステムで実行されているすべてのアロケータは、ある時点でメモリが不足している必要があります。その静的プールが割り振られたときに実行されるロックフリーのアロケータは、OSが十分なものと判断したときに実行される通常のアロケータとは定性的に異なりません。 –