在实验过程中,有些同学总对共享内存的一些概念弄不清,特别总结了下:
所谓共享内存就是多个进程间共同使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的虚空间中来实现的。由于映射到不同进程的虚空间中,不同进程可以直接使用,不需要进行内存的复制,所以共享内存的效率很高。
共享内存分2种:
1.二者是用同一种机制完成的,不同的是用户接口不同:
一种是POSIX的共享内存,通过用户空间挂载的tmpfs文件系统实现的。(上层不会在意你是内核还是用户空间来实现的)
二种是system V的共享内存是由内核本身的tmpfs实现的。(严格由操作系统内核提供接口和实现。)
2.posix的共享内存机制实际上在库过程中以及用户空间的其他部分被展示为完全的文件系统的调用过程,在调用完shm_open之后,需要调用mmap来将tmpfs的文件映射到地址空间,接着就可以操作这个文件了,需要注意的是,别的进程也可以操作这个文件,因此这个文件其实就是共享内存。
反观system v的共享内存,内核直接实现了shmget/at系统调用,虽然终也是靠tmpfs来实现的,但是接口设计上和posix完全不同,posix旨在提供所有系统都一致的接口,而system v只在于实现自己的逻辑,共享内存其实只是sysv中ipc的一部分,终的管理数据结构也是ipc的而不是共享内存的
3.不管是system v的还是POSIX的共享内存,在计算机重新启动之后都不复存在,因为数据是都保存在物理存储器上或交换分区中。他们不同的是,POSIX是以用户空间文件实现的,并且用户空间操作的是文件描述符,文件描述符是属于t