posts - 15, comments - 9, trackbacks - 0, articles - 0
前面利用Linux中的系统V共享内存机制和semaphore来实现了一个简单的进程级共享内存,但仅仅是一个简单实现,还有很多细节问题没有考虑,比如:
1:很多资料中讲到,系统V共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共享内存仍然存在,在内核引导之前,对该共享内存区域的任何改写操作都将一直保留,除非显式删除共享内存。的确是这样的,系统V机制分配的共享内存将一直保留,若要删除要么重启系统,要么就调用shmctl来显示删除。那么,shmctl怎么使用呢?这在下面将会讲到。

2:对于两个不同的进程,如何在其中一个进程满足某种条件时唤醒另一个进程呢?下面也会讲到。

.....................................(待续)

Feedback

# re: Linux下用信号量实现对共享内存的访问保护(二)  回复  更多评论   

2010-03-03 14:41 by luckycat
我觉共享内存的这种"非显示删除自保留性"是很有用的特性而不是问题,也许当时设计共享内存机制时这种特性是有意提供的.
设想一个简单的例子:
我们使用一块有访问控制保护的内存缓冲区来存储进程或线程之间共用的的数据.
并且我们需要保证数据的安全性,即使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 :)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理