如何制作具有特定数组大小的共享内存?

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_opentruncatemmap,请考虑使用它们。这些设置更容易。 欢迎来到 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。

以上是关于如何制作具有特定数组大小的共享内存?的主要内容,如果未能解决你的问题,请参考以下文章

Cuda 高效地从字节数组复制到不同大小的共享内存元素

如何在c中制作共享内存?

CUDA:重载共享内存以实现具有多个数组的简化方法

超出 sysconfig 限制的共享内存大小

『Numpy』内存分析_利用共享内存创建数组

使用共享指针创建的链表数组