gpt4 book ai didi

c - linux和c中两个不同独立程序之间的共享内存页

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:42 26 4
gpt4 key购买 nike

我从 here 中了解到共享内存.根据文档,两个不同的程序生成两个不同的虚拟地址,这些虚拟地址映射到 RAM 中的同一物理页面。

所以当 program1 访问共享内存的数据时,它将从主内存加载到缓存,下一次 program2/process2 将从缓存中获取数据,因此 program2/process2 相同数据的访问时间更短。

我已经成功地用 C 语言为 IPC 编写了一个程序,使用共享内存在两个程序之间进行通信,修改一个程序中的变量并从另一个程序中读取。

现在,我的问题如下:

  1. 可以在两个独立程序之间自动创建“共享内存”吗?意味着两个独立的程序是否有可能自动自己或通过操作系统创建共享内存,而无需像IPC(shmget/shmat)那样手动/以编程方式创建共享内存?

  2. 当两个不同的虚拟地址使用共享内存映射到相同的物理内存时,这两个程序的公共(public)数据是否始终存在,或者是否可能在该共享内存位置存在不同的数据(这会导致更多缓存未命中)?

  3. 我们能否在不了解其他程序的情况下决定或创建两个独立程序之间的共享内存?

  4. 假设,我在程序 1 中声明了一个大小为 1 MB 的 Array-A,而在程序 2 中我声明了大小为 16KB 的 Array-B。现在在两个程序中执行求和运算时,是否仍会因共享内存而受益?

意味着当一个元素被加载到缓存中进行求和时,其他程序将使用该缓存值。

没有共享内存的可能性,因为我们使用两个不同的数组,并且其中的元素对其他程序/进程没有用。

我在 Linux 下使用 GCC。

最佳答案

  1. 当您 fork 进程时,操作系统实际上会执行此操作。在这种情况下,实际代码所在的内存区域在两个进程之间共享(直到子进程想要在其内存上写入,它也共享数据所在的区域。这种机制称为写时复制)。使用线程 api 创建进程时(因为 Linux 中的线程是作为进程实现的),两个线程共享相同的内存区域(尽管每个线程都在自己的调用堆栈上运行)

  2. 要回答这个问题,首先您需要了解缓存未命中和页面错误之间的区别,因为页面错误就是您在这里询问的内容。如果需要,共享内存可以而且确实会被内核换出到磁盘。请记住,虚拟地址指向的物理地址可能会随着时间的推移而变化,甚至可能在某一时刻不在物理内存中。如果许多进程不断使用该页面,它被换出的几率在某些情况下可能会降低,但不要指望这一点。

  3. Userland 程序通常对它们不拥有的内存一无所知。每个进程都有自己的虚拟地址空间,访问该空间之外会引发内存访问冲突。

  4. 根据经验,如果两个进程不需要访问相同的数据,您就不会在它们之间共享内存。为此,性能的任何增加或减少都可以忽略不计。

关于c - linux和c中两个不同独立程序之间的共享内存页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com