共享記憶體解讀

2022-03-05 17:19:18 字數 1227 閱讀 9038

環境: linux (ubuntu server 64)

system v共享記憶體

直接類似於posix的高階版本

3. bus error(匯流排錯誤)

1. 記憶體位元組對齊(本人也是初次聽說,不太支援這個觀點)

如int型別的未4位元組,參見

本人反駁,是因為:

1 #include 2 #include 3 #include 4

5int

main() 6

; 9char *str = s+10;

10int *pint; 11

for(int i=0;i<4;i++) 12

16return0;

17}

18

view code

執行結果:

2. 程序控制塊(pcb)未知的記憶體訪問錯誤

3.   其他。//了解得不多了

4. posix記憶體對映檔案的問題

甚至在一些書上都寫著使用記憶體去對映乙個檔案時,可以不用去理會檔案本身的大小,可以訪問超越檔案大小的地方。

這樣的說法是不全對的。(這一點也確實害了我不淺)

因為使用記憶體對映就要向作業系統申請記憶體時,作業系統都是乙個page的大小為單位進行分配的。當檔案大小不為整數個page大小時,便會多得到一些對映的記憶體(即檔案大小按page單位取上整)。 

於是記憶體對映檔案就存在這樣乙個問題:像通過這樣的方式,去申請一塊大於被對映檔案乙個page大小的記憶體是不成功的(不一定立即返回錯誤),但是實際申請到的記憶體是限制大小的。

這時訪問的記憶體就可能不成功!參見下面**

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

10#define handle_error(msg) \

11do while (0)

12int

main() 13

3738

//g++ main.cpp -lrt

view code

總結: 使用posix共享記憶體時第一步應該使用ftruncate將被對映的偽檔案擴充套件到一定的大小!

Linux共享記憶體及共享記憶體API

共享記憶體區是最快的ipc 程序間通訊 形式。用共享記憶體從伺服器拷貝檔案資料到客戶端 共享記憶體基本api include include 1.int shmget key t key,size t size,int shm 功能 用來建立共享記憶體 key 是這個共享記憶體段的名字 size 共...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...