当前位置: 首页 > 知识库问答 >
问题:

对共享内存的限制在Linux上是如何工作的

施俊哲
2023-03-14

我在研究Linux内核对共享内存的限制

/proc/sys/kernel/shmall

指定可分配的最大页数。把这个数字看作x,把页面大小看作P。我假设“x*p”字节是系统范围共享内存的限制。

现在,我编写了一个小程序来创建一个共享内存段,并在该共享内存段上附加了两次,如下所示

shm_id = shmget(IPC_PRIVATE, 4*sizeof(int), IPC_CREAT | 0666);

if (shm_id < 0) {
    printf("shmget error\n");
    exit(1);
}
printf("\n The shared memory created is %d",shm_id);

ptr = shmat(shm_id,NULL,0);
ptr_info = shmat(shm_id,NULL,0);
...
0x00000000 1638416    sun        666        16000000   2 
...

共有1个答案

卞俊哲
2023-03-14

在do_shmat函数(linux/ipc/shm.c)中没有找到任何物理内存分配

https://github.com/torvalds/linux/blob/5469dc270cd44c451590d40c031e6a71c1f637e8/ipc/shm.c

所以shmat只消耗vm(您的进程地址空间),shmat的主要功能是mmap

 类似资料:
  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核

  • 进程A使用shmget创建了一个共享内存“1234”。在此之后,进程A使用SHMAT将内存附加到自身。 “附加”到底是什么意思?是否存在同一内存的两个副本?如果没有,那么这个内存到底存在于哪里?

  • 我试图弄清楚实际上是如何在内存级别上工作的。在linux手册页中: 我知道实现细节可能留给操作系统之类的东西。但我想知道,总的来说,这是如何实现的。

  • 问题内容: 我的一个项目有一个问题。 我一直在尝试找到一个记录良好的使用共享内存的示例,但没有成功。 基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值: current_path( 它是一个 char )_ 和 file_name( 它也是 _char ) 。 根据命令参数,将启动一个新进程,该进程需要读取和修改存储在共享内存中的 current_path 变量,而 file_name

  • 问题内容: 在此线程中,建议在Linux中使用OP 而不是获取共享内存。我访问了这个页面,这个页面来获得一些文件,但第二个方面给出了一个模糊的例子。 几乎是新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用该方法还是?又为什么呢 问题答案: 两种方法都是可行的。该方法比限制性更强,但更易于使用。是旧的System V共享内存模型,并且支持范围最广。/ 是用于共享内存的新POSIX方

  • 在这个线程中,建议OP使用而不是来获取Linux中的共享内存。我访问了这个页面和这个页面以获得一些文档,但是第二个页面给出了一个关于的模糊示例。 作为一个新手,并且需要在两个进程之间共享一些信息(文本形式),我应该使用方法还是?为什么呢?