資源描述:
《linux高級(jí)編程-5new》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、HauboTrainingCenterLinux高級(jí)程序設(shè)計(jì)-5張勇濤共享內(nèi)存共享內(nèi)存進(jìn)程一進(jìn)程二共享內(nèi)存什么是共享內(nèi)存?共享內(nèi)存區(qū)域是被多個(gè)進(jìn)程共享的一部分物理內(nèi)存。?如果多個(gè)進(jìn)程都把該內(nèi)存區(qū)域映射到自己的虛擬地址空間,則這些進(jìn)程就都可以直接訪問該共享內(nèi)存區(qū)域,從而可以通過該區(qū)域進(jìn)行通信。?共享內(nèi)存是進(jìn)程間共享數(shù)據(jù)的一種最快的方法,一個(gè)進(jìn)程向共享內(nèi)存區(qū)域?qū)懭肓藬?shù)據(jù),共享這個(gè)內(nèi)存區(qū)域的所有進(jìn)程就可以立刻看到其中的內(nèi)容。?共享內(nèi)存由進(jìn)程創(chuàng)建,但是進(jìn)程結(jié)束時(shí)共享內(nèi)存仍然保留,除非該共享內(nèi)存被顯示的刪
2、除戒重啟系統(tǒng)。?ipcs–m查看系統(tǒng)中共享內(nèi)存的基本信息實(shí)現(xiàn)共享內(nèi)存的步驟一、創(chuàng)建共享內(nèi)存,使用shmget函數(shù)。二、映射共享內(nèi)存,將這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去,使用shmat函數(shù)。?注意:共享內(nèi)存由進(jìn)程創(chuàng)建,但是進(jìn)程結(jié)束時(shí),共享內(nèi)存仍然保留,除非是共享內(nèi)存被顯示地刪除或重啟操作系統(tǒng).共享內(nèi)存的創(chuàng)建系統(tǒng)調(diào)用:shmget();原型:intshmget(key_tkey,intsize,intshmflg);參數(shù):key是共享內(nèi)存的關(guān)鍵字,size指定共享內(nèi)存的大小shmflg的低9
3、位決定了共享內(nèi)存屬主,屬組,和其它用戶的訪問權(quán)限,其它位指定了共享內(nèi)存的創(chuàng)建方式返回值:如果成功,返回共享內(nèi)存段標(biāo)識(shí)符。如果失敗,則返回-1:消息隊(duì)列創(chuàng)建方式參數(shù):參數(shù)描述IPC_CREAT創(chuàng)建共享內(nèi)存,如果共享內(nèi)存已經(jīng)存在,就獲取共享內(nèi)存的標(biāo)示符IPC_EXCL與宏IPC_CREAT一起使用,單獨(dú)使用無意義,此時(shí)只能創(chuàng)建一個(gè)不存在的共享內(nèi)描述存,如果內(nèi)存已經(jīng)存在則調(diào)用失敗系統(tǒng)調(diào)用:shmget()?注意:當(dāng)參數(shù)key的取值為IPC_PRIVATE時(shí),將創(chuàng)建關(guān)鍵字為0的共享內(nèi)存,UNIX內(nèi)核中可
4、以同時(shí)存在多個(gè)關(guān)鍵字為0的共享內(nèi)存系統(tǒng)調(diào)用:shmget()errno=EINVAL(無效的內(nèi)存段大小)EEXIST(內(nèi)存段已經(jīng)存在,無法創(chuàng)建)EIDRM(內(nèi)存段已經(jīng)被刪除)ENOENT(內(nèi)存段不存在)EACCES(權(quán)限不夠)ENOMEM(沒有足夠的內(nèi)存來創(chuàng)建內(nèi)存段)共享內(nèi)存的映射系統(tǒng)調(diào)用:shmat();原型:void*shmat(intshmid,char*shmaddr,intshmflg);返回值:如果成功,則返回共享內(nèi)存段連接到進(jìn)程中的地址。如果失敗,則返回-1:errno=EINVA
5、L(無效的IPCID值或者無效的地址)ENOMEM(沒有足夠的內(nèi)存)EACCES(存取權(quán)限不夠)?在絕大部分情況,我們指定參數(shù)shmaddr值為NULL標(biāo)志位,系統(tǒng)將自勱確認(rèn)共享內(nèi)存鏈接到進(jìn)程空間的首地址。共享內(nèi)存的釋放當(dāng)一個(gè)進(jìn)程不在需要共享的內(nèi)存段時(shí),它將會(huì)把內(nèi)存段從其地址空間中脫離。系統(tǒng)調(diào)用:shmdt();調(diào)用原型:intshmdt(char*shmaddr);返回值:如果失敗,則返回-1;errno=EINVAL(無效的連接地址)共享內(nèi)存的例子?shm1.c?shm2.c共享內(nèi)存與管道1
6、.使用共享內(nèi)存機(jī)制通訊的兩個(gè)線程必須在同一臺(tái)物理機(jī)器上2.共享內(nèi)存的訪問方式是隨機(jī)的,而不是只能從一端寫,從另一端讀,因此,其靈活性比管道和套接字大的多,能夠傳從的信息也復(fù)雜的多。共享內(nèi)存的缺點(diǎn)1.管理復(fù)雜,兩個(gè)進(jìn)程必須在同一臺(tái)物理機(jī)器上才能使用這種方式。2.安全性脆弱。消息隊(duì)列IPC(interprocesscommunication)?廣義上一切能是進(jìn)程間互相交流的對(duì)象和方法都是IPC,比如文件、管道、socket等。?狹義上的IPC特指消息隊(duì)列、信號(hào)量和共享內(nèi)存三種對(duì)象。?IPC的應(yīng)用范圍
7、:消息隊(duì)列應(yīng)用于不同進(jìn)程之間少量數(shù)據(jù)的順序共享。信號(hào)量應(yīng)用于進(jìn)程間的同步與互斥的控制。共享內(nèi)存則應(yīng)用于進(jìn)程間大批量數(shù)據(jù)的隨機(jī)共享訪問。管道的缺陷?管道是一種最古老的方式,他不打包就直接發(fā)送過去了消息隊(duì)列的優(yōu)點(diǎn)1.消息隊(duì)列先進(jìn)先出2.消息隊(duì)列將輸出的信息進(jìn)行了打包處理,這樣就可以保證以每個(gè)消息為單位進(jìn)行接收。3.消息隊(duì)列可以對(duì)貨物進(jìn)行分類服務(wù),標(biāo)記各類別的貨物,這樣可以根據(jù)貨物類別分別出貨。消息隊(duì)列?消息隊(duì)列就是消息的一個(gè)鏈表,它允許一個(gè)戒多個(gè)進(jìn)程向它寫消息,一個(gè)戒多個(gè)進(jìn)程從中讀消息。具有一定的F
8、IFO的特性,但是可實(shí)現(xiàn)消息的隨即查詢。這些消息存在于內(nèi)核中,由“隊(duì)列ID”來標(biāo)識(shí)。消息隊(duì)列的實(shí)現(xiàn)包括創(chuàng)建和打開隊(duì)列、添加消息、讀取消息和控制消息隊(duì)列這四種操作。msgget:創(chuàng)建和打開隊(duì)列,其消息數(shù)量受系統(tǒng)限制。msgsnd:添加消息,將消息添加到消息隊(duì)列尾部。msgrcv:讀取消息,從消息隊(duì)列中取走消息。msgctl:控制消息隊(duì)列。消息隊(duì)列的創(chuàng)建intmsgget(key_tkey,intflag)key:返回新的或已有隊(duì)列的ID,IPC_PRIVATEflag:低9位決定了共享內(nèi)存屬主,屬