c\#메모리 맵 을 통 해 파일 공유 메모리 의 예제 코드

메모리 맵 파일 은 가상 메모 리 를 이용 하여 프로 세 스 의 주소 공간 에 파일 을 비 추 는 것 입 니 다.그 후에 프로 세 스 작업 파일 은 프로 세 스 공간의 주소 와 같 습 니 다.예 를 들 어 c 언어 를 사용 한 memcpy 등 메모리 작업 함수 입 니 다.이런 방법 은 하나의 파일 이나 큰 파일 을 빈번하게 처리 해 야 하 는 상황 에서 잘 응 용 될 수 있다.이런 방식 으로 IO 를 처리 하 는 효율 은 일반 IO 보다 높다.
공유 메모 리 는 메모리 맵 파일 의 특수 한 상황 입 니 다.메모리 맵 은 디스크 의 파일 이 아 닌 메모리 입 니 다.공유 메모리 의 주 어 는 프로 세 스(Process)입 니 다.운영 체 제 는 기본적으로 모든 프로 세 스에 메모리 공간 을 할당 합 니 다.모든 프로 세 스 는 운영 체제 가 할당 한 메모리 에 만 접근 할 수 있 고 다른 프로 세 스에 접근 할 수 없습니다.때로는 서로 다른 프로 세 스 사이 에서 같은 메모리 에 접근해 야 하 는데,어떻게 해 야 합 니까?운영 체 제 는 공유 메모리 에 접근 하 는 API 를 만 들 었 습 니 다.공유 메모리 가 필요 한 프로 세 스 는 이 정 의 된 API 를 통 해 여러 프로 세 스 간 에 공 유 된 메모리 에 접근 할 수 있 습 니 다.각 프로 세 스 는 하 드 디스크 에 있 는 파일 에 접근 하 는 것 과 같 습 니 다.한편,.Net 4.0 에는 System.IO.Memory MappedFiles 네 임 스페이스 가 도입 되 었 습 니 다.이 네 임 스페이스 의 클래스 는 windows 공유 메모리 관련 API 를 패키지 하여.Net 프로그래머 가 메모리 맵 파일 을 더욱 편리 하 게 사용 할 수 있 도록 합 니 다.
C\#에서 공유 메모 리 를 사용 합 니 다.다음 App1 코드 는 사용자 가 공유 메모리 에 텍스트 한 줄 을 입력 하도록 합 니 다.App 2 콘 솔 을 계속 새로 고치 고 최신 공유 메모리 내용 을 출력 합 니 다.App3 가 구현 하 는 기능 은 App2 와 같 지만 읽 기 방법 은 다르다.
App1 코드:

using System;
using System.Collections.Generic;android             
using System.Linq;
using System.Text;

using System.IO;

//            
using System.IO.MemoryMappedFiles;

namespace App1
{
    class Program
    {
        static void Main(string[] args)
        {
            long capacity = 1<<10<<10;

            //          
            using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
            {
                //  MemoryMappedFile CreateViewAccssor            
                var viewAccessor = mmf.CreateViewAccessor(0, capacity);
                //    ,                        
                while (true)
                {
                    Console.WriteLine("               :");

                    string input = Console.ReadLine();

                    //                 
                    viewAccessor.Write(0, input.Length);

                    //     4      
                    viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
                }

            }
            
        }
    }
}
App2 코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

//                 
using System.IO.MemoryMappedFiles;

namespace App2
{
    class Program
    {
        static void Main(string[] args)
        {
              long capacity = 1<<10<<10;

              using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
              {
                  MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);

                  //             
                  while (true)
                  {
                      //      
                      int strLength = viewAccessor.ReadInt32(0);                      
                      char[] charsInMMf = new char[strLength];
                      //    
                      viewAccessor.ReadArray<char>(4, charsInMMf, 0, strLength);
                      Console.Clear();
                      Console.Write(charsInMMf);
                      Console.Write("\r");
                      Thread.Sleep(200);
                  }
              }
        }
    }
}
App3 코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO.MemoryMappedFiles;
using System.IO;

namespace App3
{
    class Program
    {
        static void Main(string[] args)
        {
            long capacity = 1 << 10 << 10;
            //      
            using (var mmf = MemoryMappedFile.OpenExisting("testMmf"))
            {
                //  CreateViewStream    stream  
                using (var mmViewStream = mmf.CreateViewStream(0, capacity))
                {
                    //     Unicode        
                    using (BinaryReader rdr = new BinaryReader(mmViewStream,Encoding.Unicode))
                    {
                        while (true)
                        {
                            mmViewStream.Seek(0, SeekOrigin.Begin);

                            int length = rdr.ReadInt32();

                            char[] chars = rdr.ReadChars(length);

                            Console.Write(chars);
                            Console.Write("\r");

                            System.Threading.Thread.Sleep(200);
                            Console.Clear();
                        }
                    }
                }
            }
        }
    }
}
데 이 터 를 읽 을 때 두 가지 방법 을 썼 다.
이전 에는 프로 세 스 간 의 통신 을 거의 사용 하지 않 았 기 때문에 이 방법 은 단지 초보적인 인식 을 하고 싶 을 뿐이다.이 프로그램 은 너무 초라 하 게 써 서 판단 하지 못 한 것 이 많다.예 를 들 어 공유 메모 리 를 어떻게 만 들 었 는 지 삭제 하 는 지 등등...
이상 은 c\#메모리 맵 을 통 해 파일 공유 메모리 의 예제 코드 에 대한 상세 한 내용 입 니 다.c\#파일 공유 메모리 에 관 한 자 료 는 다른 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기