メモリ ページを物理メモリにロックする必要があるリアルタイム C++ アプリケーションのために、boost で共有メモリ オブジェクトをいじっています。ブーストでこれを行う方法がわかりません。WindowsとLinuxの両方にこれを行う方法があることを知っているので、何かが欠けているように感じます(mlock()
およびVirtualLock()
)。
1 に答える
4
私の経験では、これに必要な機能を提供する小さなクロスプラットフォーム ライブラリを作成することをお勧めします。もちろん、内部的にはいくつかの #ifdef-s があります。
このようなもの(仮定してGetPageSize
、Align*
すでに実装されています):
void LockMemory(void* addr, size_t len) {
#if defined(_unix_)
const size_t pageSize = GetPageSize();
if (mlock(AlignDown(addr, pageSize), AlignUp(len, pageSize)))
throw std::exception(LastSystemErrorText());
#elif defined(_win_)
HANDLE hndl = GetCurrentProcess();
size_t min, max;
if (!GetProcessWorkingSetSize(hndl, &min, &max))
throw std::exception(LastSystemErrorText());
if (!SetProcessWorkingSetSize(hndl, min + len, max + len))
throw std::exception(LastSystemErrorText());
if (!VirtualLock(addr, len))
throw std::exception(LastSystemErrorText());
#endif
}
また、boost:: ライブラリのいくつかを使用しようとしましたが、クロスプラットフォームの問題を修正するのに疲れて、独自の実装に切り替えました。書くのは遅くなりますが、うまくいきます。
于 2013-11-17T12:56:23.003 に答える