我们如何分配一个我们确定不会被分页的缓冲区?

时间:2012-10-29 20:49:34

标签: c linux

也许这一件事与内核中的缓冲区分配有关。
假设我们想要写一个音乐播放器,如果发生分页,这可能会导致低质量音乐播放不稳定。
视频播放器,我们想写一个实时软件,或任何东西。
我们希望将一个CPU分配给一个进程,或者我们将进程设置为非常高的优先级,然后我们要确保我们的缓冲区不会被分页到HDD。它是如何在C和Linux中完成的?

1 个答案:

答案 0 :(得分:7)

致电:

int mlock(const void *addr, size_t len);//included in header #include <sys/mman.h>

使用区域的起始地址及其长度,系统将指示指定的内存将驻留在RAM中,直到您调用

int munlock(const void *addr, size_t len);

您还可以调用函数mlockall(MCL_FUTURE);,这将使您的所有后续内存分配成为RAM居民,但这会带来分配超过实际可用内容的风险,结果取决于实现。

修改 有关更多详细信息,请查看以下链接: http://pubs.opengroup.org/onlinepubs/007908799/xsh/mlock.html
http://pubs.opengroup.org/onlinepubs/007908799/xsh/mlockall.html

EDIT2:Zan Lynx的评论
另请注意,使用此锁定超过64KB(在大多数Linux系统上)将需要root权限。在我看来,最好的方法是让一个以root身份启动的包装器,设置宽松的实时和内存锁定要求,切换用户ID,然后运行实际的程序。


P.S 通常,当出现转换请求时,不仅要将程序锁定在RAM中,还要将调度程序设置为实时模式,为此可以检查sched_setscheduler(..)