999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2023-11-24 23:18:58江立陸志恩
現(xiàn)代信息科技 2023年18期

江立 陸志恩

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

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

中圖分類號(hào):TP311? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):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)等,它們是免費(fèi)的,同時(shí)是一種類UNIX操作系統(tǒng)。Linux有上百種不同的發(fā)行版,如基于商業(yè)開發(fā)的Oracle Linux、SUSE和基于社區(qū)開發(fā)的debian、archlinux等。Red Hat Linux可以在不同的硬件平臺(tái)上安裝和運(yùn)行,例如SPARC等處理器的平臺(tái)。選擇好的系統(tǒng)開發(fā)環(huán)境是安全軟件保證和網(wǎng)絡(luò)安全保障的重要方面,Linux因其健壯性和穩(wěn)定性等特點(diǎ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)程通信的方法。此方法的研究和在投入使用,能提供一種高效安全的通信機(jī)制。

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

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

使它們?cè)谝粋€(gè)操作系統(tǒng)里同時(shí)運(yùn)行,并相互傳遞、交換信息。Linux中進(jìn)程間通信方式通常有以下四種:

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

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

定義:typedef struct{int value;信號(hào)量值struct process_control block*l信號(hào)量等待隊(duì)列指針}semaphore。

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

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

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

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

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

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

消費(fèi)者進(jìn)程:

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

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

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

4)多個(gè)進(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)程接收等待信號(hào),生產(chǎn)者將信息寫入當(dāng)前內(nèi)存塊。

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

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

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

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

在Ubuntu 12操作系統(tǒng)中,如果有M個(gè)進(jìn)程,同時(shí)進(jìn)行共享內(nèi)存讀寫操作,對(duì)共享內(nèi)存中的區(qū)域數(shù)據(jù),必須利用PV原語設(shè)置好,在操作系統(tǒng)的不同的環(huán)境中,實(shí)現(xiàn)線程互斥和同步機(jī)制。Ubuntu 12操作系統(tǒng)環(huán)境中,對(duì)于內(nèi)存區(qū)域塊X,先解決的就是如何組織內(nèi)存塊,生產(chǎn)者進(jìn)程將數(shù)據(jù)寫入到內(nèi)存塊,新創(chuàng)建的消費(fèi)者進(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í)符,如果函數(shù)調(diào)用不成功否則-1。

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

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

int shmdt(const void *shm_addr);UNIX系統(tǒng)設(shè)置了一種機(jī)制,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ù),它比信號(hào)量要簡單很多。斷開共享內(nèi)存鏈接,代表失敗。如果為0,代表返回成功。需要說明的是這個(gè)進(jìn)程無法再訪問它,并不是說共享內(nèi)存已被銷毀。

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

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

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

Void write(){

shared_memory = shmat(shmid, NULL, 0);

if(memory==-1) {

//提示內(nèi)存分配錯(cuò)誤 printf( "內(nèi)存分配錯(cuò)誤\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)程的同步機(jī)制,written_by_you可用時(shí)候,輪到生產(chǎn)者,把數(shù)據(jù)寫入共享內(nèi)存,在Linux環(huán)境或者Windows環(huán)境,都是適用的,接著通過strncmp函數(shù)對(duì)數(shù)據(jù)字節(jié)比較,得到的結(jié)果進(jìn)行分析,通過進(jìn)程的通知消息,最終end通知進(jìn)程寫操作完成,這樣同步進(jìn)程,消費(fèi)者進(jìn)程可以對(duì)內(nèi)存片段進(jìn)行讀了。

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

按照內(nèi)存共享機(jī)制編寫Server.c。消費(fèi)者進(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)存分配錯(cuò)誤? printf("內(nèi)存分配錯(cuò)誤\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ù)寫入。如果有,則輸出,并且等待一個(gè)隨機(jī)的時(shí)間再將written_by_you重置為0。等待一個(gè)隨機(jī)時(shí)間的目的是模擬程序在對(duì)數(shù)據(jù)做復(fù)雜的處理,在此期間,生產(chǎn)者程序必須等待,不能寫入新的數(shù)據(jù)。當(dāng)傳遞的字符串為“end”時(shí)則程序結(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個(gè)Bytes的數(shù)據(jù)到共享的內(nèi)存片段,消費(fèi)者進(jìn)程然后從服務(wù)器端讀出數(shù)據(jù),測試每次從內(nèi)存中讀取的字節(jié)內(nèi)容,從測試結(jié)果可以得出,實(shí)現(xiàn)了同步讀取內(nèi)存片段的內(nèi)容。在測試環(huán)境中,同時(shí)可以建立多個(gè)消費(fèi)者進(jìn)程讀操作。多進(jìn)程間通信如圖3所示。

5? 效果分析

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

6? 結(jié)? 論

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

參考文獻(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ī)制的分析與比較 [J].計(jì)算機(jī)科學(xué),2002(11):16-21.

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

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

[5] 楊倩,楊明趙. Android顯示服務(wù)器——SurfaceFlinger研究 [J].計(jì)算機(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].計(jì)算機(jī)應(yīng)用研究,2004(8):187-188.

[8] 馬魁濤,蔡穎,郭寶峰.Win32進(jìn)程間信息共享的實(shí)現(xiàn)方法研究 [J].計(jì)算機(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)物理。

主站蜘蛛池模板: 欧美一级大片在线观看| 久久精品视频一| 毛片免费高清免费| 国产在线视频导航| 久久鸭综合久久国产| 亚洲av综合网| 日韩色图区| 亚洲一级无毛片无码在线免费视频| 九九线精品视频在线观看| 国产免费久久精品99re不卡 | 中文无码精品A∨在线观看不卡| 91精品国产自产在线观看| 成人综合在线观看| 亚洲精品国产成人7777| 免费在线不卡视频| 专干老肥熟女视频网站| 免费毛片在线| 不卡网亚洲无码| 欧美一区二区三区国产精品| 国产1区2区在线观看| 亚洲黄网在线| 日韩欧美高清视频| 亚洲中文字幕在线观看| 亚洲成aⅴ人在线观看| 91av国产在线| 在线观看av永久| 一级毛片在线免费视频| 久久久久国产一区二区| 91久久精品国产| 国产午夜无码专区喷水| 久久久亚洲色| 国产精品女同一区三区五区| 永久免费精品视频| 欲色天天综合网| 首页亚洲国产丝袜长腿综合| 国产精品手机视频| 国产成人精品免费av| 毛片三级在线观看| 最新精品久久精品| 亚洲国产精品无码久久一线| 国产xx在线观看| 久久中文电影| 亚洲一级毛片在线播放| 欧美视频在线播放观看免费福利资源 | 日韩性网站| 亚洲成人播放| 国产黑丝一区| 99热这里只有精品国产99| 国产91特黄特色A级毛片| 人妻无码一区二区视频| 一本大道AV人久久综合| 精品国产亚洲人成在线| 亚洲乱码精品久久久久..| 日韩av手机在线| 日本AⅤ精品一区二区三区日| 91成人免费观看| 亚洲一级毛片在线观播放| 亚洲AⅤ无码国产精品| 福利片91| 在线亚洲精品福利网址导航| 国产XXXX做受性欧美88| 国产小视频网站| 粗大猛烈进出高潮视频无码| 午夜福利免费视频| 久久综合九九亚洲一区| 中文字幕调教一区二区视频| 亚洲欧美精品一中文字幕| 黄色网页在线观看| 日韩国产黄色网站| 青草视频在线观看国产| 操国产美女| 99热这里只有精品久久免费| 国内精自视频品线一二区| 在线不卡免费视频| 亚洲中文精品人人永久免费| 欧美视频在线不卡| 伊人久久久久久久久久| 人人妻人人澡人人爽欧美一区 | 福利视频久久| 国产SUV精品一区二区6| 国产欧美中文字幕| 在线看片中文字幕|