mmap的最小尺寸

时间:2018-12-02 14:43:50

标签: c linux unix memory mmap

使用mmap时,共享内存的最小大小是多少?我需要创建一个程序,其内存大小将足够小,以便最多可以读取(或保存)几个字符。我该怎么办?

将大小更改为1、2或4时,它仍会读取整个字符串。

我基于How to use shared memory with Linux in C

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

void* create_shared_memory(size_t size) {

  int protection = PROT_READ | PROT_WRITE;
  int visibility = MAP_ANONYMOUS | MAP_SHARED;

  return mmap(NULL, size, protection, visibility, 0, 0);
}

#include <string.h>
#include <unistd.h>

int main() {
  char* parent_message = "hello";  // parent process will write this message
  char* child_message = "goodbye"; // child process will then write this one

  void* shmem = create_shared_memory(128);

  memcpy(shmem, parent_message, sizeof(parent_message));

  int pid = fork();

  if (pid == 0) {
    printf("Child read: %s\n", shmem);
    memcpy(shmem, child_message, sizeof(child_message));
    printf("Child wrote: %s\n", shmem);

  } else {
    printf("Parent read: %s\n", shmem);
    sleep(1);
    printf("After 1s, parent read: %s\n", shmem);
  }
}

1 个答案:

答案 0 :(得分:0)

为您接收的内存段保留的实际大小取决于操作系统。通常,在全页虚拟内存系统上,系统会以页面为单位为进程分配内存,这意味着,对于您而言,将分配最小页面大小(在32/64位linux中为4KB)

对于较小的内存块,使用的是调用malloc(3)及其朋友,因为这可以为您处理最小化的系统调用次数,并且比通常应用程序的页面块小请求。通常是malloc(3)调用sbrk(2)memmap(2)来处理此问题。