文章目录
摘要
共享内存是进程间通信的最常用的方式,所以其在面试中也是高频知识点。通常,共享内存的使用场景多用于持久化进程的内存数据,以及实现进程间通信的共享内存队列中间件。
Q1 当最后一个附加到共享内存的进程意外退出时,会发生什么?
在windows时,共享内存是通过FileMapping 实现的,可以调用CreateFileMapping 创建一个内存文件映射对象。这个对象是由内存管理的,当使用这个对象的进程意外退出时,这个对象是持续存在未销毁的,需要调用CloseHandle关闭内核对象句柄。
同理在Linux中,共享内存是通过shmget创建一个共享内存对象,需要通过调用shmctl来释放掉,否则当附加进程意外退出时该对象仍然存在。
Q2 为什么内存共享是最快的进程通讯方式?
因为共享内存不需要将数据从进程A拷贝到进程B,而仅需要考虑进程间对共享内存的竞争问题,通常采用信号量的方式实现进程间同步互斥。
Q3 可以在运行时调整共享内存大小么?
共享内存在创建时就确定了大小,不能在运行时修改
Q4 使用mmap实现进程间通讯有什么优点?当一个进程正在写内存时会发生什么?
mmap()是一种内存映射文件的方法,即将一