以下代码在xv6(risc—v)中执行.我有点糊涂了.为什么在malloc()之后需要madvise()? 是否用于页面表条目交换/交换?

PS. vmprint()打印页面表.

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/vm.h"

#define PG_SIZE 4096
#define NR_PG 16

int main(int argc, char *argv[]) {
  vmprint();
  char *ptr = malloc(NR_PG * PG_SIZE);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_NORMAL);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_DONTNEED);
  vmprint();
  madvise((uint64) ptr + 10*PG_SIZE, 2*PG_SIZE , MADV_WILLNEED);
  vmprint();
  exit(0);
}

推荐答案

malloc()函数分配这个内存块后,madvise()函数用于通知内核使用特定内存区域.

  • 第一个madvise()调用通知内核,从ptr + 10*PG_SIZE开始并扩展到2*PG_SIZE字节的内存区应该被视为MADV_NORMAL,表示正常的内存访问模式.此调用不会立即对内存分配造成任何更改.

  • 第二个指示指定的内存范围如果不在使用中可以被丢弃.

  • 第三个,指示指定的内存范围将很快被访问,因此内核可以主动将页面引入内存,以最大限度地减少访问它们时的延迟.

C++相关问答推荐

设计处理各种数据类型的方法和数据 struct

为什么已经设置的值在C中被重置为for循环条件中的新值?

getchar读css + z还是返回css?

exit(EXIT_FAILURE):Tcl C API类似功能

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

我可以在C中声明不同长度数组的数组而不带变量名吗?

GCC创建应用于移动项的单独位掩码的目的是什么?

使用sscanf获取零个或多个长度的字符串

GTK3按钮信号错误

Square不与Raylib一起移动

从另一个宏函数调用C宏

在我的第一个C语言中观察到的错误';你好世界';程序

计算时出现奇怪的计算错误;N Select K;在C中

STM32:代码的执行似乎取决于它在闪存中的位置

指向返回 struct 成员的指针,安全吗?

一元运算符

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

Zig 中 C 的system函数的惯用替代方案

将十六进制值或十进制值分配给 uint16_t 有什么区别?