# re: Linux下用信号量实现对共享内存的访问保护(二) 回复 更多评论
2010-03-03 14:41 by
我觉共享内存的这种"非显示删除自保留性"是很有用的特性而不是问题,也许当时设计共享内存机制时这种特性是有意提供的.
设想一个简单的例子:
我们使用一块有访问控制保护的内存缓冲区来存储进程或线程之间共用的的数据.
并且我们需要保证数据的安全性,即使server倒掉,这块缓冲区里面的数据也不能丢失.
1. 对于多线程的情况,当一个线程core掉之后(比如因为segment fault),线程所对应的进程将不能幸免.
在这种情况下,如果我们使用的是一般的"内存缓冲区"而不是共享内存,那么当进程退出后,
这块缓冲区对应的内存空间将会被系统回收重新分配给其它进程使用,缓冲区中对应的数据也就丢失了.
但是如果我们换用共享内存来作为线程间交换数据的缓冲区,我们就能很好的解决这个问题.
2. 在多进程的情况下,不但能满足上述特性,而且共享内存也是进程间数据交换的一种高效方式.
至于共享内存的手动删除问题,我的做法是,在生成IPC对象时,将对应的ftok生成的key值写入到一个文件中,
生成类似于下面的shell脚本,这样当我们需要手动删除IPC时也很方便:
ipcrm -M xxx
ipcrm -Q xxx
ipcrm -S xxx
相比于通过socket来作为进程间通信的方式,共享内存的最大不足在于"不能跨机器共用".
after all, there is no silver bullet :)