精华内容
下载资源
问答
  • 分布式共享内存两种实现方式

    千次阅读 2019-08-07 16:54:48
    这里,我们介绍两种分布式共享内存,一种是分布式共享内存,另外一种是naive分布式共享内存 简单的分布式共享内存 所有的进程去访问一个共享内存,这个共享内存是虚拟的,他可能分布在不同的物理机上,其实可以...

    分布式共享内存
    这里,我们介绍两种分布式共享内存,一种是分布式共享内存,另外一种是naive分布式共享内存

    简单的分布式共享内存 

    è¿éåå¾çæè¿°
    所有的进程去访问一个共享内存,这个共享内存是虚拟的,他可能分布在不同的物理机上,其实可以理解为一种抽象,他整合了所有的存储资源,然后所有的调度、分配、读写都对程序员是隐藏的,他提供给程序员的就是一个虚拟的内存块(或者内存管理平台),程序员就可以向操作一块磁盘一样去在上进行编程或者其他的行为,这有点类似于云计算的思想。

    naive分布式共享内存 
     è¿éåå¾çæè¿°
    每一个机器都有一个存储内容的本地副本,读取操作我们可以从本地内存进行读取,写入操作我们可以先在本地下写入之后,再通过广播向其他的内存块发送update消息。

    我们可以看到naive方式的共享内存速度是非常快的,因为他不需要去跟其他的用户进行交流,省去了通信的消耗。
     

    展开全文
  • linux共享内存两种方式

    千次阅读 2017-05-04 11:45:28
    linux共享内存两种方式: 第一种:mmap方式,适用场景:父子进程之间 第二种:shmget方式,适用场景:同一台电脑上不同进程之间 两种方式的文档网上都有很多,随便一抓一把。 通病:共享内存没有自带的同步机制,...

    共享内存是进程间通信(Inter Process Communication)的最快方式。linux共享内存有两种方式:

    第一种:mmap方式,适用场景:父子进程之间,创建的内存非常大时

    第二种:shmget方式,适用场景:同一台电脑上不同进程之间,创建的内存相对较小时

    两种方式的文档网上都有很多,随便一抓一把。

    通病:共享内存没有自带的同步机制,需要借助其他方式来进行同步。


    nginx使用了mmap方式,并且对windows和linux都做了共享内存简单封装,需要使用可以参照学习一下(linux:\src\os\unix\ngx_shmem.h和\src\os\unix\ngx_shmem.c windows:\src\os\win32\ngx_shmem.h和windows:\src\os\win32\ngx_shmem.c

    展开全文
  • 共享内存是在个正在运行的进程之间共享和传递数据的一非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的...

    共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

    特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问
    2.
    与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。
     shmget函数

    例题:
    下面有关共享内存,说法不正确的是?
    共享内存和使用信号量一样,属于进程间通信的一种方式。
    使用shmget函数来创建共享内存
    尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的
    共享内存提供了同步机制,在第一个进程结束对共享内存的写操作之前,会有自动机制可以阻止第二个进程开始对它进行读取
    解答:D

    参考文献:

    Linux进程间通信——使用共享内存

    Linux进程间通信——使用信号量

    展开全文
  • 消息队列和共享内存方式分别实现父子进程的通信

    一 消息队列方式

         Linux消息队列是链式队列,链队上每个结点都是一个消息。一个进程可以将某一消息加入消息队列中,另一个进程可以从此消息队列中读取消息。一个典型的案例如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    
    #define SIZE 1024
    const long id = 1000;
    /*
     * a example to send and receive message 
     * */
    int main() {
        key_t unique_key;
        int msgid;
        int status;
        char str[SIZE];
           
        struct msgbuf {
    	long msgtype;
    	char msgtext[SIZE];
        }sndmsg, rcvmsg;
    
        /*
         * get the identifier of a message queue
         * if the new message queue is created then msgget return the id 
         * else return -1 
         * */
        if((msgid = msgget(unique_key, IPC_PRIVATE |  0666)) == -1) {
    	fprintf(stderr, "msgget error!\n");
    	exit(1);
        }
        
        int pid = fork();
        if(pid == 0) {
    	sndmsg.msgtype = id;
    	strcpy(str, "Hello World, I am wangzhicheng!\n");
    	sprintf(sndmsg.msgtext, str);
    	/*
    	 * send  message to message queue
    	 * */
    	if(msgsnd(msgid, (struct msgbuf *)&sndmsg, sizeof(str) + 1, 0) == -1) {
    	    fprintf(stderr, "msgsnd error! \n");
    	    exit(2);
    	}
    	return 0;
        }
        else if(pid > 0) {
    	sleep(3);
    	if((status = msgrcv(msgid, (struct msgbuf *)&rcvmsg, sizeof(str) + 1, id, IPC_NOWAIT)) == -1) {
    	    fprintf(stderr, "msgrcv error!\n");
    	    exit(4);
    	}
    	printf("The received message is:%s\n", rcvmsg.msgtext);
    	msgctl(msgid, IPC_RMID, 0);   // delete the message queue 
    	return 0;
        }
        else {
    	fprintf(stderr, "fork error!\n");
    	msgctl(msgid, IPC_RMID, 0);
    	exit(5);
        }
    }
    

    要点分析:

    1. msgget(long key, int msgflag)函数用于创建消息队列,key可由用户设定,msgflag指明了消息队列的操作权限和控制命令。0666表示此消息队列可读写,IPC_PRIVATE表示创建自己的消息队列。

    2.  当父进程fork出子进程后,子进程使用msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)函数来将消息挂载到消息队列中,其中msgp指向消息缓存,msgfla表明进程在消息队列满或空应采取的行动,IPC_NOWAIT表示当消息队列为空时,函数返回错误信息。

    3. 当子进程执行完毕后,父进程使用msgrcv函数从消息队列中取出消息。之所以要让父进程休眠3秒,就是要等子进程把消息挂载到消息队列上。

    4. 消息队列可通过函数msgctl和关键字IPC_RM(remove)ID回收。

    执行结果:


    二 共享内存方式

    共享内存是进程间通信最快的一种方式,还是以上述案例为基础,修改后代码如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <unistd.h>
    #include <string.h>
    #include <error.h>
    
    #define SIZE 1024         // the size of shm 
    /*
     * the father process fork the child process and shm 
     * the child process put data into the shm 
     * the father process read data from shm 
     * */
    int main() {
        int shmid;
        char *shmaddr;
        struct shmid_ds buf;    // the structure of shm 
    
        int flag = 0;
        int pid;
    
        // 0600 means permission
        shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600);
        if(shmid < 0) {
    	perror("get shm id error!\n");
    	exit(1);
        }
    
        pid = fork();
        if(pid == 0) {
    	shmaddr = (char *)shmat(shmid, NULL, 0);
    	if(shmaddr == (void*)(-1)) {
    	    perror("shmat addr error!\n");
    	    exit(2);
    	}
    	strcpy(shmaddr, "Hello World, I am wangzhicheng!\n");
    	shmdt(shmaddr);            // to forbid process to access the shm 
    	return 0;
        }
        else if(pid > 0) {
    	sleep(3);
    	flag = shmctl(shmid, IPC_STAT, &buf); // to copy the shm state to buf 
    	if(flag == -1) {
    	    perror("shmctl error!\n");
    	    exit(3);
    	}
    	printf("shm size =%d bytes \n", buf.shm_segsz);
    	// getpid() pointer to  the current program 
    	printf("parent id = %d, shm_cpid =%d\n", getpid(), buf.shm_cpid); // shm_cpid means the id of created the shm 
    	printf("child pid = %d, shm_lpid = %d\n", pid, buf.shm_lpid);     // shm_lpid meansns the last process id 
    
    	shmaddr = (char *)shmat(shmid, NULL, 0);
    	if(shmaddr == (void *)(-1)) {
    	    perror("shmat error!\n");
    	    exit(4);
    	}
    	puts(shmaddr);
    	shmdt(shmaddr);
    	shmctl(shmid, IPC_RMID, NULL);    // remove the shm 
        }
        else {
    	perror("fork error!\n");
    	shmctl(shmid, IPC_RMID, NULL);
        }
    
        return 0;
    }
    

    要点分析:

    1. shmget用于获取共享内存,IPC_CREAT和0600指明了创建一个可读写的共享内存。

    2. shmat用于将共享内存映射到进程内存空间,让进程可以像在自己的地址空间里访问共享内存。

    3. 子进程被创建后将字符串写入shmaddr所指向的共享内存中。

    4. 父进程同样使用shmat进行地址映射,然后从共享内存中读取数据。

    5. shmdt表明进程断开与共享内存的地址映射。

    6. shmctl和IPC_RMID用于共享内存的回收。

    执行结果:



    展开全文
  • 共享两种方式

    千次阅读 2010-02-09 17:36:00
    共享两种,这里的共享可以理解为复用,分为时间上的复用和空间上的复用,时间上的复用的一个典型的例子就是分时系统分时使用cpu,cpu将所有时间分成若干个段,每个进程使用一段时间,然后让出cpu,之后调度逻辑会...
  • 进程间共享内存的8种方式

    千次阅读 2018-08-10 10:24:06
    进程间的八通信方式----共享内存是最快的 IPC 方式 1.无名管道( pipe ):管道是一半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2.高级...
  • Linux 下三种共享内存方式

    千次阅读 2015-03-29 16:33:36
    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。...
  • 两种共享内存的实现区别,shm和mmap

    千次阅读 2016-09-15 17:24:09
    linux会有两种方式可以使用共享内存. 分别是shm_XX函数和mmap,这两种共享内存的是内核实现方式大同小异,但是还是有区别的.二者的区别如下: POSIX标准的是mmap,具有简单易用的特点. system V标准的是shm_xx函数组...
  • 进程间对共享内存同步的三种方式

    千次阅读 2019-02-24 18:26:10
    对于共享内存的同步基本上有以下三种方式。  一 记录锁(文件锁)  我们首先来看记录锁,记录锁的功能是当一个进程正在读或者修改文件的某一个部分时,它可以阻止其他进程修改同一文件区。它其实是“字节范围锁”...
  • 如何查看进程发生缺页中断的次数?  用ps -o majflt,minflt -C program命令查看。  majflt代表major fault,... 这个数值表示一个进程自启动以来所发生的缺页中断的次数。 发成缺页中断后,执行了那些操作?
  • 共享内存

    千次阅读 2018-09-19 15:38:10
     共享内存是在个正在运行的进程之间传递数据的一非常有效的方式共享内存的具体实现是不同进程共享的内存安排为同一段物理地址。  如上图所示,进程A和进程B共享同一块物理内存,共享内存中的数据进程A和...
  • 进程间通信方式——共享内存

    万次阅读 多人点赞 2017-05-22 23:30:38
    进程间通信方式共享内存和与共享内存函数详解,以及模拟共享内存实现进程间通信,以及共享内存的优缺点。
  • C++共享内存交互方式

    千次阅读 2019-07-04 11:03:48
    一、什么是共享内存 文件映射是一实现进程间单向或双向通信的机制。它允许个或多个本地进程间相互通信。为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄。 说白了就是把内存当成磁盘,在...
  • 如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令... 这个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷
  • 各平台共享内存的实现方式

    千次阅读 2012-07-23 13:55:32
    UNIX 在内存共享问题上,UNIX历史上主要有个标准...Posix标准提供一种共享内存文件设备,通过访问共享内存文件设备来实现进程间的数据共享。共享内存文件是通过shm_open创建,通过shm_unlink删除,这和普通文件的创
  • 共享内存及其用mmap实现共享内存

    千次阅读 2016-08-01 00:32:49
    共享内存是在个正在运行的进程之间共享和传递数据的一非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的...
  • 在linux进程间通信的方式中,共享内存是一最快的IPC方式。因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和...
  • 共享单车、共享充电宝、共享雨伞,世间的共享有千万,而我独爱共享内存。早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这...
  • Linux下共享内存编程(共享存储空间)

    万次阅读 多人点赞 2018-07-29 23:44:08
    共享存储允许个或多个进程共享一个给定的存储区,是进程间通信最快的一种方式。 不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问。 最简单的共享内存的使用流程 ①ftok函数生成键值 ②...
  • 【Linux】Linux的共享内存

    万次阅读 多人点赞 2018-08-10 19:17:45
    由于进程可以直接对共享内存进行读写操作,因此这种通信方式效率特别高,但其弱点是,它没有互斥机制,需要信号量之类的手段来配合。   共享内存原理与shm系统 共享内存,顾名思义,就是个或多个进程都可以...
  • 共享内存是进程间通信中最简单的方式之一。共享内存允许个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会...
  • Linux进程间通信——使用共享内存

    万次阅读 多人点赞 2013-08-24 10:26:39
    下面将讲解进程间通信的另一种方式,使用共享内存。 一、什么是共享内存 顾名思义,共享内存就是允许个不相关的进程访问同一个逻辑内存。共享内存是在个正在运行的进程之间共享和传递数据的一种非常有效的方式...
  • 进程间通信——共享内存(Shared Memory)

    万次阅读 多人点赞 2018-04-16 16:19:17
    共享内存,顾名思义就是允许个不相关的进程访问同一个逻辑内存,共享内存个正在运行的进程之间共享和传递数据的一非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存...
  • 共享单车、共享充电宝、共享雨伞,世间的共享有千万,而我独爱共享内存。早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU...
  • 进程通信方式共享内存

    千次阅读 2015-05-28 09:49:50
    本文主要参考《unix网络编程卷2:进程间通信》 ... 共享内存区是可用IPC方式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据传递就不再涉及内核(这里的“不再涉及内核”
  • python共享内存

    千次阅读 2018-08-06 13:37:01
    共享内存(Shared Memory)是最简单的进程间通信方式,它允许多个进程访问相同的内存,一个进程改变其中的数据后,其他的进程都可以看到数据的变化。 共享内存是进程间最快速的通信方式: `进程共享同一块内存空间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 591,657
精华内容 236,662
关键字:

共享内存两种方式