当前位置:首页 > 内存 > 正文

linux共享内存实现

  • 内存
  • 2024-05-24 09:28:28
  • 7443

一、linux共享内存的分配

进程通过调用shmget(SharedMemoryGET,获取共享内存)来分配共享内存块。
该函数的第一个参数是一个键值,用于标识共享内存块。彼此不相关的进程可以通过指定相同的键来访问同一块共享内存。不幸的是,其他程序也可能选择与基值相同的特定值来分配给共享内存,从而导致冲突。使用私有常量IPC_PRIVATE作为基值可以确保系统创建一个全新的共享内存块。
该函数的第二个参数指定所需内存块的大小。由于这些内存块是以页为单位分配的,因此实际分配的内存块大小将扩展到页大小的整数倍。
第三个参数是一组标志,通过指定常量按位或运算获得。这些特定常量包括:
IPC_CREAT:该标志指示应创建一个新的共享内存块。通过指定这个标志,我们可以使用指定的键值创建一个新的共享内存块。
IPC_EXCL:该标志只能与IPC_CREAT一起使用。当指定该标志时,如果具有该键值的共享内存块已经存在,则shmget调用将失败。也就是说,该标志将允许线程获得“独占”共享内存块。如果未指定该标志,并且系统中存在具有相同键值的共享内存块,则shmget将返回已创建的共享内存块,而不是创建新的共享内存块。
模式标志:该值由9位组成,分别表示所有者、组和其他用户对内存块的访问权限。指示执行权限的位将被忽略。指定访问权限的一个简单方法是使用中定义的常量,并在手册页第2部分的统计条目中进行了描述。例如,S_IRUSR和S_IWUSR分别指定内存块的所有者的读写权限,而S_IROTH和S_IWOTH分别指定其他用户的读写权限。下面的例子中,shmget函数创建一个新的共享内存块(当shm_key已经被占用时,获得对现有共享内存块的访问权限),并且只有所有者对该内存块有读写权限,其他用户不能阅读。
intsegment_id=shmget(shm_key,getpagesize(),IPC_CREAT|S_IRUSR|S_IWUSR);如果调用成功,shmget将返回共享内存ID。如果共享内存块已经存在,系统会检查访问权限,并检查该内存块是否被标记为销毁。


二、linux的共享内存如何实现linux的共享内存

如何在Linux/Unix中使用共享内存创建消息队列连接,在C++中实现阻塞效果?

最后一个消息队列函数msgrcv本身有一个block选项,具体请看函数定义。

Linux会清理内存空间吗?1.使用free命令查看当前内存使用情况

freetotalusedfreesharedbufferscachedMem:166218968967952765394402123528377276-/+buffers/cache:378325124041free命令后显示信息说明#total:物理内存总量#usedonasused#free:可用量#shared:多个进程共享的总内存#Buffers/cached:磁盘缓存量

2.执行sync同步数据

sync#该命令包含未写入的系统缓冲区到disk#修改的i节点、延迟I/O和读取映射文件。3.清除缓存(cache)

/proc/sys/vm/drop_cachesfreetotalusedfreesharedbufferscachedMem:16621896579592160423040268308708-/+buffers/180268308708010241428

>4.在比较命令时使用很明显,使用了(减)和释放(增加)对应内存部分,缓存(cache)被清除。