shared-memory

POSIX 共享内存对象有哪些一致性保证?
shared-memory

POSIX 共享内存对象有哪些一致性保证?

在 Linux 上,POSIX 共享内存对象 [1] 使用tmpfsvia /dev/shm。反过来, Atmpfs被称为“完全存在于页面缓存中”[2](我假设交换尚未启用)。我想知道使用 POSIX SHM 对象mmap(编入程序地址空间)时的一致性/不撕裂保证是什么。 示例:假设两个进程 A 和 B 共享一个 POSIX SHM 对象,这两个进程都mmap被写入各自的地址空间。该对象的大小为 8kB 或两个页面,假设页面为 4kB 并且对象是页面对齐的。 A 发出两次连续的 [3] 写入,第一次写入第一页(第一个 4k 块),第二次写入第二页。 B 轮...

Admin

对于远小于 1GB 的大小(例如 64MB)使用 SHM_HUGE_1GB 的影响
shared-memory

对于远小于 1GB 的大小(例如 64MB)使用 SHM_HUGE_1GB 的影响

我对于在 Linux 中实际使用(不理解)共享内存还比较陌生。我现在正在处理这样的情况,我需要分配一块连续的共享 64MB 内存。在学习如何正确使用共享内存时,我偶然发现了一些巨大的 TLB 选项shmget;SHM_HUGE_2MB和SHM_HUGE_1GB(https://man7.org/linux/man-pages/man2/shmget.2.html)。 现在,我知道巨大的 TLB 对于大型连续内存来说非常有益(因为虚拟到物理地址的转换变得更加简单)。我的问题是,如果我SHM_HUGE_1GB仅使用 64MB 内存,是否会产生不良副作用?或者我什...

Admin

mmap 可以用来创建一个引用另一个文件的内存子集的文件吗?
shared-memory

mmap 可以用来创建一个引用另一个文件的内存子集的文件吗?

我有兴趣编写一个可以创建两个文件的程序,第二个文件将是第一个文件的“视图”,如果修改,第一个文件也会被修改。这可以用 mmap 来做吗? 我知道使用 mmap 我可以在 RAM 中拥有共享内存,但我需要非易失性内存(又称硬盘驱动器)中的共享内存。我无法复制第一个文件或将其完全加载到 RAM 中,因为我假设该文件可能非常大(GB)。 在我找到如何让第二个文件显示第一个文件的内存子集后,我计划制作 3 个文件,第一个作为容器,第二个和第三个显示第一个文件的不同子集。第二个和第三个文件将使用文件系统进行格式化,以便第一个文件容器在其内存中保存两个可通过第二个和第三...

Admin

显示如果我终止进程及其子进程将释放的内存的工具?
shared-memory

显示如果我终止进程及其子进程将释放的内存的工具?

我知道显示进程的内存有点棘手使用由于内存是共享的。 但当我查看内存诊断时,通常是因为我的内存变低了。所以在这些情况下我实际需要的信息是: 内存要多少释放了如果我终止一个进程及其子进程? 我假设(希望;-))这个问题可能更容易回答,因为如果我终止一组给定的进程,内核必须知道可以释放内存的哪些共享部分。 我做了一些搜索,但还没有找到有用的工具。已经有这样的事情了吗? ...

Admin

为什么使用共享内存对象进行 ftruncate 不使用内存?
shared-memory

为什么使用共享内存对象进行 ftruncate 不使用内存?

我发现我可以创建一个共享内存对象,并使用 给它表面上的任何大小ftruncate,而不管我的系统上的资源限制如何。下面的代码将大小设置为 262 TB,并且确实stat()报告了该大小。然而,262 TB 大于我的/dev/shm安装,而且我的系统上绝对没有 262 TB 的内存或交换可用。我预计会出现 OOM 错误,但我没有看到系统内存使用量发生显着变化。 这里发生了什么?为什么ftruncate超出系统资源限制的大小会成功?我假设ftruncate共享内存对象(或者更一般地说,与 tmpfs)之间存在一些特殊的交互。 import os import _...

Admin

是否可以实现kvm/qemu VM guest和host通过共享内存连接来收集和缓存它们之间的数据
shared-memory

是否可以实现kvm/qemu VM guest和host通过共享内存连接来收集和缓存它们之间的数据

配置: 主机:Ubuntu:20.04 操作系统 来宾:Ubuntu20.04操作系统 这两个文件使用9p文件系统进行互通。 挂载命令如下, mount -t 9p -o trans=virtio tmp_shared /mnt -oversion=9p2000.l 目前进展如下: C语言中的函数mmap用于通过9p文件系统映射同一个文件的内存。 目前,Host可以写入文件的内存,但Guest无法实时读取变化。 Host端:(write.c这段代码是修改文件内存) #include <sys/mman.h> #include <sy...

Admin

如何在 Linux 中添加一些与 GPU 共享的系统内存?
shared-memory

如何在 Linux 中添加一些与 GPU 共享的系统内存?

我已经从 Windows 10 切换到 Linux Mint 21.1 我尝试在 lutris(wine 模拟)上玩 GTA 5,但是该游戏在 Linux 上几乎无法玩,因为由于 Windows 上的 VRAM 较低(仅 2GB),地图的大部分内容无法加载由于存在共享内存,游戏运行良好。我不知道如何在 Linux mint 上启用它。任何帮助表示赞赏。下面是 Windows 上共享 GPU 内存的示例: ...

Admin

两个进程是否可以使用相同的共享内存,而无需借助文件来获取它,无论是内存映射文件还是 /dev/shm 文件?
shared-memory

两个进程是否可以使用相同的共享内存,而无需借助文件来获取它,无论是内存映射文件还是 /dev/shm 文件?

我很好奇,因为今天我知道如何为两个不同的进程提供相同的共享内存的唯一方法是通过内存映射文件,换句话说,两个进程打开相同的内存映射文件并写入/读取它。 由于操作系统需要在磁盘和内存之间交换,因此这会带来惩罚/缺点。 如果这是一个愚蠢的问题,请提前道歉,但是进程之间是否存在纯粹的共享内存,而不是由文件支持。如果是,如果不使用内存映射文件或 /dev/shm 文件,进程将如何获取它? ...

Admin

将 IPC_CREAT 与已创建的共享内存段一起使用
shared-memory

将 IPC_CREAT 与已创建的共享内存段一起使用

我试图弄清楚如果我将 IPC_CREAT标志与 一起使用会发生什么shmget()。我使用了另一个进程中已创建的共享内存段的密钥。当我这样做时,调用进程实际上已经与旧进程共享了这个内存段(当然我已经使用附加了这个内存段shmat())。那么我是否可以得出这样的结论:如果我使用 IPC_CREAT已创建的共享内存段,效果是该内存将与调用进程共享? ...

Admin

使用 shmget() 和 shmat() 共享内存
shared-memory

使用 shmget() 和 shmat() 共享内存

shmget()我们可以使用和创建共享内存并将其附加到进程shmat()。如果我们不销毁和分离 Ubuntu 操作系统中的共享内存,会发生什么?根据我的理解,在系统重新启动之前它仍然会存在于物理内存中,但这是为什么呢?我的意思是,我们可以通过创建多个共享内存块来加载许多共享内存块的物理内存,但这会低效地填满物理内存??? ...

Admin

shmget() 和 shmat()
shared-memory

shmget() 和 shmat()

使用shmget(),我们可以分配一定大小(以字节为单位)的共享内存块,并使用shmat(),我们将此共享内存块附加到调用进程的地址空间。 我需要检查我的理解: 我们有一个进程使用和创建并连接一个共享内存shmget(),shmat()另一个进程使用将该共享内存附加到其地址空间shmat()。 现在这个共享内存的返回地址(使用shmat())在两个进程中是不同的,因为这是一个虚拟地址。 然而,共享内存块本身具有单个基本物理地址,该地址映射到共享该内存的进程的不同虚拟地址。它是否正确? ...

Admin

哪些共享内存不受SHMAX/SHMALL控制?
shared-memory

哪些共享内存不受SHMAX/SHMALL控制?

我们正在调试一种情况,其中缓存/共享内存不断增加,直到系统达到 OOM-killer。 我们在sysctl.conf中设置了shmax和shmall,但没有任何明显的效果。我们是否需要启用更多功能才能使 shmax/shmall 正常工作?或者系统的某些部分是否可以超出这个限制,执行的力度有多大?有缺陷的用户空间应用程序或仅内核/驱动程序中的错误会导致它吗?我们调试的应用程序使用图形和视频解码。司机可以超越最大限制吗? kernel.shmmax = 2147483648 kernel.shmall = 524288 Linux 内核是 5.15.71(来...

Admin

使用 GPSD 作为 Chronyd 源的问题
shared-memory

使用 GPSD 作为 Chronyd 源的问题

我正在尝试使用不带 PPS 加密狗的 USB GPS 作为 Ubuntu 18.04 上的唯一时间源。 GPSD 似乎工作正常,因为 cgps 报告了 3D 修复。但是,我无法及时查看 GPS 信息。 # gpsd -ND 8 /dev/ttyUSB0 gpsd:INFO: launching (Version 3.17) gpsd:IO: opening IPv4 socket gpsd:SPIN: passivesock_af() -> 3 gpsd:IO: opening IPv6 socket gpsd:SPIN: passivesock_af...

Admin

如何将数据队列从内核传递到用户空间?
shared-memory

如何将数据队列从内核传递到用户空间?

我目前正在为Linux编写一个模块,我想将一个数据队列从内核传递到用户空间(我在用户空间的程序负责读取这些数据 - 然后负责将这些数据写入文件),以及我的方法是获取用户空间中的一个内存位置并将数据从内核推送到该位置。 我该如何实施? 你有更好的方法吗?我是初学者,任何指南都可以很好。 在此之前,我尝试使用 IOCTL 和 PROCFS 将这些数据推送到用户空间,但这种方法不是一个好主意,我丢失了一些数据。 ...

Admin