我正在学习并行编程.我想知道分布式内存是否总是多进程,多线程总是共享内存?如果多进程可以用于分布式内存和共享内存?感谢致敬!
我需要从c程序向Perl程序发送一些数据,这些数据都处于运行模式(睡眠模式下的Perl程序和c程序运行,c程序将数据发送到Perl).
我知道,可以通过套接字和共享内存编写这个程序,但我有性能问题.我认为共享内存是更好的解决方案,我怎样才能发信号通知Perl程序唤醒并恢复运行并读取c发送的数据?
希望我的问题有意义:用C编程,我可以在共享内存段中创建一个哈希表,所以任何具有适当权限的进程都可以访问其中的键/值吗?如果是这样,我如何在哈希表创建中指定我希望它放在SHM中?是否有任何推荐的哈希表实现允许这个?非常感谢
我想做以下事情:
父进程创建子进程.然后子进程从用户读取n int并将它们存储在共享内存中.然后父进程显示它们.
我达到了以下内容:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSIZE 27
int main() {
int shmid;
int *shm;
int *n;
if(fork() == 0) {
shmid = shmget(2009, SHMSIZE, 0);
shm = shmat(shmid, 0, 0);
n = shm;
int i;
for(i=0; i<5; i++) {
printf("Enter number<%i>: ", i);
scanf("%d", n++);
}
printf ("Child wrote <%d>\n",shm);
shmdt(shm);
}
else {
wait();
int *s;
shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT);
shm = shmat(shmid, 0, 0);
s = shm; …Run Code Online (Sandbox Code Playgroud) 这段代码:
shmop_delete();
shmop_close();
Run Code Online (Sandbox Code Playgroud)
不删除共享内存.一个实验:
$shmid = @shmop_open(1234, 'a', 0, 0);
var_dump($shmid);
Run Code Online (Sandbox Code Playgroud)
产量
bool(false)
Run Code Online (Sandbox Code Playgroud)
当然.但
$shmid = shmop_open(5678, 'c', 0644, 10);
...
shmop_delete($shmid);
shmop_close($shmid);
...
$shmid = @shmop_open(5678, 'a', 0, 0);
var_dump($shmid);
Run Code Online (Sandbox Code Playgroud)
产量
int(157)
Run Code Online (Sandbox Code Playgroud)
为什么不删除呢?如何删除共享内存?我在Windows 7上运行apache.
当一个线程中的内存写入何时在使用pthreads的其他线程中可见时,是否有任何保证?
与Java相比,Java语言规范有一个部分,它指定了锁和内存的交互,使得编写可移植的多线程Java代码成为可能.
是否有相应的pthreads规范?
当然,你总是可以让共享数据变得易变,但这不是我追求的.
如果这取决于平台,是否有事实上的标准?或者应该使用另一个线程库?
我有一个问题,每个线程块(1维)必须在共享内存中的数组上运行扫描以及其他几个任务.(该数组最多有1024个元素.)
有没有好的图书馆支持这种类型的操作?
我检查了Thrust和CudPP但是它们都只在数据最初在全局内存中时才工作,这不是我想要的,因为我不想为很少的工作启动新内核并将数据复制回到全局内存因为它有很大的开销.
如果没有支持这种类型操作的公共库,那么如果我只想写一次这个操作并在几个不同的问题中使用它,你的建议是什么?
我的第一个想法是编写一个运行扫描操作的简单设备函数,但是是否可以访问共享内存并从不是内核函数的设备函数执行__syncthreads()操作?我的另一个想法是在宏中编写整个函数,然后它会工作,因为预处理器将代码复制到内核代码,但编写如此复杂的宏并不是使用宏的最佳方法.
PS.:我有流多处理器版本2.1,所以我无法从另一个启动新内核.
我有一个GNU/Linux应用程序,它使用了许多共享内存对象.它可能会在同一系统上运行多次.为了保持整洁,我首先/dev/shm为每个共享内存对象集创建一个目录.
问题是在较新的GNU/Linux发行版上,我似乎不再能够在子目录中创建它们了/dev/shm.
以下是一个最小的C程序,说明了我在说什么:
/*****************************************************************************
* shm_minimal.c
*
* Test shm_open()
*
* Expect to create shared memory file in:
* /dev/shm/
* ??? my_dir
* ??? shm_name
*
* NOTE: Only visible on filesystem during execution. I try to be nice, and
* clean up after myself.
*
* Compile with:
* $ gcc -lrt shm_minimal.c -o shm_minimal
*
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h> …Run Code Online (Sandbox Code Playgroud) 我在客户端 - 服务器模型中使用共享内存.当我的服务器被用户使用sigkill而不是sigterm/sigint杀死时,我无法做任何事情(按照预期),但我的共享内存对象和信号量仍然存在于/ dev/shm /中.
下次我启动我的服务器时,我想创建一个名称完全相同的新对象,并且 - 如果有意图 - 这会失败并退出我的程序.
用户需要自己删除对象 - 这当然不是最好的事情.
我怎么处理这个?
我可以在没有O_EXCL标志的情况下调用shm_open(),最终破坏了这个标志的用途.因为可能已经有我的服务器运行的实例并使用此对象.
Pulseaudio似乎使用数字组合来保持它的对象不同,并且不会被-9杀死它,所以似乎有一种方法.
您如何看待用零字节填充已释放(未实际使用)的页面的选项?这可以提高Windows下的性能,也可以提高VMWare和其他虚拟机环境下的性能?例如,VMWare和HyperV计算内存页面的哈希值,如果内容相同,则将此页面标记为虚拟机内部和同一主机上的虚拟机之间的"共享",直到页面被修改.它有效地减少了内存消耗.Windows也是如此 - 它以不同的方式处理零页面,将它们视为免费.
当我们调用FreeMem/ReallocMem时,我们可以让堆管理器自动用零填充内存.作为替代选项,我们可以有一个函数按需求将空内存归零,即仅在显式调用此函数时.当然,这个功能必须是线程安全的.用零填充内存的缺点是触及可能已经变为虚拟内存的内存,从而发出页面错误.除此之外,任何内存存储操作都很慢,因此我们的程序将会更慢,尽管程度未知(可能可以忽略不计).
如果我们设法用零完全填充4-K页面,则管理程序或Windows将明确将其标记为零页面.但即使是部分归零也可能是有益的,因为管理程序可以使用LZ或类似算法压缩页面以节省物理内存.
我只是想知道你的意见是否由堆管理器本身填充空的堆内存和零字节的好处将超过这种技术的缺点.
当我们购买减少的物理内存消耗时,归零是否物有所值?