共享內(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)存的通信方式效率是非常高的。