[Haskell-cafe] GHC FreeBSD memory model (was: 8.4.3 release)
Viktor Dukhovni
ietf-dane at dukhovni.org
Fri Jul 6 00:50:57 UTC 2018
On Thu, Jul 05, 2018 at 08:13:33PM -0400, Viktor Dukhovni wrote:
> On Thu, Jul 05, 2018 at 09:32:31AM -0400, Ben Gamari wrote:
>
> > We use a much different memory allocation strategy on FreeBSD which
> > (AFAIK) does not allow one to reserve address space without also
> > committing.
>
> Here's a demo of mapping in a 1TB heap on FreeBSD 11.1, on a machine
> with "just" 64GB of RAM and 160GB swap. I would expect anon memory
> mappings to behave similarly on older systems.
>
> $ cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <sys/mman.h>
>
> int main(int argc, char **argv)
> {
> size_t heaplen = 1ULL << 40; /* 1TB */
> unsigned char *heap;
>
> heap = mmap(NULL, heaplen, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
> heap[0] = 'A';
> heap[heaplen-1] = 'z';
> printf ("%p(%zd) %c %c\n", heap, heaplen, heap[0], heap[heaplen-1]);
> sleep(2);
> return 0;
> }
I also get essentially the same results with posix_memalign(3):
#include <stdlib.h>
#include <stdio.h>
#include <err.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char **argv)
{
size_t heaplen = 1ULL << 40;
void *p;
unsigned char *heap;
if (posix_memalign(&p, getpagesize(), heaplen) != 0)
err(1, "posix_memalign");
heap = p;
heap[0] = 'A';
heap[heaplen-1] = 'z';
printf ("%p(%zd) %c %c\n", heap, heaplen, heap[0], heap[heaplen-1]);
sleep(2);
return 0;
}
$ ./foo & sleep 1; ps -o vsz= -o rss= $! ; wait
[1] 76003
0x801000000(1099511627776) A z
1073750140 2080
[1]+ Done ./foo
--
Viktor.
More information about the Haskell-Cafe
mailing list