【笔记】共享内存

来源:互联网 发布:java命令行打包jar 编辑:程序博客网 时间:2024/06/05 15:17

Linux内存管理机制中,内核对内存的管理是以页(page)为单位的,一般一个page大小是4k。而程序本身的虚拟地址空间是线性的,所以内核管理了进程从虚拟地址空间到起对应的页的映射。创建共享内存空间后,内核将不同进程虚拟地址的映射到同一个页面:所以在不同进程中,对共享内存所在的内存地址的访问最终都被映射到同一页面。图三显示了内存共享的映射机制。



图三内存共享的映射机制


         内存共享的使用过程分为:创建—>连接—>使用—>分离—>销毁。

(1)创建

segment_id=shmget(shm_key, size,IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSER|0666);

shmget根据shm_key创建一个大小为size的共享内存空间,返回创建共享内存的ID。

(2)连接

shared_memory = (char*) shmat(segment_id,NULL, 0); 

上述函数返回映射到共享内存的地址指针。这样进程就能像访问一块普通的内存缓冲那样访问共享内存。其中后两个参数传入0,表示采用默认的连接方式。

(3)使用

shmctl( shmid, IPC_STAT, &buf) ;

得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中

shmctl( shmid, IPC_SET, &buf) ;

改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存

(4)分离

shmdt(shared_memory);

将shared_memory与共享内存分离,这样用户就不能通过shared_memory来操作共享内存了。

(5)销毁

shmctl(segment_id,IPC_RMID,0);

 删除共享内存,彻底不可用,释放空间。

原创粉丝点击