windows共享內存
https://docs.microsoft.com/zh-cn/dotnet/standard/io/memory-mapped-files
Windows多進程之間通信并沒有維護通用的消息隊列,只有在窗口類進程中維護有窗口消息隊列。即一個窗口進程中可以通過postmessage發送消息,通過DC句柄接收處理消息。 要實現普通多進程之間數據通信,可以使用管道、共享內存、文件讀寫、數據庫讀寫幾種方法,前兩種是Windows提供的機制,后兩種是變通的方法。相對前兩種方法因為是內存處理,效率高。 如果對實時性要求比較高,建議采用前兩種方法;如果處理頻率較低,本身進程中已有數據庫讀寫的處理,也可以采用數據庫讀寫的方式;如果數據簡單,讀寫頻率有低,有不愿專門增加數據庫讀寫的額外處理,也可以通過文件讀寫的方式獲取數據。
前兩種因為存儲在內存中,數據保密性較高;存儲在數據庫,如果有訪問密碼控制,保密性也能得到保證;存儲在文件,保密性和安全性最低。
這幾種方式都需要額外考慮數據讀寫的同步問題,采用數據庫時由于數據庫本身有讀寫鎖,一般不需要考慮數據的讀寫沖突,只需要考慮數據業務邏輯的前后關系即可;采用文件時一定要注意讀寫沖突,因為文件本身涉及IO操作,相對速度較慢,很容易發生沖突導致業務異常;采用管道和共享內存時也要注意讀寫同步,本身管道和共享內存在操作系統內部也相當于一個特殊的文件在管理。
共享內存是一種實現多進程之間快速通信的機制。在較高的.net版本,可以直接采用MemoryMappedFile類的CreateOrOpen方法創建或者打開一個內存映射文件,然后再CreateViewAccessor指向訪問視圖,后面就可以對映射到本進程空間的內存進行操作了。當然,這些內是非托管的。
在早期版本,需要加載Kernel32.dll庫的CreateFileMapping/OpenFileMapping/MapViewOfFile/UnmapViewOfFile函數接口來進行操作,先通過CreateFileMapping創建一個新的或者OpenFileMapping打開一個已經存在的,然后MapViewOfFile映射到本進程內存空間,然后就可以進行內存操作了,最后退出前UnmapViewOfFile取消映射。
注意著幾個方法的參數:
int?PAGE_READWRITE?=?0x04;int?FILE_MAP_ALL_ACCESS?=?0xF001F; ? CreateFileMapping(hFile,?IntPtr.Zero,?PAGE_READWRITE,?0,?MAX_MEM_MAP_SIZE,?mapFileName); ? OpenFileMapping(FILE_MAP_ALL_ACCESS,?0,?"Global\\my_mapfile_test"); ? MapViewOfFile(mapFilehandle,?0xf001f,?0,?0,?0); ? 注意:flProtect和dwDesiredAccess兩個參數不同。
windows
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。