国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# .Net 多進(jìn)程同步 通信 共享內(nèi)存

這篇具有很好參考價(jià)值的文章主要介紹了C# .Net 多進(jìn)程同步 通信 共享內(nèi)存。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

節(jié)點(diǎn)通信存在兩種模型:共享內(nèi)存(Shared memory)和消息傳遞(Messages passing)。

??????? 內(nèi)存映射文件對(duì)于托管世界的開發(fā)人員來說似乎很陌生,但它確實(shí)已經(jīng)是很遠(yuǎn)古的技術(shù)了,而且在操作系統(tǒng)中地位相當(dāng)。實(shí)際上,任何想要共享數(shù)據(jù)的通信模型都會(huì)在幕后使用它。

????????內(nèi)存映射文件究竟是個(gè)什么?內(nèi)存映射文件允許你保留一塊地址空間,然后將該物理存儲(chǔ)映射到這塊內(nèi)存空間中進(jìn)行操作。物理存儲(chǔ)是文件管理,而內(nèi)存映射文件是操作系統(tǒng)級(jí)內(nèi)存管理

優(yōu)勢(shì)
???? 1.訪問磁盤文件上的數(shù)據(jù)不需執(zhí)行I/O操作和緩存操作(當(dāng)訪問文件數(shù)據(jù)時(shí),作用尤其顯著);
???? 2.讓運(yùn)行在同一臺(tái)機(jī)器上的多個(gè)進(jìn)程共享數(shù)據(jù)(單機(jī)多進(jìn)程間數(shù)據(jù)通信效率最高);

???????利用文件與內(nèi)存空間之間的映射,應(yīng)用程序(包括多個(gè)進(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)存映射文件。在最后一個(gè)進(jìn)程使用完此文件后,數(shù)據(jù)將保存到磁盤上的源文件中。這些內(nèi)存映射文件適合用來處理非常大的源文件。

  • 非持久內(nèi)存映射文件

    非持久文件是未與磁盤上的源文件關(guān)聯(lián)的內(nèi)存映射文件。當(dāng)最后一個(gè)進(jìn)程使用完此文件后,數(shù)據(jù)將丟失,并且垃圾回收功能將回收此文件。這些文件適用于為進(jìn)程間通信?(IPC) 創(chuàng)建共享內(nèi)存。

??? 1)在多個(gè)進(jìn)程之間進(jìn)行共享(進(jìn)程可通過使用由創(chuàng)建同一內(nèi)存映射文件的進(jìn)程所指派的公用名來映射到此文件)。

? ??2)若要使用一個(gè)內(nèi)存映射文件,則必須創(chuàng)建該內(nèi)存映射文件的完整視圖或部分視圖。還可以創(chuàng)建內(nèi)存映射文件的同一部分的多個(gè)視圖,進(jìn)而創(chuàng)建并發(fā)內(nèi)存為了使兩個(gè)視圖能夠并發(fā),必須基于同一內(nèi)存映射文件創(chuàng)建這兩個(gè)視圖。

??? 3)如果文件大于應(yīng)用程序用于內(nèi)存映射的邏輯內(nèi)存空間(在 32 位計(jì)算機(jī)上為2GB),則還需要使用多個(gè)視圖。

有兩種類型的視圖:流訪問視圖和隨機(jī)訪問視圖。使用流訪問視圖可對(duì)文件進(jìn)行順序訪問;在使用持久文件時(shí),隨機(jī)訪問視圖是首選方法。

????.Net 共享內(nèi)存 內(nèi)存映射文件原理:通過操作系統(tǒng)的內(nèi)存管理器訪問的,因此會(huì)自動(dòng)將此文件分隔為多個(gè)頁,并根據(jù)需要對(duì)其進(jìn)行訪問。您不需要自行處理內(nèi)存管理。如下圖:

C# .Net 共享內(nèi)存 演示代碼如下:

????//持久內(nèi)存映射文件:基于現(xiàn)有文件創(chuàng)建一個(gè)具有指定公用名的內(nèi)存映射文件

????using?(var?mmf =?MemoryMappedFile.CreateFromFile(@"c:\內(nèi)存映射文件.data",?FileMode.Open,?"公用名"))
????{
????????//通過指定的?偏移量和大小?創(chuàng)建內(nèi)存映射文件視圖服務(wù)器
????????using?(var?accessor = mmf.CreateViewAccessor(offset, length)) //偏移量,可以控制數(shù)據(jù)存儲(chǔ)的內(nèi)存位置;大小,用來控制存儲(chǔ)所占用的空間
????????{
????????????//Marshal提供了一個(gè)方法集,這些方法用于分配非托管內(nèi)存、復(fù)制非托管內(nèi)存塊、將托管類型轉(zhuǎn)換為非托管類型,此外還提供了在與非托管代碼交互時(shí)使用的其他雜項(xiàng)方法。

????????????int?size =?Marshal.SizeOf(typeof(char));

????????????//修改內(nèi)存映射文件視圖
????????????for?(long?i = 0; i < length; i += size)
????????????{
????????????????char?c= accessor.ReadChar(i);
????????????????accessor.Write(i,?ref?c);
????????????}
????????}
????}

????//另一個(gè)進(jìn)程或線程可以,在系統(tǒng)內(nèi)存中打開一個(gè)具有指定名稱的現(xiàn)有內(nèi)存映射文件

????using?(var?mmf =?MemoryMappedFile.OpenExisting("公用名"))
????{
????????using?(var?accessor = mmf.CreateViewAccessor(4000000, 2000000))
????????{
????????????int?size =?Marshal.SizeOf(typeof(char));
????????????for?(long?i = 0; i < length; i += size)
????????????{
????????????????char?c = accessor.ReadChar(i);
????????????????accessor.Write(i,?ref?c);
????????????}
??????? }
????}

????//非持久內(nèi)存映射文件:未映射到磁盤上的現(xiàn)有文件的內(nèi)存映射文件

????using?(MemoryMappedFile?mmf =?MemoryMappedFile.CreateNew("testmap", 10000))
????{
????????bool?mutexCreated;
????????//進(jìn)程間同步
????????Mutex?mutex =?newMutex(true,?"testmapmutex",?out?mutexCreated);
????????using?(var?stream = mmf.CreateViewStream()) //創(chuàng)建文件內(nèi)存視圖流 基于流的操作
????????{
????????????var?writer =?newBinaryWriter(stream);
????????????writer.Write(1);
????????}
????????mutex.ReleaseMutex();

????????Console.WriteLine("Start Process B and press ENTER to continue.");
????????Console.ReadLine();

????????mutex.WaitOne();
????????using?(MemoryMappedViewStream?stream = mmf.CreateViewStream())
????????{
????????????var?reader =?newBinaryReader(stream);
????????????Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
????????????Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
????????}
????????mutex.ReleaseMutex();
????}

????using?(MemoryMappedFile?mmf =?MemoryMappedFile.OpenExisting("testmap"))
????{
?????????Mutex?mutex =?Mutex.OpenExisting("testmapmutex");
????????mutex.WaitOne();
???????using?(var?stream = mmf.CreateViewStream(1, 0))//注意這里的偏移量
????????{
????????????var?writer =?newBinaryWriter(stream);
????????????writer.Write(0);
????????}
????????mutex.ReleaseMutex();

????}

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

先啟動(dòng)消息服務(wù)IMServer_Message,

再啟動(dòng)狀態(tài)服務(wù)IMServer_State,

IMServer_Message回車一次(創(chuàng)建共享內(nèi)存公用名和公用線程鎖,并視圖流方式寫共享內(nèi)存),

IMServer_State回車一次(獲取共享內(nèi)存并視圖流方式寫、視圖訪問器寫入結(jié)構(gòu)體類型)

并立刻IMServer_Message再回車一次(讀取剛剛寫入的信息),

觀察IMServer_State屏顯變化并等待(線程鎖)約5s(線程鎖被釋放)后

在IMServer_Message上觀察屏顯(顯示剛剛寫入共享內(nèi)存的信息)

?IMServer_Message.exe 代碼

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;

namespace IMServer_Message
{
??? /// <summary>
??? /// 用于共享內(nèi)存方式通信的 值類型 結(jié)構(gòu)體
??? /// </summary>
??? public struct ServiceMsg
??? {
??????? public int Id;
??????? public long NowTime;
??? }

??? internal class Program
??? {
??????? private static void Main(string[] args)
??????? {
??????????? Console.Write("請(qǐng)輸入共享內(nèi)存公用名(默認(rèn):testmap):");
??????????? string shareName = Console.ReadLine();
??????????? if (string.IsNullOrEmpty(shareName))
??????????????? shareName = "testmap";
??????????? using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(shareName, 1024000,MemoryMappedFileAccess.ReadWrite))
??????????? {
??????????????? bool mutexCreated;
??????????????? //進(jìn)程間同步
??????????????? var mutex = new Mutex(true, "testmapmutex", out mutexCreated);
??????????????? using (MemoryMappedViewStream stream = mmf.CreateViewStream()) //創(chuàng)建文件內(nèi)存視圖流
??????????????? {
??????????????????? var writer = new BinaryWriter(stream);
??????????????????? for (int i = 0; i < 5; i++)
??????????????????? {
??????????????????????? writer.Write(i);
??????????????????????? Console.WriteLine("{0}位置寫入流:{0}", i);
??????????????????? }
??????????????? }

??????????????? mutex.ReleaseMutex();

??????????????? Console.WriteLine("啟動(dòng)狀態(tài)服務(wù),按【回車】讀取共享內(nèi)存數(shù)據(jù)");
??????????????? Console.ReadLine();

??????????????? mutex.WaitOne();
??????????????? using (MemoryMappedViewStream stream = mmf.CreateViewStream())
??????????????? {
??????????????????? var reader = new BinaryReader(stream);
??????????????????? for (int i = 0; i < 10; i++)
??????????????????? {
??????????????????????? Console.WriteLine("{1}位置:{0}", reader.ReadInt32(), i);
??????????????????? }
??????????????? }

??????????????? using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(1024, 10240))
??????????????? {
??????????????????? int colorSize = Marshal.SizeOf(typeof (ServiceMsg));
??????????????????? ServiceMsg color;
??????????????????? for (int i = 0; i < 50; i += colorSize)
??????????????????? {
??????????????????????? accessor.Read(i, out color);
??????????????????????? Console.WriteLine("{1}\tNowTime:{0}", new DateTime(color.NowTime), color.Id);
??????????????????? }
??????????????? }
??????????????? mutex.ReleaseMutex();
??????????? }
??????????? Console.WriteLine("測(cè)試: 我是 即時(shí)通訊 - 消息服務(wù) 我啟動(dòng)啦!??!");
??????????? Console.ReadKey();
??????? }
??? }
}

IMServer_State.exe代碼

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;

namespace IMServer_State
{
??? /// <summary>
??? /// 用于共享內(nèi)存方式通信的 值類型 結(jié)構(gòu)體
??? /// </summary>
??? public struct ServiceMsg
??? {
??????? public int Id;
??????? public long NowTime;
??? }

??? internal class Program
??? {
??????? private static void Main(string[] args)
??????? {
??????????? Console.Write("請(qǐng)輸入共享內(nèi)存公用名(默認(rèn):testmap):");
??????????? string shareName = Console.ReadLine();
??????????? if (string.IsNullOrEmpty(shareName))
??????????????? shareName = "testmap";
??????????? using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(shareName, 1024000,MemoryMappedFileAccess.ReadWrite))
??????????? {
??????????????? Mutex mutex = Mutex.OpenExisting("testmapmutex");
??????????????? mutex.WaitOne();
??????????????? using (MemoryMappedViewStream stream = mmf.CreateViewStream(20, 0)) //注意這里的偏移量
??????????????? {
??????????????????? var writer = new BinaryWriter(stream);
??????????????????? for (int i = 5; i < 10; i++)
??????????????????? {
??????????????????????? writer.Write(i);
??????????????????????? Console.WriteLine("{0}位置寫入流:{0}", i);
??????????????????? }
??????????????? }
??????????????? using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(1024, 10240))
??????????????? {
??????????????????? int colorSize = Marshal.SizeOf(typeof (ServiceMsg));
??????????????????? var color = new ServiceMsg();
??????????????????? for (int i = 0; i < colorSize*5; i += colorSize)
??????????????????? {
??????????????????????? color.Id = i;
??????????????????????? color.NowTime = DateTime.Now.Ticks;
??????????????????????? //accessor.Read(i, out color);
??????????????????????? accessor.Write(i, ref color);
??????????????????????? Console.WriteLine("{1}\tNowTime:{0}", new DateTime(color.NowTime), color.Id);
??????????????????????? Thread.Sleep(1000);
??????????????????? }
??????????????? }
??????????????? Thread.Sleep(5000);

??????????????? mutex.ReleaseMutex();
??????????? }
??????????? Console.WriteLine("測(cè)試: 我是 即時(shí)通訊 - 狀態(tài)服務(wù) 我啟動(dòng)啦!??!");
??????????? Console.ReadKey();
??????? }
??? }
}?文章來源地址http://www.zghlxwxcb.cn/news/detail-739122.html

到了這里,關(guān)于C# .Net 多進(jìn)程同步 通信 共享內(nèi)存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux——進(jìn)程通信之共享內(nèi)存

    Linux——進(jìn)程通信之共享內(nèi)存

    目錄 一.? 回顧上文 二.共享內(nèi)存 1.定義 2.特點(diǎn): 3.實(shí)現(xiàn)步驟: 如下為成功鏈接共享內(nèi)存使用權(quán)的完整步驟: 4.函數(shù)介紹 ????????4.1shmget函數(shù) ????????4.1.2參數(shù)介紹? ? ? ? ? ? ? ? 4.2ftok函數(shù): ????????4.2.1參數(shù)介紹 ????????????????關(guān)于ftok(); shmget();函數(shù)的

    2024年02月12日
    瀏覽(21)
  • (26)Linux 進(jìn)程通信之共享內(nèi)存(共享儲(chǔ)存空間)

    (26)Linux 進(jìn)程通信之共享內(nèi)存(共享儲(chǔ)存空間)

    共享內(nèi)存是System V版本的最后一個(gè)進(jìn)程間通信方式。 共享內(nèi)存,顧名思義就是允許兩個(gè)不相關(guān)的進(jìn)程訪問同一個(gè)邏輯內(nèi)存,共享內(nèi)存是兩個(gè)正在運(yùn)行的進(jìn)程之間共享和傳遞數(shù)據(jù)的一種非常有效的方式。不同進(jìn)程之間共享的內(nèi)存通常為同一段物理內(nèi)存。進(jìn)程可以將同一段物理內(nèi)

    2024年01月16日
    瀏覽(24)
  • 【Linux】進(jìn)程間通信——管道/共享內(nèi)存

    【Linux】進(jìn)程間通信——管道/共享內(nèi)存

    進(jìn)程間通信( Inter-Process Communication,簡稱IPC )是指不同進(jìn)程之間進(jìn)行數(shù)據(jù)交換和共享信息的機(jī)制和技術(shù)。在操作系統(tǒng)中,每個(gè)進(jìn)程都是獨(dú)立運(yùn)行的,有自己的地址空間和數(shù)據(jù),因此進(jìn)程之間需要一種機(jī)制來進(jìn)行通信,以便彼此協(xié)調(diào)工作、共享數(shù)據(jù)或者進(jìn)行同步操作。 進(jìn)程間

    2024年02月16日
    瀏覽(25)
  • 【Linux】進(jìn)程間通信之共享內(nèi)存

    【Linux】進(jìn)程間通信之共享內(nèi)存

    共享內(nèi)存比管道快哦~ 文章目錄 前言 一、共享內(nèi)存的實(shí)現(xiàn)原理 二、實(shí)現(xiàn)共享內(nèi)存的代碼 總結(jié) 共享內(nèi)存區(qū)是最快的IPC形式。一旦這樣的內(nèi)存映射到共享它的進(jìn)程的地址空間,這些進(jìn)程間數(shù)據(jù)傳遞不再涉及到內(nèi)核,換句話說是進(jìn)程不再通過執(zhí)行進(jìn)入內(nèi)核的系統(tǒng)調(diào)用來傳遞彼此的

    2024年02月03日
    瀏覽(22)
  • Linux 共享內(nèi)存mmap,進(jìn)程通信

    Linux 共享內(nèi)存mmap,進(jìn)程通信

    進(jìn)程間通信是操作系統(tǒng)中重要的概念之一,使得不同的進(jìn)程可以相互交換數(shù)據(jù)和進(jìn)行協(xié)作。其中,共享內(nèi)存是一種高效的進(jìn)程間通信機(jī)制,而內(nèi)存映射(mmap)是實(shí)現(xiàn)共享內(nèi)存的一種常見方法。 存儲(chǔ)映射 I/O 是 一個(gè)磁盤文件 與 存儲(chǔ)空間中的一個(gè)緩沖區(qū)相映射 。于是, 當(dāng)從緩

    2024年02月13日
    瀏覽(26)
  • 進(jìn)程間通信--共享內(nèi)存詳解【Linux】

    進(jìn)程間通信--共享內(nèi)存詳解【Linux】

    本文詳細(xì)講解了共享內(nèi)存的原理和使用,并且通過實(shí)例代碼角度來深度理解共享內(nèi)存,下面就讓我們開始吧。 數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程 資源共享:多個(gè)進(jìn)程之間共享同樣的資源。 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(

    2024年02月02日
    瀏覽(26)
  • 【hello Linux】進(jìn)程間通信——共享內(nèi)存

    【hello Linux】進(jìn)程間通信——共享內(nèi)存

    目錄 前言: 1. System V共享內(nèi)存 1. 共享內(nèi)存的理解 2. 共享內(nèi)存的使用步驟 3. 共享內(nèi)存的使用 ????????1. 共享內(nèi)存的創(chuàng)建 ????????查看共享內(nèi)存 ????????2. 共享內(nèi)存的釋放 ????????3. 共享內(nèi)存的掛接 ????????4. 共享內(nèi)存的去掛接 4. 共享內(nèi)存的使用示例 1. 兩進(jìn)

    2024年02月01日
    瀏覽(34)
  • C++ Windows進(jìn)程間共享內(nèi)存通信

    C++ Windows進(jìn)程間共享內(nèi)存通信

    在項(xiàng)目工程中需要64位程序調(diào)用32位程序并加以通信。 實(shí)現(xiàn)了兩個(gè)進(jìn)程間的內(nèi)存共享。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 1、進(jìn)程間通信原理: 主要實(shí)現(xiàn): ? 系統(tǒng)使用內(nèi)存映射文件,以便加載和執(zhí)行. exe和DLL文件。這可以大大節(jié)省頁文件空間和應(yīng)用程序啟動(dòng)

    2024年02月03日
    瀏覽(18)
  • Linux--進(jìn)程間的通信-共享內(nèi)存

    Linux--進(jìn)程間的通信-共享內(nèi)存

    前文: Linux–進(jìn)程間的通信-匿名管道 Linux–進(jìn)程間的通信–進(jìn)程池 Linux–進(jìn)程間的通信-命名管道 對(duì)于兩個(gè)進(jìn)程,通過在內(nèi)存開辟一塊空間(操作系統(tǒng)開辟的),進(jìn)程的虛擬地址通過頁表映射到對(duì)應(yīng)的共享內(nèi)存空間中,進(jìn)而實(shí)現(xiàn)通信 ; 特點(diǎn)和作用: 高效性: 共享內(nèi)存是一種

    2024年04月26日
    瀏覽(32)
  • 【Linux】進(jìn)程間的通信之共享內(nèi)存

    【Linux】進(jìn)程間的通信之共享內(nèi)存

    利用 內(nèi)存共享 進(jìn)行進(jìn)程間的通信的原理其實(shí)分為以下幾個(gè)步驟: 在物理內(nèi)存中創(chuàng)建一塊共享內(nèi)存。 將共享內(nèi)存鏈接到要通信的進(jìn)程的頁表中,并通過頁表進(jìn)行進(jìn)程地址空間的映射。 進(jìn)程地址空間映射完畢以后返回首個(gè)虛擬地址,以便于進(jìn)程之間進(jìn)行通信。 根據(jù)共享內(nèi)存的

    2024年02月09日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包