久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 學習資源 > 講師博文 > 進程間的通訊方式之共享內存

進程間的通訊方式之共享內存 時間:2023-11-01      來源:華清遠見

 在我們學習嵌入式課程里面的進程線程這一章節的時候,不可避免的會遇到通訊的問題,我們知道線程他們之間的數據是可以共享的,但是進程是相互獨立的,那么進程與進程之間能進行數據交互么?又有哪些方式呢?我們接著往下看

 首先進程之間也是可以進行通訊的,他的通訊方式也有很多,比如說:共享內存、消息隊列、信號量、信號、管道等等,每一種通訊方式都有自己的優缺點。今天我們著重了解一下共享內存這一方式

1、什么是共享內存?

 答:共享內存是一種進程間的通訊方式。它允許兩個或者更多進程訪問同一塊內存,就如同malloc函數向不同進程返回了指向同一個物理內存區域的指針。共享內存是Unix/Linux 下多進程之間的通信方式,這種方法通常用于一個程序的多進程間通信,實際上多個程序間也可以通過共享內存來傳遞信息。并且共享內存是最快的IPC 形式。一旦這樣的內存映射到共享它的進程進程的地址空間,這些進程數據傳遞將不會再設計到內核,也就是說進程不用通過執行進入內核的系統調用來傳遞彼此的數據

2、如何實現共享內存的呢?

 答:首先我們需要明白,進程間通信的前提:先讓不同的進程,看到同一份資源。而共享內存就是通過進程可以看到同一塊內存而實現的

 每一個進程都有一個虛擬的地址空間,在地址空間的棧區和堆區中間有一塊很大的內存,叫共享區,在用戶申請共享內存時,操作系統在物理內存種申請一塊空間,然后映射到頁表種,頁表建立聯系后,在映射到各自的共享區種。兩個進程共同映射的物理內存操作就叫共享內存

基本編寫

首先如果我們要實現共享內存,需要四個接口:

從操作系統角度:1、創建空閑內存 2、刪除共享內存

進程角度:3、關聯共享內存 4、去關聯共享內存

 

創建共享內存

·參數

·參數

 

 key:這個共享內存段名字,與信號量的semget函數一樣,程序需要提供一個參數key(非0整數),它有效地為共享內存段命名,shmget()函數成功時返回一個與key相關的共享內存標識符(非負整數),用于后續的共享內存函數。調用失敗返回-1.。

 不相關的進程可以通過該函數的返回值訪問同一共享內存,它代表程序可能要使用的某個資源,程序對所有共享內存的訪問都是間接的,程序先通過調用shmget)函數并提供一個鍵,再由系統生成一個相應的共享內存標識符(shmget()函數的返回值),只有shmget()函數才直接使用信號量鍵,所有其他的信號量函數使用由semget函數返回的信號量標識符。

 

size:共享內存以字節為單位指定需要共享的內存容量。

共享內存以字節為單位指定需要共享的內存容量。

 這個大小以字節為單位。實現通常將其向上取為系統頁長的整數倍,如果應用指定的size值并非系統頁長的整數倍,那么最后一頁的余下部分是不可使用的。

 這個大小以字節為單位.實現通常將其向上取為系統頁長的整數倍,如果應用指定的Size值并非系統頁長的整數倍,那么最后一頁的余下部分是不可使用的.

 如果創建一個新段(通常在服務器進程中),則必須指定其size。如果正在引用一個現存的段(一個客戶進程),則將size指定為0,。當創建一個新段是,段內的內容初始化為0。

 

 shmflg:shmflg是權限標志,由九個權限標志構成,它們的用法和創建文件時使用mode模式標志是一樣的。它的作用也與open函數的mode參數一樣,如果要想在key標識的共享內存不存在時,創建它的話,可以與IPC_CREAT做或操作。共享內存的權限標志與文件的讀寫權限一樣,舉例來說,0644,它表示允許一個進程創建的共享內存被內存創建者所擁有的進程向共享內存讀取和寫入數據,同時其他用戶創建的進程只能讀取共享內存。

 

返回值:成功返回一個非負整數,即該共享內存段的標識碼;失敗返回-1

 

shmat函數:

shmid :共享內存標識

shmaddr:指定連接的地址

shmflg :它的兩個可能取值是SHM_RND和SHM_RDONLY

 返回值:成功返回一個指針,指向共享內存第一個字節;失敗返回-1。如果shmat成功執行,那么內核將使與該共享存儲段相關的shmid_ds結構中的shm_nattch計數器值加1。

注意:

 shmaddr為NULL,則此段連接到由內核選擇的一個可用地址上,則是推薦的使用方式。shmaddr不為NULL且 shmfilg 無 SHM_RND標記,則以shmaddr為連接地址。

 shmaddr不為NULL且shmfig設置了SHM_RND標記,則連接的地址會自動向下調整為SHMLBA的整數倍。

 

公式: shmaddr - (shmaddr % SHMLBA)

 除非只計劃在一種硬件上運行應用程序(這在當今是不大可能的),否則不應指定共享內存段所連接到地址。而是應當指定shmaddr為NULL,以便由系統來選擇地址。

shmflg=SHM_RDONLY,表示連接操作用來只讀共享內存,否則以讀寫方式連接此段。

 當對共享內存的操作結束時,則調用shmdt與該段分離。注意:這不從系統中刪除其標識符以及相關的數據結構。該標識符依然存在,直至某個進程(一般是服務器進程)帶IPC_RMID命令的調用shmctl特地刪除它為止。

 

Shmdt 函數

功能: 將共享內存段與當前進程脫離

原型:int shmdt(const void *shmaddr)

參數:

Shmaddr 由 shmat 所返回的指針

返回值:成功返回0,失敗返回-1

注意:將共享內存段與當前進程脫離不等于刪除共享內存段

 

shmctl函數

·功能:用用于控制共享內存

 原型int shmctl(int shmid, int cmd,struct shmid_ds *buf);。

參數

shmid:由shmget返回的共享內存標識碼

cmd:將要采取的動作(有三個可取值)

IPC_STAT: 取此段的shmid_ds 結構,并將它存在由buf 指向的結構中

 IPC_SET:按buf指向的結構體中的值設置與此共享存儲段相關的shmid_ds結構中的字段。

IPC_RMID:從系統中刪除該共享內存

 

buf:指向一個保存這共享內存的模式狀態和訪問權限的數據結構

返回值: 成功返回0,失敗返回-1

 

上一篇:WEB前端工程師生存攻略

下一篇:TCP/IP協議棧的心跳、丟包重傳、連接超時機制實例詳解

戳我查看嵌入式每月就業風云榜

點我了解華清遠見高校學霸學習秘籍

猜你關心企業是如何評價華清學員的

干貨分享
相關新聞
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2024 北京華清遠見科技發展有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部