主頁(yè) > 知識(shí)庫(kù) > Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解

Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解

熱門標(biāo)簽:400的電話一般從哪里辦理 昆明電銷機(jī)器人價(jià)格 江西全自動(dòng)外呼系統(tǒng)報(bào)價(jià) 地圖標(biāo)注人員分布 梧州防封電銷卡 春運(yùn)地圖標(biāo)注app 益陽(yáng)400電話申請(qǐng)辦理流程 上海機(jī)器人外呼系統(tǒng)哪家好 怎么用百度地圖標(biāo)注坐標(biāo)

Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解

內(nèi)存共享: 兩個(gè)不同進(jìn)程A、B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)程B對(duì)共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。由于多個(gè)進(jìn)程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機(jī)制,互斥鎖和信號(hào)量都可以。

效率: 采用共享內(nèi)存通信的一個(gè)顯而易見的好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對(duì)于像管道和消息隊(duì)列等通信方式,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù)[1]: 一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實(shí)際上,進(jìn)程之間在共享內(nèi)存時(shí),并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時(shí),再重新建 立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒有寫回文件。共享內(nèi)存中的內(nèi)容往往是在解除映射時(shí)才寫回 文件的。因此,采用共享內(nèi)存的通信方式效率是非常高的。

共享內(nèi)存實(shí)現(xiàn)機(jī)制

共享內(nèi)存是通過(guò)把同一塊內(nèi)存分別映射到不同的進(jìn)程空間中實(shí)現(xiàn)進(jìn)程間通信。而共享內(nèi)存本身不帶任何互斥與同步機(jī)制,但當(dāng)多個(gè)進(jìn)程同時(shí)對(duì)同一內(nèi)存進(jìn)行讀寫操作時(shí)會(huì)破壞該內(nèi)存的內(nèi)容,所以,在實(shí)際中,同步與互斥機(jī)制需要用戶來(lái)完成。
來(lái)看幾個(gè)系統(tǒng)調(diào)用函數(shù):

(1)創(chuàng)建共享內(nèi)存



參數(shù):key為輸出型參數(shù)
size:size的大小應(yīng)為1024整數(shù)倍(4k對(duì)齊)
shmflg:權(quán)限標(biāo)志

(2)將共享內(nèi)存映射到自己的內(nèi)存空間:shmat

shmat是空間映射,通過(guò)創(chuàng)建的共享內(nèi)存,在它能被進(jìn)程訪問(wèn)之前,需要把該段內(nèi)存映射到用戶進(jìn)程空間。shmaddr是用來(lái)指定共享內(nèi)存映射到當(dāng)前進(jìn)程中的地址位置,要想改設(shè)置有用,shmflag必須設(shè)置為SHM_RND標(biāo)志。大多情況下,應(yīng)設(shè)置為空指針(void*)0,讓系統(tǒng)自動(dòng)選擇地址,從而減小程序?qū)τ布囊蕾囆?。shmflag除了上面的設(shè)置外,還可以設(shè)置為SHM_RDONLY,使得映射過(guò)來(lái)的地址只讀。
返回值:調(diào)用成功則返回映射地址的第一個(gè)字節(jié),失敗返回-1。
(3)解除映射:shmdt



參數(shù)為要解除的地址空間。

(4)控制共享內(nèi)存

先來(lái)看第三個(gè)參數(shù)的結(jié)構(gòu)體:


第二個(gè)參數(shù)cmd的選項(xiàng):IPC_STAT:得到共享內(nèi)存的狀態(tài),把共享內(nèi)存的shmid_ds結(jié)構(gòu)體復(fù)制到buf里

IPC_SET:改變共享內(nèi)存的狀態(tài),把buf所指的結(jié)構(gòu)體中的uid,gid,mode,復(fù)制到共享內(nèi)存的shmid_ds結(jié)構(gòu)體內(nèi)
IPC_RMID:刪除這塊共享內(nèi)存
BUF:共此內(nèi)存管理結(jié)構(gòu)體

代碼實(shí)現(xiàn):

共享內(nèi)存的特點(diǎn):

(1)共享內(nèi)存就是允許兩個(gè)不想關(guān)的進(jìn)程訪問(wèn)同一個(gè)內(nèi)存
(2)共享內(nèi)存是兩個(gè)正在運(yùn)行的進(jìn)程之間共享和傳遞數(shù)據(jù)的最有效的方式
(3)不同進(jìn)程之間共享的內(nèi)存通常安排為同一段物理內(nèi)存
(4)共享內(nèi)存不提供任何互斥和同步機(jī)制,一般用信號(hào)量對(duì)臨界資源進(jìn)行保護(hù)。
(5)接口簡(jiǎn)單

所有進(jìn)程間通信的特點(diǎn):

(1)管道

管道分為命名管道和匿名管道。匿名管道只能單向通信,且只能在有親緣關(guān)系的進(jìn)程間使用,常用于父子進(jìn)程,當(dāng)一個(gè)進(jìn)程創(chuàng)建了一個(gè)管道,并調(diào)用fork創(chuàng)建子進(jìn)程后,父進(jìn)程關(guān)閉讀端,子進(jìn)程關(guān)閉寫端,實(shí)現(xiàn)單向通信。管道是面向字節(jié)流,自帶互斥與同步機(jī)制,生命周期隨進(jìn)程。
命名管道與匿名管道:命名管道允許毫不相干的兩個(gè)進(jìn)程之間

(2)信號(hào)量

信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)線程對(duì)共享資源的訪問(wèn),它不是用于交換大批數(shù)據(jù),而用于多線程之間的同步,常作為一種鎖機(jī)制,防止某進(jìn)程在訪問(wèn)資源時(shí)其他進(jìn)程也來(lái)訪問(wèn),因此,主要作為進(jìn)程間以及同一進(jìn)程的不同線程間的同步手段。

(3)消息隊(duì)列

消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí),消息隊(duì)列克服了信號(hào)傳遞信息少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)受限等特點(diǎn)。消息隊(duì)列是UNIX下不同進(jìn)程之間可以實(shí)現(xiàn)資源共享的 一種機(jī)制,UNIX允許不同進(jìn)程將格式化的數(shù)據(jù)流以消息隊(duì)列形式發(fā)送給任意進(jìn)程,對(duì)消息隊(duì)列具有操作權(quán)限的進(jìn)程都可以使用msgget完成對(duì)消息隊(duì)列的操作控制,通過(guò)使用消息類型,進(jìn)程可以按順序讀信息,或?yàn)橄才艃?yōu)先級(jí)順序。

(4)共享內(nèi)存

共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn),共享內(nèi)存是最快的IPC方式,它是針對(duì)其他IPC方式運(yùn)行效率低而專門設(shè)計(jì)的,它往往與其他機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步。

    以上就是Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的內(nèi)容詳細(xì)介紹,大家可以參考下,如果有疑問(wèn)的可以到本站留言,進(jìn)行討論。感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • Linux下用Valgrind做檢查(防止內(nèi)存泄露)
  • jmeter在linux系統(tǒng)下運(yùn)行及本地內(nèi)存調(diào)優(yōu)的方法詳解
  • linux swap交換內(nèi)存擴(kuò)容的方法
  • Python3監(jiān)控windows,linux系統(tǒng)的CPU、硬盤、內(nèi)存使用率和各個(gè)端口的開啟情況詳細(xì)代碼實(shí)例
  • Linux內(nèi)核私闖進(jìn)程地址空間并修改進(jìn)程內(nèi)存的方法
  • 如何利用Bash腳本監(jiān)控Linux的內(nèi)存使用情況
  • Linux系統(tǒng)查看CPU、機(jī)器型號(hào)、內(nèi)存等信息
  • Linux中大內(nèi)存頁(yè)Oracle數(shù)據(jù)庫(kù)優(yōu)化的方法
  • 詳解Linux內(nèi)核內(nèi)存管理架構(gòu)
  • Linux系統(tǒng)下利用C程序輸出某進(jìn)程的內(nèi)存占用信息
  • 解決Linux下php-fpm進(jìn)程過(guò)多導(dǎo)致內(nèi)存耗盡問(wèn)題
  • python監(jiān)控linux內(nèi)存并寫入mongodb(推薦)
  • Linux內(nèi)存描述符mm_struct實(shí)例詳解
  • Linux 下如何檢查內(nèi)存使用率

標(biāo)簽:贛州 九江 河南 亳州 北京 惠州 新疆 懷化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解》,本文關(guān)鍵詞  Linux,共享,內(nèi)存,實(shí)現(xiàn),機(jī)制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Linux共享內(nèi)存實(shí)現(xiàn)機(jī)制的詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章