Минимальный размер для mmap - PullRequest
0 голосов
/ 02 декабря 2018

Какой минимальный размер разделяемой памяти при использовании mmap?Мне нужно создать программу, для которой объем памяти будет достаточно мал, чтобы он мог читать (или сохранять) не более нескольких символов.Как я могу это сделать?

При изменении размера на 1, 2 или 4 он все равно читает всю строку.

Я основываюсь на Как использовать совместно используемую память с Linux в 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 голосов
/ 05 декабря 2018

Фактический размер, зарезервированный для получаемого сегмента памяти, зависит от операционной системы.Как правило, в системе виртуальной памяти с полной подкачкой система выделяет память для процессов в единицах страницы, это означает, что для вашего случая будет выделен минимальный размер страницы (это 4 КБ в 32/64-битном Linux)

Для небольших кусков памяти используется вызов malloc(3) и его друзей, поскольку это может помочь вам минимизировать количество системных вызовов и меньше, чем куски страницы, которые обычно запрашивают приложения.Обычно malloc(3) вызывает sbrk(2) или memmap(2), чтобы справиться с этим.

...