• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      共享內(nèi)存在高效進(jìn)程間通信中的應(yīng)用研究

      2023-11-24 23:18:58江立陸志恩
      現(xiàn)代信息科技 2023年18期
      關(guān)鍵詞:共享內(nèi)存

      江立 陸志恩

      摘? 要:在Linux系統(tǒng)中兩個或多個進(jìn)程間通信,是實現(xiàn)計算機內(nèi)部傳遞信息的機制,它們之間是同步的關(guān)系,多個協(xié)作進(jìn)程間完成數(shù)據(jù)的共享、消息的交換。文章基于Ubuntu 12操作系統(tǒng)環(huán)境,通過共享內(nèi)存通信的方式設(shè)計一種基于多進(jìn)程的同步關(guān)系,它們共享內(nèi)存的同步通信機制。文章詳細(xì)描述了該機制的設(shè)計原理和實現(xiàn)方式,并采用內(nèi)核文件shm.h實現(xiàn)了進(jìn)程同步,通過內(nèi)存片段共享機制減少多個進(jìn)程之間的切換時間,實現(xiàn)了共享內(nèi)存在多進(jìn)程間的高效通信。

      關(guān)鍵詞:PV操作;協(xié)作進(jìn)程;共享內(nèi)存;互斥信號量

      中圖分類號:TP311? 文獻(xiàn)標(biāo)識碼:A? 文章編號:2096-4706(2023)18-0125-04

      Research on the Application of Shared Memory in Efficient Inter Process Communication

      JIANG Li, LU Zhien

      (Nanfang College Guangzhou, Guangzhou? 510970, China)

      Abstract: In a Linux system, communication between two or more processes is a mechanism for transmitting information within a computer. The relationship among them is synchronous, and data sharing and message exchange is completed among multiple collaborative processes. This paper is based on the Ubuntu 12 operating system environment and designs a synchronization relationship based on multiple processes through shared memory communication. They share a synchronous communication mechanism in memory. This paper provides a detailed description of the design principle and implementation method of this mechanism, and uses the kernel file shm.h to achieve process synchronization. Through the memory fragment sharing mechanism, the switching time among multiple processes is reduced, achieving efficient communication of shared memory among multiple processes.

      Keywords: PV operation; collaborative process; shared memory; mutex semaphore

      0? 引? 言

      Linux操作系統(tǒng),目前版本很多,像Ubuntu系統(tǒng)、Red Hat Linux操作系統(tǒng)等,它們是免費的,同時是一種類UNIX操作系統(tǒng)。Linux有上百種不同的發(fā)行版,如基于商業(yè)開發(fā)的Oracle Linux、SUSE和基于社區(qū)開發(fā)的debian、archlinux等。Red Hat Linux可以在不同的硬件平臺上安裝和運行,例如SPARC等處理器的平臺。選擇好的系統(tǒng)開發(fā)環(huán)境是安全軟件保證和網(wǎng)絡(luò)安全保障的重要方面,Linux因其健壯性和穩(wěn)定性等特點,越來越顯示出它在控制領(lǐng)域、通信領(lǐng)域、軍事領(lǐng)域、網(wǎng)絡(luò)傳輸領(lǐng)域的優(yōu)越性。進(jìn)程通信是指進(jìn)程之間的信息交換,本文根據(jù)Linux系統(tǒng)中共享內(nèi)存概念和原理,研究了一種進(jìn)程通信的方法。此方法的研究和在投入使用,能提供一種高效安全的通信機制。

      1? 進(jìn)程間通信類別

      進(jìn)程間通信就是在不同進(jìn)程之間傳播或交換信息,它提供了一組編程接口,程序員和研究者能夠協(xié)調(diào)不同的進(jìn)程,

      使它們在一個操作系統(tǒng)里同時運行,并相互傳遞、交換信息。Linux中進(jìn)程間通信方式通常有以下四種:

      1)消息隊列:進(jìn)程間采用消息隊列方式時,以消息Message為單位。消息隊列在數(shù)據(jù)結(jié)構(gòu)里面是一鏈表,用來存貯接收到的信息,可以理解為一個緩存區(qū),當(dāng)然也是一種臨界資源。在網(wǎng)絡(luò)傳輸中,計算機網(wǎng)絡(luò)中發(fā)送的“報文”就是一種格式化的消息,這個報文數(shù)據(jù)方面在數(shù)據(jù)鏈路層傳輸。進(jìn)程通過操作系統(tǒng)提供的發(fā)送原語“Send message”,接受原語“Accept the news”,利用兩組原語進(jìn)行數(shù)據(jù)交換。

      2)信號量:即是Semaphore,采用PV操作實現(xiàn)進(jìn)程的同步和互斥,P操作代表進(jìn)程向Linux申請一個單位資源,V操作代表釋放一個單位資源。這樣能夠保證兩個或多個關(guān)鍵代碼段不被并發(fā)調(diào)用。操作系統(tǒng)采用信號量完成這個過程,第一部需要創(chuàng)建信號量S,將P操作S以及V操作S,分別放置在每個關(guān)鍵代碼段的首末端,Linux操作系統(tǒng)中P操作是申請資源,V操作是釋放資源。

      定義:typedef struct{int value;信號量值struct process_control block*l信號量等待隊列指針}semaphore。

      3)管道通信:UNIX中管道是一種pipe文件,這個文件可以保存大量的信息,管道的一端連接讀進(jìn)程,另外一端鏈接寫進(jìn)程。進(jìn)程通信采用pipe通信方式時,Linux會在內(nèi)存中開辟的一個大小固定的緩沖區(qū),讀進(jìn)程和寫進(jìn)程需要按照“管道”的規(guī)則通信,管道在Linux操作系統(tǒng)中是一種半雙工通信,在一段時間間隔中只能實現(xiàn)單向的數(shù)據(jù)傳輸。

      4)共享內(nèi)存:進(jìn)程通信采用共享內(nèi)存方式時,LINUX在內(nèi)存中開辟一塊共享空間,允許通信進(jìn)程對其互斥的訪問。

      例如兩個進(jìn)程,一個寫進(jìn)程A,一個讀進(jìn)程B,它們進(jìn)程對共享空間的訪問必須是互斥的,在一段時間間隔內(nèi),進(jìn)程A只允許讀該共享空間,進(jìn)程B只允許寫該共享空間?;コ庠L問可以通過PV操作實現(xiàn)。

      2? 共享內(nèi)存通信原理

      在Linux進(jìn)程通信過程中,每個進(jìn)程都有自己的進(jìn)程控制快,簡稱為PCB,Linux進(jìn)程在自己的生命周期中有地址空間,需要一個對應(yīng)的頁表,進(jìn)程的邏輯地址和物理地址是一一對應(yīng)的,所以這樣形成進(jìn)程的虛擬地址與物理地址映射,并且通過內(nèi)存管理MMU單元進(jìn)行管理。在操作系統(tǒng)的底層,兩個不同的虛擬地址,進(jìn)程地址空間如圖1所示,通過頁表映射到相同的一個物理地址區(qū)域,它們所指向的區(qū)域稱為共享內(nèi)存。

      多個進(jìn)程以共享內(nèi)存機制,在Ubuntu 14操作系統(tǒng)里面,實現(xiàn)進(jìn)程間通信,通常來說采用下面的步驟:

      消費者進(jìn)程:

      1)OS創(chuàng)建一個共享的內(nèi)存片段,在Linux或者Windows系統(tǒng)內(nèi)部,內(nèi)存區(qū)域有m個大小的塊區(qū)域。

      2)OS中對同一個內(nèi)存片段,用PV操作來實現(xiàn),多個進(jìn)程間可以互斥訪問數(shù)據(jù)塊。

      3)在Linux中等待信號,直到當(dāng)前塊可讀。

      4)多個進(jìn)程從內(nèi)存片段中讀取該內(nèi)存塊的信息。

      5)轉(zhuǎn)到步驟st3)。

      生產(chǎn)者進(jìn)程:

      1)生產(chǎn)者進(jìn)程P1,P2,P3,…,PN打開命名的共享內(nèi)存。

      2)進(jìn)程接收等待信號,生產(chǎn)者將信息寫入當(dāng)前內(nèi)存塊。

      3)產(chǎn)者進(jìn)程P1,P2,P3,…,寫數(shù)據(jù)到內(nèi)存塊。

      4)OS發(fā)出信號,代表消費者可讀內(nèi)存片段當(dāng)前的數(shù)據(jù)塊。

      5)進(jìn)程繼續(xù)并發(fā)執(zhí)行,轉(zhuǎn)入上面st2。

      3? 共享內(nèi)存結(jié)構(gòu)設(shè)計

      在Ubuntu 12操作系統(tǒng)中,如果有M個進(jìn)程,同時進(jìn)行共享內(nèi)存讀寫操作,對共享內(nèi)存中的區(qū)域數(shù)據(jù),必須利用PV原語設(shè)置好,在操作系統(tǒng)的不同的環(huán)境中,實現(xiàn)線程互斥和同步機制。Ubuntu 12操作系統(tǒng)環(huán)境中,對于內(nèi)存區(qū)域塊X,先解決的就是如何組織內(nèi)存塊,生產(chǎn)者進(jìn)程將數(shù)據(jù)寫入到內(nèi)存塊,新創(chuàng)建的消費者進(jìn)程,采用于正在處理內(nèi)存的數(shù)據(jù)。多進(jìn)程共享內(nèi)存通信結(jié)構(gòu)體,如圖2所示。

      Linux提供了一系列API來操作共享內(nèi)存。創(chuàng)建共享內(nèi)存成功,下面函數(shù)成功,則返回標(biāo)識符,如果函數(shù)調(diào)用不成功否則-1。

      int shmget(int? , int? ?size, int shmflg);權(quán)限對共享內(nèi)存非常有用,利用這個功能,提供一種有效的對數(shù)據(jù)進(jìn)行只讀訪問的方法,為避免數(shù)據(jù)被其他用戶修改,通過將數(shù)據(jù)放入共享內(nèi)存并設(shè)置它的權(quán)限。

      附加到共享內(nèi)存函數(shù),*shmat函數(shù)如果調(diào)用成功,在Linux系統(tǒng)中,*shmat返回一個指針,指向內(nèi)存片段中的第一個字節(jié);在函數(shù)調(diào)用成功的時候,如果*shmat返回-1,代表void *shmat(int shm_id, int shmflg , const void *shm_addr);的含義是失敗。UNIX內(nèi)部機制,建立一種方法,將這一段內(nèi)存映射到進(jìn)程虛擬地址空間,這樣,新產(chǎn)生的進(jìn)程。方便可以對共享的內(nèi)存片段進(jìn)行訪問。

      int shmdt(const void *shm_addr);UNIX系統(tǒng)設(shè)置了一種機制,int shmdt函數(shù)將共享內(nèi)存從當(dāng)前進(jìn)程中分離。該函數(shù)有2種返回結(jié)果,如果返回-1,int shmctl(int shm_id, int cmd, struct shmid_ds *buf);控制共享內(nèi)存的函數(shù),它比信號量要簡單很多。斷開共享內(nèi)存鏈接,代表失敗。如果為0,代表返回成功。需要說明的是這個進(jìn)程無法再訪問它,并不是說共享內(nèi)存已被銷毀。

      4? 內(nèi)存讀寫與同步

      4.1? 生產(chǎn)者進(jìn)程寫數(shù)據(jù)入內(nèi)存

      按照設(shè)計的共享內(nèi)存機制,編寫仿真程序Client.c。生產(chǎn)者進(jìn)程是使用存在的共享內(nèi)存、連接共享內(nèi)存、向共享內(nèi)存中寫入內(nèi)容、斷開聯(lián)系、釋放內(nèi)存。written_by_you標(biāo)志來判斷消費者是否已經(jīng)將原先的數(shù)據(jù)處理完成,如果沒有則等待;如果已經(jīng)處理完則從鍵盤讀入字符串寫入共享內(nèi)存。當(dāng)輸入為end時,程序結(jié)束。

      Void write(){

      shared_memory = shmat(shmid, NULL, 0);

      if(memory==-1) {

      //提示內(nèi)存分配錯誤 printf( "內(nèi)存分配錯誤\n");

      exit(0);

      }

      printf("memory %X\n", (int)memory);

      stuff->by_you = 0;

      //結(jié)構(gòu)體數(shù)據(jù)變量? stuff = (struct shared_use_st *)memory;

      //循環(huán)條件判斷? while(ruing){{ {

      if(stuff->_by_you) {

      //提示寫入內(nèi)存片段? printf("寫內(nèi)存片段: %s", stuff->s_text);

      //休眠函數(shù)? ?sleep(rand()%6);

      stuff->by_you = 0;

      if(strncmp(stuff->s_text, "end", 6)==0) {

      running = 0;

      }}}

      }

      }

      }

      在生產(chǎn)者進(jìn)程寫入的過程模塊,循環(huán)函數(shù)while,邏輯變量running為真,表示的含義是獲得可以寫入的數(shù)據(jù)塊,written_by_you共享變量,設(shè)定進(jìn)程的同步機制,written_by_you可用時候,輪到生產(chǎn)者,把數(shù)據(jù)寫入共享內(nèi)存,在Linux環(huán)境或者Windows環(huán)境,都是適用的,接著通過strncmp函數(shù)對數(shù)據(jù)字節(jié)比較,得到的結(jié)果進(jìn)行分析,通過進(jìn)程的通知消息,最終end通知進(jìn)程寫操作完成,這樣同步進(jìn)程,消費者進(jìn)程可以對內(nèi)存片段進(jìn)行讀了。

      4.2? 消費者進(jìn)程讀數(shù)據(jù)

      按照內(nèi)存共享機制編寫Server.c。消費者進(jìn)程是創(chuàng)建共享內(nèi)存、連接共享內(nèi)存,從共享內(nèi)存中讀取內(nèi)容、斷開聯(lián)系、釋放內(nèi)存。

      Void read(){

      memory = shmat(shmid, NULL, 0);

      if(memory==-1) {

      //提示內(nèi)存分配錯誤? printf("內(nèi)存分配錯誤\n");

      exit(0);

      }

      printf("memory %X\n", (int)memory);

      //使用結(jié)構(gòu)體變量? stuff = (struct sha_use_st *)memory;

      while(ruing) {

      while(stuff->written_by_you==1) {

      //休眠100毫秒? sleep(100);

      fprintf("等待寫入數(shù)據(jù)...\n");

      }

      printf("寫數(shù)據(jù): ");

      //準(zhǔn)備寫入數(shù)據(jù)? fgets(buffer, BUFSIZ, stdin);//內(nèi)存拷貝

      //準(zhǔn)備拷貝數(shù)據(jù)? strncpy(stuff->s_text, buffer, TEXT_SZ);

      //設(shè)置其值為1? stuff->by_you = 1;

      if(strncmp(buffer, "stop", 4)==0) {

      running =0;

      }

      }}

      從read函數(shù)可知,讀操作和寫操作基本一致,written_by_you以判斷有沒有新的數(shù)據(jù)寫入。如果有,則輸出,并且等待一個隨機的時間再將written_by_you重置為0。等待一個隨機時間的目的是模擬程序在對數(shù)據(jù)做復(fù)雜的處理,在此期間,生產(chǎn)者程序必須等待,不能寫入新的數(shù)據(jù)。當(dāng)傳遞的字符串為“end”時則程序結(jié)束。

      4.3? 功能測試

      在Intel(R) Core(TM) i5-10210U CPU @ 1.60 GHz,8 GB內(nèi)存的筆記本中,操作系統(tǒng)采用Ubuntu 14,VMware Workstation 12,語言環(huán)境C語言,編程測試。從客戶端每次寫入10~20個Bytes的數(shù)據(jù)到共享的內(nèi)存片段,消費者進(jìn)程然后從服務(wù)器端讀出數(shù)據(jù),測試每次從內(nèi)存中讀取的字節(jié)內(nèi)容,從測試結(jié)果可以得出,實現(xiàn)了同步讀取內(nèi)存片段的內(nèi)容。在測試環(huán)境中,同時可以建立多個消費者進(jìn)程讀操作。多進(jìn)程間通信如圖3所示。

      5? 效果分析

      在Ubuntu 14操作系統(tǒng)實驗環(huán)境中,./server &作為一個后臺進(jìn)程啟動,進(jìn)程端口號3301,在實際的運行中,多個進(jìn)程共享的內(nèi)存片段是D5832000,客戶端進(jìn)程通過gcc-o編譯成功后,運行客戶端進(jìn)程,輸入“I love you”,服務(wù)器端立即讀出這個字符串,這樣完成了2個進(jìn)程的協(xié)作關(guān)系。讀取同一片內(nèi)存空間,從測試結(jié)果可以得出,實現(xiàn)了同步讀取內(nèi)存片段的內(nèi)容。在測試環(huán)境中,同時可以建立多個消費者進(jìn)程讀操作,“wait for the client”。

      6? 結(jié)? 論

      基于Linux或UNIX系統(tǒng),本課題依據(jù)操作系統(tǒng)中共享內(nèi)存概念和原理,設(shè)計了一種多進(jìn)程共享內(nèi)存的同步通信機制,在數(shù)據(jù)的仿真實驗方面,采用Linux內(nèi)核文件shm.h實現(xiàn)進(jìn)程同步和安全,通過內(nèi)存片段共享機制,能夠減少多個進(jìn)程間的切換時間,對比前面介紹的四種進(jìn)程間的通信方式,比其他進(jìn)程通信方式和關(guān)鍵區(qū)等線程同步技術(shù)相對比,在LINUX開源環(huán)境中,解決了共享內(nèi)存在多進(jìn)程間的高效通信。通過實驗仿真,完成了服務(wù)器端和客戶端進(jìn)程的同步機制。

      參考文獻(xiàn):

      [1] TSAI Y R,KO J H. Implementation of a Portable Multi-channel EMG Signal Detection System for Android-based Smartphones by Using USB-OTG Interface[C]//2018 IEEE International Conference on Applied System Invention(ICASI).Chiba:IEEE,2018:766-769.

      [2] 李小群,趙慧斌,孫玉芳.進(jìn)程間通信機制的分析與比較 [J].計算機科學(xué),2002(11):16-21.

      [3] 周偉明.多核計算與程序設(shè)計 [M].武漢:華中科技大學(xué)出版社,2009

      [4] RICHITER J.Windows核心編程 [M].王建華,張煥生,侯麗坤,等譯.北京:機械工業(yè)出版社,2000.

      [5] 楊倩,楊明趙. Android顯示服務(wù)器——SurfaceFlinger研究 [J].計算機應(yīng)用與軟件,2014,31(6):324-326.

      [6] 凌大鵬,陸平,李芳,等.基于Win32 API進(jìn)程通信的方法研究 [J].艦船防化,2008(6):48-52.

      [7] 楊寧學(xué),諸昌鈐,聶愛麗.內(nèi)存映射文件及其在大數(shù)據(jù)量文件快速存取中的應(yīng)用 [J].計算機應(yīng)用研究,2004(8):187-188.

      [8] 馬魁濤,蔡穎,郭寶峰.Win32進(jìn)程間信息共享的實現(xiàn)方法研究 [J].計算機應(yīng)用與軟件,2007(12):119-120+157.

      [9] PAN K. A Hybrid HLA Time Management Algorithm Based on Both Conditional and Unconditional Information [J].Simulation,2009,85(9):559-573.

      [10] GRANDE R E D,BOUKERCHE A. Dynamic balancing of communication and computation load for HLA-based simulations on large-scale distributed systems [J].Journal of Parallel and Distributed Computing,2011,71(1):40-52.

      作者簡介:江立(1984—),男,漢族,湖北武漢人,講師,碩士研究生,主要研究方向:軟件工程、無線傳感器網(wǎng)絡(luò);陸志恩(1979—),男,漢族,廣東廣州人,講師,博士研究生,研究方向:凝聚態(tài)物理。

      猜你喜歡
      共享內(nèi)存
      基于內(nèi)存共享的多道分析器與應(yīng)用軟件數(shù)據(jù)交換的設(shè)計
      基于共享內(nèi)存的過約束多自由度振動臺解耦控制方法
      基于TrustZone的安全應(yīng)用性能優(yōu)化*
      通過QT實現(xiàn)進(jìn)程間的通信
      基于Linux內(nèi)核的文件服務(wù)器模型的研究與構(gòu)建
      科技視界(2018年28期)2018-01-16 12:34:48
      一種基于Tilcon的維護界面設(shè)計
      基于PCI總線的多處理器協(xié)同機制研究
      實現(xiàn)虛擬機間快速通信RLMCom方法研究
      VB環(huán)境下基于內(nèi)存共享技術(shù)的串行通訊程序設(shè)計
      QNX下PEX8311多路實時數(shù)據(jù)采集的驅(qū)動設(shè)計
      電子世界(2014年21期)2014-04-29 06:41:36
      蒙山县| 紫金县| 巴林左旗| 若羌县| 博白县| 竹北市| 金沙县| 章丘市| 福建省| 牙克石市| 博罗县| 安乡县| 徐闻县| 民权县| 如皋市| 凉城县| 泾川县| 浠水县| 松溪县| 航空| 集安市| 浦县| 维西| 舟山市| 鄂温| 迭部县| 阳新县| 娄烦县| 平原县| 桓台县| 宾阳县| 天柱县| 平罗县| 光山县| 牟定县| 青冈县| 城口县| 赤水市| 疏勒县| 金沙县| 南靖县|