공유메모리 관련
공유메모리에 있어 전통적인(구식의?) System V 방식의 api 인 shmget 이 있고.
POSIX 방식인 shm_open 이 있는데요.
지금 shm_open를 사용할려고 하는 가장 큰 이점중에 하나가 fcntl 로 락킹을 사용할 수 있기 때문에 SEM_UNDO 속성을 가진 세마포어나
PTHREAD_MUTEX_RECURSIVE 속성을 가진 뮤텍스등 별도 락을 사용하지 않고도 두가지 효과를 다 거둘수 있기 때문입니다.
shm_open 을 사용했을때 리눅스에서는 /dev/shm 아래에 특수한 파일형태로 존재하지만..
HP-UX 에서는 (freebsd 도 그런가보더군요) 일반 파일로 만들어지더군요.
물론, mmap 로 메모리 맵핑하여 쓰기는 하지만..
일반파일로 만들어지는 HP-UX 같은데서 mmap 로 맵핑해서 공유메모리를 사용할때
리눅스의 그것 (/dev/shm/xxx) 또는, shmget 으로 생성했을때와 성능상의 차이가 많이 날련지요?
또는, 주의해야할 다른 어떤 부분들이 있는지요? 동기화같은?
PS.
msync 가 있긴 한데 테스트를 해보니 shm_open 한것을 mmap로 해서 쓸때는 msync 하지 않아도 바로 동기화가 되는것 같은데..
프로세스간에 공유메모리 사용을 목적으로 한다면 반드시 mmap로 맵핑된 메모리에 변경을 가할때마다 msync를 호출해줘야 하는걸까요?
HP-UX같이 일반 파일이 생성되는 경우엔 꼭 해줘야 할것 같은 생각은 드는군요..
FreeBSD에서 shm_open은
FreeBSD에서 shm_open은 그냥 open이며, 리눅스에서 /dev/shm과 성능차이는 매우 크게 납니다.
HP-UX는 안 써봐서 패스.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
댓글 달기