我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).
但我怀疑:
1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.
2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.
多进程共享内存系统是否与多线程应用程序一样快?
我们假设为典型的服务器 - 客户端程序创建了一个Unix域套接字.客户端在套接字上发送10GB缓冲区,同时由服务器使用.
操作系统(Linux/BSD)将10GB缓冲区分成多个数据包并发送/使用它们,还是一次性发送?
如果不能一次发送10GB的域套接字缓冲区,那么单个数据包的实际大小限制是多少?
约束:
我找不到这个问题的任何有用的答案,尽管已经多次以不同的方式提出这个问题.
我想在两个进程(两个不同的应用程序)之间共享一个内存,以便其中一个可以写入该内存而另一个可以读取.
这在.NET中可行吗?怎么样?
谢谢
我希望在进程之间发送文本.我已经找到了很多这方面的例子,但没有一个我可以开始工作.这是我到目前为止:
发送部分:
COPYDATASTRUCT CDS;
CDS.dwData = 1;
CDS.cbData = 8;
CDS.lpData = NULL;
SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS);
Run Code Online (Sandbox Code Playgroud)
接收部分:
case WM_COPYDATA:
COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam;
Run Code Online (Sandbox Code Playgroud)
我不知道如何构建COPYDATASTRUCT,我刚刚提出了一些似乎有用的东西.调试时,执行WM_COPYDATA情况,但我不知道如何处理COPYDATASTRUCT.
我想在这两个进程之间发送文本.
你可能会说我刚刚开始,我在Code :: Blocks中使用GNU GCC编译器,我试图避免MFC和依赖.
我读了以下内容:
似乎没有使用DDS代替zmq的功能:
所以:
谢谢
Windows和Linux中的管道有什么区别?
我是ZERMQ的新手.ZeroMQ具有TCP,INPROC和IPC传输.我正在寻找在Winx64和python 2.7中使用python和inproc的例子,它们也可以用于linux.
此外,我一直在寻找UDP传输方法,但无法找到示例.
我发现的唯一例子是
import zmq
import zhelpers
context = zmq.Context()
sink = context.socket(zmq.ROUTER)
sink.bind("inproc://example")
# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)
# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)
Run Code Online (Sandbox Code Playgroud)
我正在考虑的用例是:UDP就像分发信息一样.使用TCP测试推/拉更快或者更快.
这是测试示例> ..............
服务器:
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("inproc://example2")
while True:
# Wait for next request from client
message = socket.recv()
print …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来了解如何在C中使用条件变量来解决练习.这是一个小例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#define OKTOWRITE "/oktowrite"
#define MESSAGE "/message"
#define MUTEX "/lock"
int main(int argc, char** argv)
{
pthread_cond_t* condition;
pthread_mutex_t *mutex;
char* message;
int des_cond, des_msg, des_mutex;
int mode = S_IRWXU | S_IRWXG;
des_mutex = shm_open(MUTEX, O_CREAT | O_RDWR | O_TRUNC, mode);
if (des_mutex < 0)
{
perror("failure on shm_open on des_mutex");
exit(1);
}
if (ftruncate(des_mutex, sizeof(pthread_mutex_t)) == -1)
{
perror("Error …Run Code Online (Sandbox Code Playgroud)