2
メモリが豊富な64ビットマシンで、mmapを使用して2GBを超える連続メモリを割り当てるのに問題があります。 次のコードはうまく動作します。しかし、連続してmmapされたページの数を2GBを少し上回ると、私のマシンではmmapが失敗します。Mmapは2GBを超える連続したデータを割り当てることができません
#include <sys/mman.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#define PAGE_SIZE (4*1024)
#define START_ADDRESS 0x8000000
#define START_ADDRESS2 0x800000000
#define N_ITERATIONS 524288
// one more iteration and mmap fails
//#define N_ITERATIONS 524289
void allocate(void* base_address)
{
int i;
for (i = 0; i < N_ITERATIONS; ++i) {
void* current_addr = base_address + PAGE_SIZE * i;
void* ret = mmap((void*)current_addr, PAGE_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE,
MAP_NORESERVE | MAP_FIXED | MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
if (ret == MAP_FAILED) {
fprintf(stderr, "Error mmap. errno: %d\n", errno);
exit(-1);
}
printf("%d\n", i);
}
}
int main()
{
allocate((void*)START_ADDRESS);
allocate((void*)START_ADDRESS2);
return 0;
}
連続したデータの2GB以上を割り当てるからカーネルを防ぐ何
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) unlimited
-m: resident set size (kbytes) unlimited
-u: processes 515550
-n: file descriptors 65535
-l: locked-in-memory size (kbytes) unlimited
-v: address space (kbytes) unlimited
-x: file locks unlimited
-i: pending signals 515550
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
-N 15: unlimited
-a ulimitの?
さて、クリスタルボールを見ると、私の見解には32ビットの符号付き限界があります。 IOW:[ask]を参照し、アドバイスに従ってください。 – Olaf
私は 'ulimit'を見ることから始めます。また、実際に64ビット用にコンパイルしていることを確認してください。 'printf("%zu "、sizeof(void *))'は面白いかもしれません。 – EOF
@EOFはい、64ビットでコンパイルされていることを確認しました。私はそこに 'ulimit'の出力を貼り付けました。すべてがうまくいくようです。 – JC1