国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

江立 陸志恩

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

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

中圖分類號:TP311? 文獻標識碼: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)絡安全保障的重要方面,Linux因其健壯性和穩(wěn)定性等特點,越來越顯示出它在控制領域、通信領域、軍事領域、網(wǎng)絡傳輸領域的優(yōu)越性。進程通信是指進程之間的信息交換,本文根據(jù)Linux系統(tǒng)中共享內(nèi)存概念和原理,研究了一種進程通信的方法。此方法的研究和在投入使用,能提供一種高效安全的通信機制。

1? 進程間通信類別

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

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

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

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

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

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

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

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

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

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

多個進程以共享內(nèi)存機制,在Ubuntu 14操作系統(tǒng)里面,實現(xià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),多個進程間可以互斥訪問數(shù)據(jù)塊。

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

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

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

生產(chǎn)者進程:

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

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

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

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

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

3? 共享內(nèi)存結構設計

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

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

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

附加到共享內(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)存映射到進程虛擬地址空間,這樣,新產(chǎn)生的進程。方便可以對共享的內(nèi)存片段進行訪問。

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

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

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

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

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;

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

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

按照內(nèi)存共享機制編寫Server.c。消費者進程是創(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);

//使用結構體變量? stuff = (struct sha_use_st *)memory;

while(ruing) {

while(stuff->written_by_you==1) {

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

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

}

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

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

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

//設置其值為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ù)做復雜的處理,在此期間,生產(chǎn)者程序必須等待,不能寫入新的數(shù)據(jù)。當傳遞的字符串為“end”時則程序結束。

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)存片段,消費者進程然后從服務器端讀出數(shù)據(jù),測試每次從內(nèi)存中讀取的字節(jié)內(nèi)容,從測試結果可以得出,實現(xiàn)了同步讀取內(nèi)存片段的內(nèi)容。在測試環(huán)境中,同時可以建立多個消費者進程讀操作。多進程間通信如圖3所示。

5? 效果分析

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

6? 結? 論

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

參考文獻:

[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].計算機科學,2002(11):16-21.

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

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

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

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

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

[8] 馬魁濤,蔡穎,郭寶峰.Win32進程間信息共享的實現(xiàn)方法研究 [J].計算機應用與軟件,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)絡;陸志恩(1979—),男,漢族,廣東廣州人,講師,博士研究生,研究方向:凝聚態(tài)物理。

猜你喜歡
共享內(nèi)存
基于內(nèi)存共享的多道分析器與應用軟件數(shù)據(jù)交換的設計
基于共享內(nèi)存的過約束多自由度振動臺解耦控制方法
基于TrustZone的安全應用性能優(yōu)化*
通過QT實現(xiàn)進程間的通信
基于Linux內(nèi)核的文件服務器模型的研究與構建
科技視界(2018年28期)2018-01-16 12:34:48
一種基于Tilcon的維護界面設計
基于PCI總線的多處理器協(xié)同機制研究
科技風(2017年20期)2017-07-10 18:56:06
實現(xiàn)虛擬機間快速通信RLMCom方法研究
VB環(huán)境下基于內(nèi)存共享技術的串行通訊程序設計
QNX下PEX8311多路實時數(shù)據(jù)采集的驅(qū)動設計
電子世界(2014年21期)2014-04-29 06:41:36
建阳市| 吐鲁番市| 彭泽县| 长沙市| 延津县| 贵德县| 泾源县| 神木县| 大渡口区| 黄山市| 通江县| 马鞍山市| 西宁市| 黄浦区| 墨竹工卡县| 石台县| 江永县| 阿克苏市| 曲周县| 新蔡县| 鄯善县| 民和| 榆中县| 抚松县| 庄河市| 顺义区| 达日县| 桂东县| 东至县| 罗甸县| 磐安县| 浮山县| 怀集县| 抚顺县| 万宁市| 谷城县| 乌兰浩特市| 渭南市| 阿合奇县| 天津市| 沈阳市|