블로그 이미지
지누구루

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2013. 12. 3. 13:45 공부

여러 서버에서 공통으로 사용하는 스크립트 데이터를.

하나의 프로세스에서 읽어두고, 다른 프로세스들은 이미 저장된 스크립트 정보를 읽어가면 좋지 않을까 싶어서 알아 본내용(사실 개발존에서는 여러 서버를 한 머신에서 띄우기 때문에, 같은 동작을 좀 줄여줄수 있으면 개발할때 편하지 않을까 해서...)

윈도우 Named Shared Memory

 

참고한 페이지

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
http://ezbeat.tistory.com/457
http://blog.naver.com/PostView.nhn?blogId=marindie&logNo=144944471

개념.

다른 프로세스에서 공동으로 접근이 가능한 메모리 공간에 String 을 key로 하는 메모리 공간을 만들어서 값을 쓰고, 읽고, 할수 있는 Window API

 

함수.

[1] CreateFileMapping
설명 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

공유 메모리 공간을 만드는 함수. 어떤 크기로 어떤 “String”에 연결해서 만들지를 넘겨주면, 공유 메모리를 할당하고 그 Handle을 돌려준다. Handle이 Null 일 경우 실패. 자세한 내용은 설명 페이지 참조


[2] OpenFileMapping
설명 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa366791(v=vs.85).aspx

공유 메모리 공간에서 특정 “String”을 key로 저장되어 있는 메모리가 있는지 찾아서, 있으면 해당 공유 메모리의 Handle을 돌려준다. 없으면 Null. 자세한 설명은 페이지 참조


[3] MapViewOfFile
설명 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx

특정 공유 메모리 Handle에서 메모리 공간에 접근할수 있는 포인터를 돌려준다.

 

사용법.

저장하고자 하는 내용을 특정 String을 key로 CreateFileMapping 을 이용해서 공유 메모리 공간을 만들고, 만든 공간을 MapViewOfFile로 위치를 받아서 접근해서 데이터를 저장(or copy) 한다.

사용하는 쪽에서는 OpenFileMapping을 이용하여 특정 String을 Key로 공유 메모리 Handle을 얻은 다음, MapViewOfFile로 메모리 공간을 접근하여 데이터를 사용한다.

 

주의할 점.

예제를 보면 Shared Memory에 값을 올리고, getCh()로 일부러 저장하는쪽의 프로세스를 죽이지 않고 끝내고 싶을때 키 입력으로 프로세스를 내리게 되어 있다.

그래서 프로세스가 떠 있는 동안에는 동작하지만, 프로세스가 내려가면서 unmap이나 핸들을 close 하고 나면 다시 초기화 된다.

 

고민되는 점.

만약 Named Shared Memory에 데이터를 잔뜩 넣고 Handle을 close 하지 않은채 프로세스가 죽어버리면 어떻게 되나? (아마 handle 계열은 프로세스 정리할때 잘 되었던거 같기도 함). 그렇다면 만약 여러 프로세스가 접근중인 메모리를 할당했던 프로세스가 죽어버리면, 다른 프로세스는 다시 그 데이터에 접근할 수 없는가? 테스트 필요함.

=> 간단히 테스트해본 결과 역시 Handle을 Create한 프로세스가 죽으면 공유 메모리 데이터도 다 날아가네용(Handle이 해제되서 그런거 같습니당) ㅠㅠ 주의 주의

 

posted by 지누구루