1. 程式人生 > >程序間的通訊----------共享記憶體

程序間的通訊----------共享記憶體

1.定義

     共享記憶體時最簡單的通訊方式,他允許多個程序訪問相同的記憶體,一個程序改變其中資料後,其他程序可以看到資料的變化

2.畫圖理解

     

     已經有兩個程序A和B,在記憶體中開闢一個空間為C,C就是共享記憶體,程序A把訊息傳入到共享記憶體C中,程序B及時接收了,那麼你收到的就是程序A傳輸的訊息,如果程序B沒有收取的話,程序A第二次把訊息傳入到共享記憶體C中,第二次傳入的訊息就會覆蓋掉第一次傳入的訊息,程序B這個時候收取訊息,只能收取到第二次傳入的訊息,換句話說共享記憶體中的訊息不存在一條兩條,永遠時最新存放的訊息。

3.特點

     在記憶體中開闢一個記憶體空間儲存資料,每次儲存的內容都會覆蓋上次的內容。由於沒有對記憶體進行格式化的修飾,所以存取速度快,效率高

4.建立共享記憶體通訊

   1.方法一  multiprocessing ---------value(傳入單個值)

    from multiprocessing import Value,Process
    from time import sleep
    import random

    #寫一個存錢函式
    def save_money(money):
        #做100次存錢的動作
for i in range(100):
            sleep(0.03)
            money.value += random.randint(1,200)
    #取錢函式
    def take_money(money):     for i in range(100):     sleep(0.02)     money.value -= random.randint(1,150)     if __name__ == '__main__':     #開闢共享記憶體空間 money = Value('i',2000)     d = Process(target=save_money,args=(money,))     w = Process(target=take_money,args=(money,))     d.start()     w.start()     d.join()     w.join()     print
(money.value)
     解析:
該程式順序執行,直到money=Value('i',2000)的時候建立了共享記憶體,money是共享記憶體空間生成的一個物件,這個物件有個屬性就是
value值為2000,再往下d和w是兩個子程序,兩個子程序當中把money這個共享記憶體傳入進去了,然後在子程序中操作兩個money.value
如果操作的是同一塊東西,那麼他們相互之間都是可見的(因為存取函式都是操作的2000這個數),存取子程序函式和主程序函式都能
獲取到2000這個數,形成了三個函式都可以對這個共享記憶體進行操作,所以另外兩個程序的操作會影響到主程序的操作

        看到這如果還不明白那麼就畫張圖

         

      現在有一個主程序,主程序建立了一個記憶體空間,然後我們子啊共享記憶體空間裡存放了一個數字2000,然後建立了兩個子程序A,B,那麼現在A程序操作共享記憶體的負責往進存錢,那麼現在存錢的程序開始執行,取錢的程序就在旁邊等待,存進去1塊錢那麼共享記憶體就變成2001了結束後,那麼B程序也去操作共享記憶體,那麼這個時候共享記憶體就是2001了,B程序是負責取錢,如果取出1塊,那就是2000了,直到兩個子程序結束退出,退出後主程序讀取共享記憶體目前的值。子程序操作後的值被主程序讀取到,這就是程序間的通訊。全域性變數肯定是做不到這點的,用全域性變數的話子程序的操作是不會影響主程序的,因為他是把2000分別複製到自己的空間去隨意操作,父程序最後讀取還是2000。

      過程搞明白後,再來看看money = value('i',2000)中i是什麼?共享記憶體的開闢,你要在共享記憶體裡儲存資料的話,不能存放python格式的資料,只能存放C語言格式的資料,所以i的作用就是把python格式的2000轉換成C語言的格式,i代表整形

    2.方法二 Array 傳入多個值

          obj = Array(ctype,obj)

          功能:開闢一個共享記憶體空間

          引數:要轉換的C的型別

                    obj 放入共享記憶體中的資料,是一個列表,要求列表中的資料為相同型別的資料

    from multiprocessing import Array

    def func(shm):
        print(shm)
        for i in shm:
            print(i)
        shm[0] = 1000
    if __name__ == '__main__':
        shm = Array('i',[1,2,3,4,5])
        p = Process(target=func,args=(shm,))
        p.start()
        p.join()
        for i in shm:
            print(i)
  解析:Array就是建立了共享記憶體,值為列表,在子程序中對列表中的第一個元素做出了改變,主程序列印的時候也發生了改變,這就是通訊。

相關推薦

php程序通訊--共享記憶體

php如何實現共享記憶體。(注意:本示例是在linux下,請勿在windows下嘗試此程式碼,並且必須是在php-cli模式下) php提供了兩種實現共享記憶體的擴充套件。下面我們來一一講解。   一、shmop 系類函式 <?php $shm_key = ftok(__FILE

程序通訊——共享記憶體(Shared Memory)簡易原理和建立_獲得函式

共享記憶體是System V版本的最後一個程序間通訊方式。共享記憶體,顧名思義就是允許兩個不相關的程序訪問同一個邏輯記憶體,共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常為同一段實體記憶體。程序可以將同一段實體記憶體連線到他們自己的地址空間中,所有

Linux關於程序通訊共享記憶體

共享記憶體概念 共享記憶體允許兩個不相關的程序去訪問同一部分邏輯記憶體 如果需要在兩個執行中的程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案 共享記憶體是由IPC為一個程序建立的一個特殊的地址範圍,它將出現在程序的地址空間中。 其他程序可以把同一段共享記憶體段“連

程序通訊--共享記憶體

共享記憶體 當一個程式想和另外一個程式通訊的時候,那記憶體將會為這兩個程式生成一塊公共的記憶體區域。這塊被兩個程序分享的記憶體區域叫做共享記憶體 共享記憶體是程序間通訊最簡單的一種,共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc() 函式向不

程序通訊---共享記憶體

一、IPC(Inter-Process Communication,程序間通訊)物件的介紹 System V 的IPC物件有共享記憶體、訊息佇列、訊號燈。 注意:在IPC的通訊模式下,不管是使用訊息佇列還是共享記憶體,甚至是訊號燈,每個IPC的物件都有唯一的名

Windows程序通訊-共享記憶體

#include "stdafx.h" #include "windows.h" //Name given to the pipe #define g_szPipeName "\\\\.\\Pipe\\MyNamedPipe" //Pipe name format - \\.\pipe\pipename

程序程式設計之程序通訊-共享記憶體,訊號量和套接字

1. 背景 本文將介紹程序通訊中的訊號量,共享記憶體和套接字方法。 2. 訊號量 2.1 訊號量的定義 為了防止出現因多個程式同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行執行緒

Linux程序通訊--共享記憶體與訊號量

1. 建立共享記憶體,shmget() shmget(建立或開啟共享記憶體) 表頭檔案#include <sys/ipc.h>#include <sys/shm.h> 函式定義  int shmget(key_t key, size_t size, int shmflg); 函式說明k

Qt程序通訊——共享記憶體

       Qt提供了一種安全的共享記憶體的實現QSharedMemory,以便在多執行緒和多程序程式設計中安全的使用。比如說QQ的聊天的客戶端,這裡有個個性頭象,當點選QQ音樂播放器的時候,QQ

Linux環境程序通訊——共享記憶體

原文連結     原文連結:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 概述     Android系統中大量使用了mmap實現的共享記憶體,所以這裡需要介紹一下LInux程序間通訊

程序通訊——共享記憶體(Shared Memory)

共享記憶體是System V版本的最後一個程序間通訊方式。共享記憶體,顧名思義就是允許兩個不相關的程序訪問同一個邏輯記憶體,共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常為同一段實體記憶體。程序可以將同一段實體記憶體連線到他

程序通訊記憶體對映(mmap記憶體對映)

讀資料端程序 //mmanp_r.c #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<sys/mman.h> #include<unistd.h> #inc

C# .Net 多程序同步 通訊 共享記憶體 記憶體對映檔案

節點通訊存在兩種模型:共享記憶體(Shared memory)和訊息傳遞(Messages passing)。         記憶體對映檔案對於託管世界的開發人員來說似乎很陌生,但它確實已經是很遠古的技術了,而且在作業系統中地位相當。實際上,任何想要共享資料的通訊模型都會在幕後使用它。         記

C# .Net 多程序同步 通訊 共享記憶體 記憶體對映檔案 Memory Mapped

節點通訊存在兩種模型:共享記憶體(Shared memory)和訊息傳遞(Messages passing)。         記憶體對映檔案對於託管世界的開發人員來說似乎很陌生,但它確實已經是很遠古的技術了,而且在作業系統中地位相當。實際上,任何想要共享資料的通訊模型都

ython實現程序通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序通訊,而Pipe實現兩個程序通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))

c/c++ linux 程序通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

程序通訊(三)共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記憶體 原型

Linux:程序通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

程序通訊 記憶體共享訊號量例項理解

申請記憶體: int shmget(key_t key, size_t size, int shmflg); 其中key為鑰匙,兩程序通過同一個鑰匙找到核心中的共享記憶體,可通過 key_t ftok(const char *pathname, int proj_id)

Linux(高階程式設計)8————程序通訊4(共享記憶體

共享記憶體是什麼? 因為程序之間是相互獨立的,他們有各自程序地址空間,那麼他們需要通訊時就要藉助核心來為他們建立橋樑,像之前我們瞭解的管道、訊息佇列就是核心做的工作來為程序間通訊架的橋樑。共享記憶體也是核心為程序間通訊駕的一座橋樑,只不過這座橋樑比其他橋樑更優,共享記憶體是核心為需要通訊