加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:05:59 所属栏目:百科 来源:网络整理
导读:我正在搞乱boost中的共享内存对象,因为实时C应用程序需要将内存页面锁定到物理内存中.在增强中我没有看到这样做的方法.我觉得我错过了一些东西,因为我知道 Windows和 Linux都有办法做到这一点(mlock()和VirtualLock()). 解决方法 根据我的经验,最好编写一个
我正在搞乱boost中的共享内存对象,因为实时C应用程序需要将内存页面锁定到物理内存中.在增强中我没有看到这样做的方法.我觉得我错过了一些东西,因为我知道 Windows和 Linux都有办法做到这一点(mlock()和VirtualLock()).

解决方法

根据我的经验,最好编写一个小型跨平台库,为此提供必要的功能.当然,内部会有一些#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 :: libraries,但是他们厌倦了修复跨平台问题并转而使用我们自己的实现.它写得慢,但它有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读