LINUX.ORG.RU

История изменений

Исправление vbr, (текущая версия) :

Да не обязательно такие странные значения просить. Достаточно объём RAM + размер swap запросить и уже будет возвращать NULL.

% cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  long long size = atoll(argv[1]);
  if (size <= 0 || size > SIZE_MAX) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  void *ptr = malloc((size_t) size);
  printf("ptr=%p\n", ptr);
  free(ptr);

  return 0;
}

% free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       3.2Gi        24Gi       1.4Gi       5.2Gi        27Gi
Swap:           55Gi          0B        55Gi

% ./a.out $((80 * 1024 * 1024 * 1024))
ptr=0x7f48441ff010

% ./a.out $((90 * 1024 * 1024 * 1024))
ptr=(nil)

Оверкоммит оверкоммитом, но ядро же не настолько тупое, чтобы выделять памяти больше, чем её вообще теоретически можно выделить.

Исправление vbr, :

Да не обязательно такие странные значения просить. Достаточно объём RAM + размер swap запросить и уже будет возвращать NULL.

% cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  long long size = atoll(argv[1]);
  if (size <= 0 || size > SIZE_MAX) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  void *ptr = malloc((size_t) size);
  printf("ptr=%p\n", ptr);
  free(ptr);

  return 0;
}

% free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       3.2Gi        24Gi       1.4Gi       5.2Gi        27Gi
Swap:           55Gi          0B        55Gi

% ./a.out $((80 * 1024 * 1024 * 1024))
ptr=0x7f48441ff010

% ./a.out $((90 * 1024 * 1024 * 1024))
ptr=(nil)

Оверкоммит оверкоммитом, но ядро же не настолько тупое, чтобы отдавать памяти больше, чем её вообще теоретически можно выделить.

Исходная версия vbr, :

Да не обязательно такие странные значения просить. Достаточно объём RAM + размер swap запросить и уже будет возвращать NULL.

% cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  long long size = atoll(argv[1]);
  if (size <= 0 || size > SIZE_MAX) {
    fputs("Invalid usage\n", stderr);
    return 1;
  }

  void *ptr = malloc((size_t) size);
  printf("ptr=%p\n", ptr);
  free(ptr);

  return 0;
}

% free -h
               total        used        free      shared  buff/cache   available
Mem:            31Gi       3.2Gi        24Gi       1.4Gi       5.2Gi        27Gi
Swap:           55Gi          0B        55Gi

% ./a.out $((80 * 1024 * 1024 * 1024))
ptr=0x7f48441ff010

% ./a.out $((90 * 1024 * 1024 * 1024))
ptr=(nil)