История изменений
Исправление 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)