一直不太清楚Linux top命令中的SHR字段究竟都包含了些什么,前些天了解了一下MMAP,今天猜想MMAP申请的内存应该会算到SHR头上的吧,下面写了一个脚本测试了一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int ac, char **av) { int fd = open(av[1], O_RDONLY, 00777); char *fp =(char *) mmap(NULL, 1024 * 1024 * 100,PROT_READ, MAP_SHARED,fd,0); char c; int i = 0; while(i++< 1024*1024*10) { c = *fp++; } sleep(20000000); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 |
/** * 测试结果 * 1. mmap 并不立即开辟内存 * 2. 如果访问的指针到了mmap的内存的外面,会出现总线错误,当然,超过一点点或许是可以的,但一定不要超过一个页的大小 * 3. mmap的内存被当做是SHR的,这个是一定的,和mmap时的MAP_SHARED没有关系,例如: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4996 junjie2 18 0 103m 10m 10m T 0.0 0.0 0:00.04 a.out * * * */ |
代码写的比较差,不过只是为了说明问题而已,没有太多时间来写这些东西,这里仅仅记录一下,有时间再整理。
匿名的mmap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int ac, char **av) { char *fp =(char *) mmap(NULL, 1024 * 1024 * 200,PROT_READ, MAP_SHARED|MAP_ANONYMOUS, -1, 0); char c; int i = 0; if (fp == MAP_FAILED) { printf("error\n") ;exit(1); } while(i++< 1024*1024*100) { c = *(fp+i); } sleep(20000000); return 0; } |
区别于上面的代码的部分:
1. 不需要再打开一个fd
2. mmap调用时使用 MAP_ANONYMOUS 这个flag,有了这个flag,就会忽略fd参数,但是也有的实现依然要求fd参数为-1
mmap中lock到内存的部分好像也不是绝对的lock: https://blog.csdn.net/lotluck/article/details/81632071