1樓:year醫海無邊
要讓乙個程序獲取對一塊共享記憶體的訪問,這個程序必須先呼叫 shmat(shared memory attach,繫結到共享記憶體)。
將 shmget 返回的共享記憶體識別符號 shmid 傳遞給這個函式作為第乙個引數。
該函式的第二個引數是乙個指標,指向希望用於對映該共享記憶體塊的程序記憶體位址;
如果指定null則linux會自動選擇乙個合適的位址用於對映。
第三個引數是乙個標誌位,包含了以下選項:
shm_rnd表示第二個引數指定的位址應被向下靠攏到記憶體頁面大小的整數倍。
如果不指定這個標誌,將不得不在呼叫shmat的時候手工將共享記憶體塊的大小按頁面大小對齊。
shm_rdonly表示這個記憶體塊將僅允許讀取操作而禁止寫入。
如果這個函式呼叫成功則會返回繫結的共享記憶體塊對應的位址。
通過 fork 函式建立的子程序同時繼承這些共享記憶體塊;
如果需要,它們可以主動脫離這些共享記憶體塊。
當乙個程序不再使用乙個共享記憶體塊的時候應通過呼叫 shmdt(shared memory detach,脫離共享記憶體塊)函式與該共享記憶體塊脫離。
將由 shmat 函式返回的位址傳遞給這個函式。
如果當釋放這個記憶體塊的程序是最後乙個使用該記憶體塊的程序,則這個記憶體塊將被刪除。
對 exit 或任何exec族函式的呼叫都會自動使程序脫離共享記憶體塊。
2樓:匿名使用者
虛擬位址基本不同的,幾乎任意的。而共享的實體地址是一樣的。
linux記憶體位址分為虛擬位址和實體地址,使用者層程式看到只是虛擬位址,每個程序都有自己的虛擬位址空間,一般linux下為0~3gb,不同的應用程式看到的都是一樣,而且看不到其它的應用程式,好像系統就是自己一樣,當時只是核心知道。核心通過頁表聯絡虛擬位址和實體地址。兩個程式可能虛擬位址不一樣,但是對應的是同乙個真實實體地址。
linux共享記憶體和mmap的區別
3樓:匿名使用者
共享記憶體允許兩個或多個程序共享一給定的儲存區,因為資料不需要來回複製,所以是最快的一種程序間通訊機制。共享記憶體可以通過mmap()對映普通檔案
(特殊情況下還可以採用匿名對映)機制實現,也可以通過系統v共享記憶體機制實現。應用介面和原理很簡單,內部機制複雜。為了實現更安全通訊,往往還與訊號燈等同步機制共同使用。
mmap的機制如:就是在磁碟上建立乙個檔案,每個程序儲存器裡面,單獨開闢乙個空間來進行對映。如果多程序的話,那麼不會對實際的物理儲存器(主存)消耗太大。
shm的機制:每個程序的共享記憶體都直接對映到實際物理儲存器裡面。
1、mmap儲存到實際硬碟,實際儲存並沒有反映到主存上。優點:儲存量可以很大(多於主存);缺點:程序間讀取和寫入速度要比主存的要慢。
2、shm儲存到物理儲存器(主存),實際的儲存量直接反映到主存上。優點,程序間訪問速度(讀寫)比磁碟要快;缺點,儲存量不能非常大(多於主存)
使用上看:如果分配的儲存量不大,那麼使用shm;如果儲存量大,那麼使用mmap。
4樓:時歡悅
mmap的機制如:就是在磁碟上建立乙個檔案,每個程序儲存器裡面,單獨開闢乙個空間來進行對映。如果多程序的話,那麼不會對實際的物理儲存器(主存)消耗太大。
shm的機制:每個程序的共享記憶體都直接對映到實際物理儲存器裡面。
1、mmap儲存到實際硬碟,實際儲存並沒有反映到主存上2、shm儲存到物理儲存器(主存),實際的儲存量直接反映到主存上。
使用上看:如果分配的儲存量不大,那麼使用shm;如果儲存量大,那麼使用shm。
以上內容**,
為啥不使用mac位址作為手機的唯一標示,而是用imei
mac 位址屬於網絡卡的,一塊網絡卡可以有乙個 mac 位址,乙個手機可以有蜂窩資料的乙個 mac 位址乙個 wi fi 網絡卡的 mac 位址。imei 位址是裝置獨有的,imei是裝置唯一標識,mac是網路介面位址,都具有唯一性。一般來講要唯一標識裝置的話往往需要多種手段相結合。imei和無線網...
IP位址已經是唯一了,那麼協議中為何還需要實體地址
協議中需要實體地址,是為了進一步標識物理硬體。有了實體地址,認證過程就更完整了。ip位址是虛擬位址,雖然是唯一的,但可隨機變化。而實體地址是晶元位址或主機板位址 mac位址 即固化在物理電路裡的mac位址,是不可變的位址。作為協議,應該盡量詳細或全面包容位址內容。以體現協議的真實性 有效性 可控性。...
讀書是唯一的出路嗎讀書真的是唯一的出路嗎
其實並不是講 萬般皆下品,唯有讀書高 但是,讀書畢竟是我們站在前人的肩膀上去看世界,有前人給我們的經驗,可以在一定的程度上開拓我們的視野,讀書要讀書活書,不是說 盡信書不如無書 讀書看你是怎麼讀,為知識而讀書還是為功名而讀書,三十六行,行行出狀元。只要你肯努力,無論做什麼事,做是可以成功 的。世上無...