标签: shared-memory

在使用POSIX共享内存时,在哪里放置POSIX信号量?

我正在尝试使用POSIX共享内存和POSIX信号量构建客户端服务器应用程序.我是否必须将信号量放在共享内存段中,或者信号量是否只是全局变量?我希望遵守POSIX惯例.

posix semaphore ipc shared-memory

3
推荐指数
1
解决办法
1655
查看次数

在多个进程中加载​​相同的dll实例

Lib1[dll]
{
class A
{
static int i=0;
}
}

Program1[exe] have reference to Lib1
{
 Class B
 {
    main()
    {
      A.i = 5;
    }
 }
}

Program2 [exe] have reference to Lib1
{
 Class C
 {
    main()
    {
      A.i = 5;
    }
 }
}

如果Program1和Program2同时执行,它们是否可能引用Lib1的单个实例,并且Program1中对Ai的静态变量所做的更改可用于Program2,反之亦然,

dll shared-memory

3
推荐指数
1
解决办法
4553
查看次数

关注使用共享内存与CreateFileMapping和MapViewofFile

关于使用共享内存我有两个问题.我正在使用CreateFileMapping在两个进程之间创建共享内存区域.

1)我知道我需要在从CreateFileMapping或OpenFileMapping调用返回的每个句柄上调用CloseHandle以释放内存.我的问题是,如果使用共享内存的程序退出而不调用CloseHandle,那么所有句柄是否都会被Windows XP/7解除分配?IE - 使用mem的所有进程关闭后是否有可能发生内存泄漏?

2)我使用MapViewofFile获取指向mem的指针.在一个实例中,我假设共享内存将始终存在于方法的上下文中.所以我已经将MapViewOfFile的返回值保存为指针并关闭了mem的句柄,我只是使用指向共享内存的指针(但仍然锁定对它的访问).这样安全,还是每次访问共享内存时都应该调用MapViewOfFile?

谢谢,

伊恩

c++ windows memory-leaks shared-memory memory-mapping

3
推荐指数
1
解决办法
1850
查看次数

并发互锁和读取是否需要内存屏障或锁定?

这是一个简单的问题,但在阅读之后我为什么需要内存屏障?我很困惑.

在下面的示例中,假设不同的线程重复调用Increment和Counter:

class Foo{
    int _counter=0;
    public int Counter 
    {
        get { return _counter; }
    }

    public void Increment()
    {
        Interlocked.Increment(ref _counter);
    }
}
Run Code Online (Sandbox Code Playgroud)

对不起,如果我误解了为什么我需要内存屏障?但似乎这表明上述课程在阅读_counter的价值时可能无法提供新鲜度保证.重复访问Counter属性的线程是否会永远停留在旧的Counter值(因为它缓存在寄存器中)?

return _counter;必要之前是内存屏障还是锁?

c# multithreading thread-safety shared-memory memory-barriers

3
推荐指数
1
解决办法
986
查看次数

mmap是否与所有进程共享内存?

当我这样做:

myProgram.h
myProgram.c

    struct PipeShm
    {
    // all my fields
    // more 
    // ...

    };



    struct PipeShm myPipe = { /* initialization for all fields */ };
    struct PipeShm * sharedPipe = &myPipe;

void func()
{
 sharedPipe = mmap (NULL, sizeof * sharedPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);

}
Run Code Online (Sandbox Code Playgroud)

当我mmap指针时sharedPipe,如果我main()myProgram代码中调用任何方法,那么所有进程是否会共享我与myPipestruct 共享的确切共享内存?

或者每个新创建的孩子都会拥有myPipe自己的新生儿?

问候

编辑:

这是在我阅读了评论和答案之后:现在进行了更改,并且仅在我分配之后才初始化段的值:

#include "my_pipe.h"

struct PipeShm * sharedPipe = NULL;



int shm_pipe_init()
{ …
Run Code Online (Sandbox Code Playgroud)

c linux operating-system mmap shared-memory

3
推荐指数
1
解决办法
5030
查看次数

什么时候填充共享内存真的需要?

我对来自NVidia的2份文件感到困惑."CUDA最佳实践"描述了共享存储器在存储体中组织,并且通常在32位模式下,每4个字节是一个存储体(这就是我所理解的).但是,"使用CUDA进行并行前缀求和(扫描)"(此处提供:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html)详细说明了由于存储库冲突,应如何在扫描算法中添加填充.

对我来说问题是,这个算法的基本类型是float,它的大小是4个字节.因此,每个浮动都是银行,没有银行冲突.

所以我的理解是正确的 - 即如果你使用4*N字节类型,你不必担心银行冲突,因为根据定义,没有?如果不是,我应该如何理解它(何时使用填充)?

cuda shared-memory

3
推荐指数
2
解决办法
2421
查看次数

共享内存性能并保护其他进程

我正在尝试实现一个JIT编译器(我有非常讨厌的爱好).

我想有一个主进程保留一些持久变量,第二个进程(刚刚编译)进行一些计算,可以访问和写入持久变量.

第二个进程可以更改并重新编译,但持久变量必须在第二个进程的两次执行之间保持相同.

我的第一个问题是:共享内存是否适合它?(另外在性能方面,因为我希望执行尽可能快.)

我的第二个问题是:如果我使用shm_overview.7中描述的共享内存,在我看来,任何其他具有相同uid的进程都可以访问它.我该怎样预防呢?我希望只有上述两个进程才能访问此共享内存.

linux security shared-memory

3
推荐指数
1
解决办法
720
查看次数

Linux共享内存分段错误

我正在学习共享内存并创建了这个示例程序来测试

//IPC - Shared Memory

#include<stdio.h>
#include<stdlib.h>
#include<linux/ipc.h>
#include<linux/msg.h>
#include<linux/shm.h>

int main(int argc, char* argv[])
{
  printf("setting up shared memory\n");

  key_t ipc_key;
  int shmid;
  int pid;


  ipc_key = ftok(".",'b');

  if((shmid=shmget(ipc_key, 32, IPC_CREAT|0666))==-1)
  {
    printf("error creating shared memory\n");
    exit(1);
  }

  printf("shared memory created with id %d\n",shmid);

  //fork a child process
  pid = fork();
  printf("fork result %d\n",pid);
  if(pid==0)
  {
    //child process
    //attach the shared memory
    int* shm_add_child = (int*)shmat(shmid, 0,0);
    printf("child attached to shared mem at address %p\n",(void*)shm_add_child);

    while(1)
    {
      printf("%d\n",*shm_add_child);
      printf("a\n"); …
Run Code Online (Sandbox Code Playgroud)

c linux ipc shared-memory

3
推荐指数
1
解决办法
1015
查看次数

如何使用XShmGetImage和XShmPutImage

我有这个程序真的很慢.分析揭示了XGetImage中的瓶颈(不是我不能在循环中调用XGetImage).在阅读推荐的解决方案时,请调用XShmGetImage,但文档真的很糟糕.

我正在寻找如何调用XShmCreateImage,XShmGetImage和XShmSetImage的简单示例代码.

深度分析肯定会使XGetImage成为根本瓶颈而不是XPutImage(是的,我知道调用XFlush使分析准确),因此我可能会得出结论,对内存分配器的隐式调用实际上是缓慢但没有XGetImage的变体这让我传递一个预分配的XImage,除了XShmGetImage.无论如何,Shm功能的使用可能会进一步提高.

c x11 shared-memory

3
推荐指数
1
解决办法
1396
查看次数

具有struct和malloc的共享内存派生

我对派生生成的父进程和子进程之间的共享内存有问题。我知道如何使用此处所述的原始类型的共享内存。

虽然我不知道如何共享包含可通过malloc分配的指针的结构。

例如,假设我从先前的链接中获取了以下代码,并进行了一些修改。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>

typedef struct Data {
    char * name;
} Data;

void error_and_die(const char *msg) {
    perror(msg);
    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
    int r;

    const char *memname = "sample";
    const size_t region_size = sysconf(_SC_PAGE_SIZE);

    int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
    if (fd == -1)
        error_and_die("shm_open");

    r = ftruncate(fd, region_size);
    if (r != 0)
        error_and_die("ftruncate");

    Data * …
Run Code Online (Sandbox Code Playgroud)

c malloc struct ipc shared-memory

3
推荐指数
1
解决办法
544
查看次数