프로세스 간 통신(예: 윈도우 서비스 ASP.NET 호출)을 위해 공유 메모리를 사용하는 오래된 시스템의 재배치에 참여하며, 이 기술의 중요성을 이해하도록 강요받습니다. NET 개발자들의 인기 없는 기술, 특별 노트.
[공유 기억이란 무엇인가?] 】 프로세스 간 통신을 위한 용어인 인터프로세스 커뮤니케이션(Interprocess Communiction, IPC)이 있으며, 윈도우 플랫폼에서는 다음과 같은 옵션이 있습니다: 참고문헌:하이퍼링크 로그인이 보입니다.
클립보드 프로그램 A는 콘텐츠를 클립보드에 붙여넣고, 프로그램 B는 클립보드에서 콘텐츠를 가져옵니다. COM OLE 복합 문서는 워드 파일을 엑셀 워크시트에 삽입할 수 있으며, 엑셀은 두 번의 클릭으로 편집을 위해 호출할 수 있습니다. 데이터 복사 프로그램 A는 합의된 형식으로 프로그램 B에 WM_COPYDATA 메시지를 전송합니다 DDE DDE는 서로 다른 애플리케이션이 서로 다른 형식으로 데이터를 교환할 수 있게 해주는 통신 프로토콜로, 클립보드의 확장으로 볼 수 있고 일회성 전송 외에도 연속적으로 전송할 수 있습니다. (상대적으로 성능이 낮아 더 이상 권장하지 않음) 파일 매핑 파일 매핑은 여러 애플리케이션이 공유 파일 매핑(Named Shared Memory)을 통해 데이터를 교환할 때 프로세스를 하나의 메모리 조각으로 시뮬레이션하는 것을 의미하며, 이는 다양한 IPC 방법 중 가장 좋은 성능을 보여주지만, Mutex와 같은 동기화 메커니즘으로 인해 이를 방지하기 위해 필수적입니다. 우편 슬롯 일방향 통신으로, 메일슬롯 클라이언트는 메일슬롯 서버로 메시지를 전송하고, 서버가 메시지를 읽으면 삭제되어 크로스 머신 전송을 지원하며, 1대다 브로드캐스트도 가능합니다. (방송 메시지의 길이는 400바이트로 제한되며, 메일슬롯 서버가 일대일 전송을 위해 설정될 때 메시지 길이를 결정합니다) 파이프 양방향 전송은 익명 파이프와 이름 파이프로 나뉩니다. 익명 파이프는 일반적으로 부모 프로그램과 자식 프로그램 간의 표준 입출력 방향에 사용되며, 네트워크 전역을 가로질러 통신할 수 없고 의존관계가 있는 프로세스에만 한정되는 양방향 통신을 위해 두 개의 파이프를 구축해야 합니다. 이름 파이프는 어떤 프로세스 간이든 데이터를 교환하고 네트워크 간 프로세스 전송을 지원하는 데 사용할 수 있습니다. RPC 원격 프로시저 호출(RPC)은 애플리케이션이 다른 애플리케이션이 제공하는 기능을 호출할 수 있게 하며, 네트워크를 통해 호출할 수 있습니다. Windows RPC는 ISO DCE 표준을 준수하며 운영체제 간 통합을 지원합니다. 윈도우 소켓 TCP/IP 또는 기타 네트워크 프로토콜을 기반으로 한 추상 통신 인터페이스이며, 데이터 교환은 하위 계층의 네트워크 연결을 통해 수행됩니다. 공유 메모리는 C/C++ 개발자들이 흔히 사용하는 데이터 교환 방식입니다(구글에서 리눅스에서 공유 메모리로 구현된 IPC 사례를 많이 찾을 수 있습니다). 따라서 C/C++ 개발자들은 종종 Windows 플랫폼에서 통신 채널로 이를 선택합니다.
【공유 기억 실습 연습] 사용하는 사람은 적지만, .NET에는 내장된 System.IO.MemoryMappedFiles 네임스페이스가 있습니다. 파일 관련 연산 경험만 있다면 공유 메모리를 플레이하는 것은 어렵지 않습니다. 파일을 다루는 것과 거의 같습니다. FileStream 관련 연산 경험만 있다면 빠르게 시작할 수 있습니다. MSDN 예제를 참고하세요. 제가 작성한 미니 프로그램 연습문제를 참고하세요.하이퍼링크 로그인이 보입니다.
저는 ProcessA를 MemoryMappedFile.CreateNew()로 1024바이트 공간을 생성하고, 다른 ProcessB로 패스와 캐치를 연습하는 두 프로그램을 작성했습니다. 1024바이트가 두 프로그램이 공유하기 때문에, 첫 번째 512바이트는 프로세스 B에 쓰이고, 마지막 512바이트는 프로세스 B가 프로세스 A 읽기에 쓰이도록 계획하며, 프로그램은 CreateViewStream을 사용해 시작 주소와 길이를 전달해 자신의 영역을 가리킵니다. ProcessA와 ProcessB가 MemoryMappedFile에 접근할 때 읽기/쓰기 충돌을 피하기 위해, Mutex 락을 사용해 한 번에 한 프로세스만 MemoryMappedFile에 접근할 수 있도록 제어합니다. 테스트 프로세스는 ProcessA의 MemoryMappedFile을 생성하고 메시지 문자열을 쓰> ProcessB가 메시지 문자열을 읽고 응답 문자열을 쓰> ProcessA가 응답 문자열을 읽고 종료합니다.
ProcessA 절차는 다음과 같습니다:
ProcessB 절차는 다음과 같습니다:
테스트는 성공적이었어요!
【추가 팁】
1. 현재 Windows에서 활성화된 MemoryMappedFile을 어떻게 볼 수 있나요?
SystemInternals에는 Windows에서 접근 가능한 모든 파일, 폴더, 레지스트리, 객체, Windows 서비스를 나열하는 AccessChk 도구가 있습니다. MemoryMappedFile은 Windows 객체이며, 다음 명령어를 사용해 모든 객체를 나열하고 아카이브할 수 있습니다 accesschk -osv > e:\objList.txt MemoryMappedFile 이름이 있으면 다음과 같은 기록을 볼 수 있습니다: \세션\1\BaseNamedObjects\DARKTHREAD 유형: 섹션 중간 필수 수준 (기본값) [경고 없음] RW NT 권위\시스템 SECTION_ALL_ACCESS RW 도메인\사용자 이름 SECTION_ALL_ACCESS RW 도메인\UserName-S-1-5-5-0-954410 SECTION_ALL_ACCESS
AccessChk 도구 다운로드:하이퍼링크 로그인이 보입니다.
2. MemoryMappedFile 프리셋은 사용자의 세션에서 활성화되어 있으며, 세션 간에 사용할 수 없습니다. 예를 들어, 서로 다른 AppPool에 속한 두 ASP.NET 가 실행 식별이 다르더라도, MemoryMappedFile 이름이 같더라도 각 앱풀의 복사본은 하나이므로 양측이 사용하는 실행 식별이 동일한지 확인해야 합니다.
3. 서로 다른 실행 식별 간에 통신하기 위해, MemoryMappedFile의 이름을 "Global\ Filename"으로 지정할 수 있습니다(Global의 경우는 다르며, GLOBAL 경로가 잘못 쓰인 천둥을 밟았습니다). 이를 통해 실행 식별 간에 접근할 수 있습니다. 하지만 세션 0(Windows 서비스)을 제외한 프로세스는 Global\... MemoryMappedFile. (MSDN 파일) 세션 0에 대해서는 MVP가 반대편에 있는 이 글 - 세션 0 격리 관통 (1) (하이퍼링크 로그인이 보입니다.그 안에는 매우 상세한 서문이 있습니다.
다음에서 재게재:하이퍼링크 로그인이 보입니다.
|