如何在boost(c ++)中将内存页锁定到物理RAM?

时间:2013-08-21 07:07:34

标签: c++ boost shared-memory boost-thread

我正在使用boost中的共享内存对象,因为需要将内存页锁定到物理内存中的实时C ++应用程序。在增强中我没有看到这样做的方法。我觉得我错过了一些东西,因为我知道Windows和Linux都有办法做到这一点(mlock()VirtualLock())。

1 个答案:

答案 0 :(得分:3)

根据我的经验,最好编写一个小型跨平台库,为此提供必要的功能。当然,在内部会有一些#ifdef-s。

这样的事情(假设GetPageSizeAlign*已经实施):

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 :: libraries,但是他们已经厌倦了修复跨平台问题并转而使用我们自己的实现。它写得慢,但它有效。