如何制作具有特定数组大小的共享内存?
Posted
技术标签:
【中文标题】如何制作具有特定数组大小的共享内存?【英文标题】:how to make shared memory with specific array size? 【发布时间】:2017-04-15 12:30:16 【问题描述】:我有一个关于共享内存和分段错误的问题。 我认为使用大量内存会很好。 当我检查Shmmax时,我发现可以分配巨大的内存。
data下是$ipcs -lm的结果
-----共享内存限制--------
最大段数 = 4096
最大段大小(千字节)= 18014398509465599
最大总共享内存 (kbytes) = 18014398442373116
最小段大小(字节)= 1
#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#define ARRAY_SIZE 40000000
int main(int argc, char *argv[])
int shmid;
void *shared_memory = (void *)0;
shmid = shmget((key_t)1234, sizeof(float), IPC_CREAT|0666);
if (shmid == -1)
perror("shmget failed : ");
exit(0);
shared_memory = (float *)shmat(shmid, NULL, 0);
if (shared_memory == (void *)-1)
perror("shmat failed : ");
exit(0);
static float *testx;
testx = (float *)shared_memory;
int k = 0;
for(k;k<400;k++)
testx[k] = 1.12;
for(k;k<40000000;k++)
testx[k] = 1.12;
程序可以运行第一个大小较小的for循环
然而,问题在于大小为 40,000,000 的第二个循环
任何建议我应该编辑什么来运行这段代码?
【问题讨论】:
您正在为 1 个浮点数分配空间,但正在尝试写入 40,000,000 个浮点数。 要获取共享内存段,如果您的系统有shm_open
、truncate
和mmap
,请考虑使用它们。这些设置更容易。
欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question?
【参考方案1】:
SEGFAULT
的原因是您没有使用shmget
创建足够大小的段。
您传递给shmget
的参数是sizeof(float)
,它刚好可以存储1 个浮点数。
你需要做的是像这样调用 shmget -
shmget((key_t)1234, sizeof(float)*40000000, IPC_CREAT|0666);
那么你就可以正确使用所有的内存了。
较小的 400 循环起作用的原因是 shmget
创建的段是 PAGE_SIZE
的倍数。
因此,即使您通过了sizeof(float)
,它也分配了至少 1 个页面,足以容纳 400 个浮点数,但不能容纳 40000000 个。
我希望这能消除混乱。
【讨论】:
感谢您的评论。但是,在这种情况下,我在编辑代码后遇到了由 shmget 函数导致的“shmid”的问题。 所以你从shmget
得到-1?
为了解决这个问题,我不得不编辑 shmget 函数,比如 shmget(IPC_PRIVATE, sizeof(float)*40000000, ...)。我猜想输入键和内核的内存管理方式之间存在一种技巧关系。
是的,在我将 (key_t)1234 更改为 IPC_PRIVATE 之前,我从 shmget 得到了 -1
@Gabriel722 一开始我就怀疑密钥 1234。以上是关于如何制作具有特定数组大小的共享内存?的主要内容,如果未能解决你的问题,请参考以下文章