C#共享內存整理


1.System.IO.MemoryMappedFiles 內存映射文件

內存映射文件將文件的內容映射到應用程序的邏輯地址空間。 內存映射文件使程序員得以處理極大的文件(這是因為可以並發管理內存),並且它們允許對文件進行完整的隨機訪問而不需要查找文件。 內存映射文件還可以在多個進程之間進行共享。

CreateFromFile 方法基於磁盤上的現有文件的指定路徑或 FileStream 創建一個內存映射文件。 未映射映射文件時,更改都將自動傳播到磁盤。

CreateNew 方法創建一個未映射到磁盤上的現有文件的內存映射文件;而且這些方法還適合創建用於進程間通信 (IPC) 的共享內存。

內存映射文件與名稱相關聯。

您可以創建內存映射文件的多個視圖,包括部分文件的視圖。 可以將某個文件的相同部分映射到多個地址,以創建並發內存。 為了使兩個視圖能夠並發,必須基於同一內存映射文件創建這兩個視圖。 對同一文件創建兩個文件映射的兩個視圖不具有並發性。(https://msdn.microsoft.com/zh-cn/library/system.io.memorymappedfiles.memorymappedfile(v=vs.100).aspx)

常用函數:

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static MemoryMappedFile CreateOrOpen(
    string mapName, //要分配給內存映射文件的名稱。
    long capacity,//要分配給內存映射文件的最大大小(以字節為單位)。
    MemoryMappedFileAccess access,//用於指定內存映射文件允許的訪問類型的枚舉值之一。 默認值為 ReadWrite
    MemoryMappedFileOptions options,//枚舉值的按位組合,用於為內存映射文件指定內存分配選項。
    MemoryMappedFileSecurity memoryMappedFileSecurity,//可以針對內存映射文件授予的文件訪問和操作權限。此參數可以為 null。
    HandleInheritability inheritability//用於指定內存映射文件的句柄能否由子進程繼承的枚舉值之一。 默認值為 None
)
在系統內存中創建或打開一個具有指定容量、訪問類型、內存分配、安全權限和繼承性的內存映射文件。
使用此方法創建或打開一個不持久保留的內存映射文件(即,不與磁盤上的文件關聯),您可以使用該文件在進程之間共享數據。
using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
{
    //通過MemoryMappedFile的CreateViewAccssor方法獲得共享內存的訪問器  
    var viewAccessor = mmf.CreateViewAccessor(0, capacity);
viewAccessor.Write(0, input.Length);
   //向共享內存4位置寫入字符  
   viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
}
public static MemoryMappedFile CreateNew(
    string mapName, //要分配給內存映射文件的名稱。
    long capacity   //要分配給內存映射文件的最大大小(以字節為單位)。
)
使用此方法創建一個不持久保留的內存映射文件(即,不與磁盤上的文件關聯),您可以使用該文件在進程之間共享數據。
 static void Main(string[] args)
 {
     using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
     {
         bool mutexCreated;
         Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
         using (MemoryMappedViewStream stream = mmf.CreateViewStream())
         {
             BinaryWriter writer = new BinaryWriter(stream); writer.Write(1);
         }
         mutex.ReleaseMutex();
         mutex.WaitOne();
         using (MemoryMappedViewStream stream = mmf.CreateViewStream())
         {
             BinaryReader reader = new BinaryReader(stream);
             Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
             Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
             Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
         }
         mutex.ReleaseMutex();
     }
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM