共享記憶體定義:共享記憶體是最快的可用ipc(程序間通訊)形式。它允許多個不相關的程序去訪問同一部分邏輯記憶體。共享記憶體是由ipc為乙個程序建立的乙個特殊的位址範圍,它將出現在程序的位址空間中。其他程序可以把同一段共享記憶體段「連線到」它們自己的位址空間裡去。所有程序都可以訪問共享記憶體中的位址。如果乙個程序向這段共享記憶體寫了資料,所做的改動會立刻被有訪問同一段共享記憶體的其他程序看到。因此共享記憶體對於資料的傳輸是非常高效的。
共享記憶體段被對映程序式空間之後,存在於程序空間的什麼位置?共享記憶體段最大限制是多少?
共享記憶體段緊靠在棧之下,最大限制為32m
sysctl kern.ipc.shmmax
kern.ipc.shmmax: 33554432
預設設定只適合小安裝(預設最大共享記憶體是 32 mb)。不過,其它引數的預設值都相當大, 通常不需要改變。最大的共享記憶體段設定可以用
sysctl
介面設定。
共享記憶體的使用實現原理:
要使用一塊
共享記憶體,程序必須首先分配它。隨後需要訪問這個共享記憶體塊的每乙個程序都必須將這個共享記憶體繫結到自己的
位址空間中。當完成通訊之後,所有程序都將脫離共享記憶體,並且由乙個程序釋放該共享記憶體塊。
理解 linux 系統記憶體模型可以有助於解釋這個繫結的過程。在 linux 系統中,每個程序的虛擬記憶體是被分為許多頁面的。這些記憶體頁面中包含了實際的資料。
每個程序都會維護乙個從記憶體位址到虛擬記憶體頁面之間的對映關係
。儘管每個程序都有自己的記憶體位址,不同的程序可以同時將同乙個記憶體頁面對映到自己的位址空間中,從而達到共享記憶體的目的。
分配乙個新的共享記憶體塊會建立新的記憶體頁面。因為所有程序都希望共享對同一塊記憶體的訪問,只應由乙個程序建立一塊新的共享記憶體。再次分配一塊已經存在的記憶體塊不會建立新的頁面,而只是會返回乙個標識該記憶體塊的識別符號。
乙個程序如需使用這個共享記憶體塊,則首先需要將它繫結到自己的位址空間中。這樣會建立乙個從程序本身虛擬位址到共享頁面的對映關係。
當對共享記憶體的使用結束之後,這個對映關係將被刪除。當再也沒有程序需要使用這個共享記憶體塊的時候,必須有乙個(且只能是乙個)程序負責釋放這個被共享的記憶體頁面。
所有共享記憶體塊的大小都必須是系統頁面大小的整數倍。系統頁面大小指的是系統中單個記憶體頁面包含的位元組數。在 linux 系統中,記憶體頁面大小是4kb,不過您仍然應該通過呼叫
getpagesize 獲取這個值。
(1)程序通過呼叫
shmget
(shared memory get,獲取
共享記憶體
)來分配乙個共享記憶體塊。
(2)要讓乙個程序獲取對一塊
共享記憶體
的訪問,這個程序必須先呼叫 shmat(shared memory attach,繫結到共享記憶體)。將 shmget 返回的共享記憶體
識別符號shmid 傳遞給這個函式作為第乙個引數。該函式的第二個引數是乙個
指標,指向您希望用於對映該共享記憶體塊的程序
記憶體位址
;如果您指定null則linux會自動選擇乙個合適的位址用於對映。
(3)呼叫 shmctl("shared memory control",控制
共享記憶體
)函式會返回乙個共享記憶體塊的相關資訊。
要刪除乙個共享記憶體塊,則應將 ipc_rmid 作為第二個引數,而將 null 作為第三個引數。當最後乙個繫結該共享記憶體塊的程序與其脫離時,該共享記憶體塊將被刪除。
騰訊後台開發面試總結
linux和os netstat tcpdump ipcs ipcrm 如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 這四個命令的熟練掌握程度基本上能體現面試者實際開發和除錯程式的經驗 cpu 記憶體 硬碟 等等與系統效能除錯相關的命令必須熟練掌握,設定修改許可權 tcp網...
騰訊後台開發面試經驗
面試官簡單問了下工作地點的問題後,就直入主題了,沒問專案,全是程式設計基礎和演算法,感覺問題都是隨機的,從乙個問題根據你的回答深入到下乙個問題。1.static 使用與作用 2.inline 中斷 3.程序與儲存 4.棧的兩種指標,哎,才知道原來有個ebp是幀指標啊 5.殭屍程序的理解 6.awk,...
騰訊後台開發面試經驗
今年秋招找完工作有乙個段時間了,今天晚上比較閒,就稍微總結一下2016年這個秋招的面試經歷。面試流程 總共3面,第一面是技術面,第二面也是技術面,第三面是hr面 面試題目 這個網上比較多,隨便搜搜面試的時候都能碰到很多,我也記不清了 面試準備 主要準備的知識包括,c c tcp ip http 作業...