共享内存与Posix共享内存技术解析
1. 4.4BSD匿名内存映射
在进行内存映射时,通常需要创建一个文件并写入数据来初始化计数器。不过,当调用map的目的是提供一块在fork操作中可共享的映射内存时,可根据不同实现简化操作。
1.1 传统方式
传统做法是创建一个文件,写入全0结构来初始化计数器,因为信号量的值会在调用sem-init时初始化。写入全0结构比只写入一个整数值0更简单。之后使用基于内存的信号量,调用sem-init将其值初始化为1,第二个参数需非零,以表明该信号量在进程间共享。
1.2 4.4BSD匿名内存映射
4.4BSD提供了匿名内存映射,可完全避免创建或打开文件。只需指定标志为MAP-SHARED | MAP-ANON,文件描述符fd为 -1,偏移量会被忽略,且内存会初始化为0。示例代码如下:
shm liner-map-an0n.c 3 int 4 main(int argc, char **argv) 5 { 6 int i, nloop; 7 int *ptr; 8 sem-t *mutex; 9 if (argc != 2) 10 err-quit("usage: incr-map-anon <#loops>"); 11 nloop = atoi(argv[1]);