共享內(nèi)存
作者:xcbeyond
瘋狂源自夢想,技術成就輝煌!微信公眾號:《程序猿技術大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術輸出、分享,現(xiàn)階段從事微服務架構項目的研發(fā)工作,涉及架構設計、技術選型、業(yè)務研發(fā)等工作。對于Java、微服務、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
共享內(nèi)存是Linux下最快速、最有效的進程間通信方式。是多個進程可以把同一段內(nèi)存映射到自己的進程空間,以此實現(xiàn)數(shù)據(jù)的共享與傳輸。即:對于不同的進程A、B,將同一塊物理內(nèi)存映射到進程A、B各自進程的地址空間,進程A能夠及時地看到進程B對共享內(nèi)存中數(shù)據(jù)的更新,反之B進程同樣能夠及時地看到進程A對共享內(nèi)存中數(shù)據(jù)的更新。
共享內(nèi)存存在于內(nèi)核級別的一種資源,因此是所有進程間通信(IPC)方式中最快的一種。在shell中通過命令ipcs可以查看當前系統(tǒng)IPC中的狀態(tài):
<span style="font-size:14px;">[xcbeyond@bogon /]$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x000000001 32768 xcbeyond 600 655360 2
0xfffffffff 589825 xcbeyond 0 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages </span>
在系統(tǒng)內(nèi)核為一個進程分配內(nèi)存地址時,通過分頁機制可以讓一個進程的物理地址不連續(xù),同時也可以讓同一段內(nèi)存分配給不同的進程。共享內(nèi)存機制就是通過該原理來實現(xiàn)的,共享內(nèi)存只是提供數(shù)據(jù)的傳送,而如何確保進行服務器端和客戶端讀寫操作的互斥性,就需要一些其他的方式來控制了,例如信號量。
采用共享內(nèi)存通信的一個顯著的好處就是效率高,因為進程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對于像管道和消息隊列等通信方式,則需要在內(nèi)核和用戶空間進行四次的數(shù)據(jù)拷貝,而對于共享內(nèi)存則只需要拷貝兩次數(shù)據(jù):一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實際上,進程之間在共享內(nèi)存時,并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時,再重新建立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直就保存在共享內(nèi)存中了,并沒有寫回溫江。共享內(nèi)存中的內(nèi)容往往是在解除映射時才寫回文件的,因此,采用共享內(nèi)存的通信方式效率是非常高的。