본문 바로가기

학부_대학원/운영체제

프로세스간 통신 IPC - Shared Mem

SMALL

IPC(Inter-Process Communication)이란 영어 번역 그대로 프로세스간 통신을 말한다.

동일한 바이너리를 실행해도 전혀 다른 메모리를 사용하면서 서로 침범할 수 없다.

하지만 프로세스끼리 통신을 하기 위해서 여러가지 방법이 존재한다.

그 중 이번에 알아볼 내용은 메모리의 공유를 이용한 방법이다.

FILE MAPPING을 이용하여서 메모리를 공유를 할 것이다. 그럼 FILE_MAPPING이란 무엇인가?

FILE MAPPING이란 파일을 메모리에 연결하여 메모리에 입출력을 하면, 디스크와 직접 연결되어 있어

디스크에도 입출력이 이루어지는 기능을 말한다. [참고1]이를 잘 나타낸 그림이 MS에 나와 있어 가져왔다.


즉 하나의 메모리 조각을 같이 공유 함으로써, 데이터를 공유 할 수 있는 것이다.

해당 내용을 확인 할 수있는 코드이다.


#include "windows.h"
#include "stdio.h"


int main()
{
	HANDLE hShared_Mem = NULL;
	char* pData = NULL; // 공유 메모리 Addr 저장 변수
	int num = 0; //switch 선택

	//공유 메모리가 존재하는지 확인
	hShared_Mem = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, "richong_Shared_Mem");


	//존재 할 경우 루틴
	if (hShared_Mem != NULL){
		printf_s("Find_Shared Mem\n");
	}
	//존재 하지 않을 경우 공유 메모리를 생성
	else
	{
		printf_s("not existing Shared Mem\n");
		printf_s("Creating Shared Mem\n");
		hShared_Mem = CreateFileMapping(INVALID_HANDLE_VALUE
			, NULL
			, PAGE_READWRITE
			, 0
			, 1024
			, "richong_Shared_Mem");

		if (hShared_Mem != NULL){
			printf_s("Shared Mem Create Success\n");
		}
		else{
			printf_s("Fail to create Shared Mem,Exit\n");
			return 0;
		}
	}
	//공유 메모리의 주소 얻어 옴
		pData = (char*)MapViewOfFile(hShared_Mem,
			FILE_MAP_ALL_ACCESS,
			0,
			0,
			1024);

		do
		{
			printf_s("Select 1.store , 2.laod 3. Delete \n ");
			scanf_s("%d", &num);
			
			fflush(stdin);
			switch (num)
			{
				case 1:
					printf_s("Input store string :");
					
					char tmp_Input_string[1024];
					scanf_s("%s", tmp_Input_string);
					strcpy_s(pData,1024,tmp_Input_string);
					break;

				case 2:
					printf_s("Load Shared Data :");
					printf_s("%s\n", pData);
					system("pause");
					system("cls");
					break;
				case 3:
					if (pData != NULL)
						UnmapViewOfFile(pData);
					if (hShared_Mem != NULL)
						CloseHandle(hShared_Mem);
					return 0;
					break;
				default:
					printf_s("Select only 1, 2 plz.\n");
				break;
			}
			
			
		} while (1);




	}

P1이 공유 메모리에 "12345"데이터를 기록하고
P2는 공유 메모리에 있는 데이터를 가져온다.


[참고1]http://egloos.zum.com/anster/v/2156072

LIST

'학부_대학원 > 운영체제' 카테고리의 다른 글

Interrupt 인터럽트  (0) 2016.10.22
캐시[Cache]란?  (0) 2016.08.10
동기화 vs 비동기화  (0) 2016.08.10
System Bus[버스란?]  (0) 2016.08.08
캐시 쓰기 정책  (0) 2016.08.04