看完這篇多進(jìn)程同步、通信、共享內(nèi)存、內(nèi)存映射文件后,我悟了!
節(jié)點通信存在兩種模型:共享內(nèi)存(Shared memory)和消息傳遞(Messages passing)。
內(nèi)存映射文件對于托管世界的開發(fā)人員來說似乎很陌生,但它確實已經(jīng)是很遠(yuǎn)古的技術(shù)了,而且在操作系統(tǒng)中地位相當(dāng)。實際上,任何想要共享數(shù)據(jù)的通信模型都會在幕后使用它。
內(nèi)存映射文件究竟是個什么?內(nèi)存映射文件允許你保留一塊地址空間,然后將該物理存儲映射到這塊內(nèi)存空間中進(jìn)行操作。物理存儲是文件管理,而內(nèi)存映射文件是操作系統(tǒng)級內(nèi)存管理。


優(yōu)勢: ? ? 1.訪問磁盤文件上的數(shù)據(jù)不需執(zhí)行I/O操作和緩存操作(當(dāng)訪問文件數(shù)據(jù)時,作用尤其顯著); ? ? 2.讓運行在同一臺機(jī)器上的多個進(jìn)程共享數(shù)據(jù)(單機(jī)多進(jìn)程間數(shù)據(jù)通信效率最高);
利用文件與內(nèi)存空間之間的映射,應(yīng)用程序(包括多個進(jìn)程)可以通過直接在內(nèi)存中進(jìn)行讀寫來修改文件。.NET Framework 4 用托管代碼按照本機(jī)Windows函數(shù)訪問內(nèi)存映射文件的方式來訪問內(nèi)存映射文件,管理 Win32 中的內(nèi)存映射文件 。
有兩種類型的內(nèi)存映射文件:
持久內(nèi)存映射文件 持久文件是與磁盤上的源文件關(guān)聯(lián)的內(nèi)存映射文件。在最后一個進(jìn)程使用完此文件后,數(shù)據(jù)將保存到磁盤上的源文件中。這些內(nèi)存映射文件適合用來處理非常大的源文件。
非持久內(nèi)存映射文件 非持久文件是未與磁盤上的源文件關(guān)聯(lián)的內(nèi)存映射文件。當(dāng)最后一個進(jìn)程使用完此文件后,數(shù)據(jù)將丟失,并且垃圾回收功能將回收此文件。這些文件適用于為進(jìn)程間通信 (IPC) 創(chuàng)建共享內(nèi)存。
在多個進(jìn)程之間進(jìn)行共享(進(jìn)程可通過使用由創(chuàng)建同一內(nèi)存映射文件的進(jìn)程所指派的公用名來映射到此文件)。
若要使用一個內(nèi)存映射文件,則必須創(chuàng)建該內(nèi)存映射文件的完整視圖或部分視圖。還可以創(chuàng)建內(nèi)存映射文件的同一部分的多個視圖,進(jìn)而創(chuàng)建并發(fā)內(nèi)存。為了使兩個視圖能夠并發(fā),必須基于同一內(nèi)存映射文件創(chuàng)建這兩個視圖。
如果文件大于應(yīng)用程序用于內(nèi)存映射的邏輯內(nèi)存空間(在 32 位計算機(jī)上為2GB),則還需要使用多個視圖。
有兩種類型的視圖:流訪問視圖和隨機(jī)訪問視圖。使用流訪問視圖可對文件進(jìn)行順序訪問;在使用持久文件時,隨機(jī)訪問視圖是首選方法。
.Net 共享內(nèi)存 內(nèi)存映射文件原理:通過操作系統(tǒng)的內(nèi)存管理器訪問的,因此會自動將此文件分隔為多個頁,并根據(jù)需要對其進(jìn)行訪問。您不需要自行處理內(nèi)存管理。如下圖:

C# .Net 共享內(nèi)存 演示代碼如下:
C# .Net ?進(jìn)程間通信 共享內(nèi)存 完整示例: C#共享內(nèi)存非持久化方式通訊的例子,通訊時的線程和進(jìn)程控制也沒有問題。如下是實現(xiàn)的代碼。
