공유메모리 속도에 대해서..
글쓴이: moonzoo / 작성시간: 화, 2006/02/28 - 10:01오후
공유메모리는 빠른 속도를 보여준다는 글을
읽었습니다.
FILE IO와 공유메모리 사용간에,
얼마나 속도차이가 있는가에
대해 아시는 분 있나요?
공유메모리도 결국 DISK에 저장되어서 DISK IO가 일어나지
않나요? 그렇다면 일반 FILE IO (read,write..)와
크게 속도차이가 나지 않을것 같다는 생각이 듭니다.
(system call이 있지만..disk io보단 상대적으로 적은 비용이라
고 생각해서요)
이에 대한 의견 부탁드립니다.
Forums:
ipc shared memory 말인가여?ipc message q
ipc shared memory 말인가여?
ipc message queue라면 몰라도,
그냥 메모리만 쓰는데..
[quote="Anonymous"]ipc shared memory 말인가
Linux의 경우로 예를 들어 설명해드리죠. Shared Memory는 kernel space에서 할당이 됩니다. Kernel memory space는 모든 프로세스의 virtual memory space에서 동일하게 map되기 때문에 공유하기가 좋죠. 각 프로세스는 이 할당된 부분을 local virtual memory space에 map해서 사용합니다. Linux의 경우에는 kernel이 page out되지 않고 항상 메모리에 있기 때문에, shared memory는 항상 메모리에 존재하게 됩니다. 또한 다른 IPC와 달리 system call을 통해 읽고 쓰는 것이 아니라 포인터로 직접 메모리에 쓰기 때문에, 오버헤드가 최소가 됩니다. 다만, concurrency control, synchronization, over/underflow에 대해서는 사용자가 관리해줘야 합니다.
원글님이 아마도 memory mapped i/o와 혼동을 하신 것 같습니다.
IPC들(FIFO, Message Queue, PIPE, Socket,
IPC들(FIFO, Message Queue, PIPE, Socket, Semaphore, 파일 등)은 커널을 경유하여 이뤄집니다. 커널을 경유하는 이유는 동기화 때문입니다.
즉, A - kernel(커널) - B
그러나, 공유메모리는 커널을 경유하지 않고, 프로세스간에 직접 데이터를 주고 받을 수 있습니다.
A-B
그러므로, 당연히 다른 IPC메카니즘에 비해 공유메모리를 사용하면 성능에서 많은 이점을 가질 수 있습니다. (제가 해본 테스트로는 공유메모리가, 유닉스도메인 소켓에 비해 약 1.5배 나은 전송 성능을 제공했습니다)
그러나, 커널이 제공하는 동기화 메카니즘을 당연히 가질 수 없으므로, 동기화는 사용자가 어떤 방법을(커널의 세마포, 사용자수준의 세마포등 사용) 사용하여 수행해야 합니다. 보통 데이터경로는 공유메모리, 제어경로는 다른 IPC를 사용하는 형태로 많이 사용됩니다.
공유메모리는 커널에 의해 관리되지만(생성,최초접근 즉 attach 및 detach ),커널영역에 만들어 지는것은 아닙니다.(만일 그러하다면, 커널영역의 메모리에 사용자프로세스가 임의접근가능하다는 얘기가 되므로 절대 아닙니다.)
공유메모리도 swap됩니다. 단, 옵션을 주어 swap되지 않게 할 수 있습니다.(만일 swap되지 않으면, 임의의 사용자 프로세스가 공유메모리를 아주 크게 잡으면, 시스템이 사망에 이르게 되겠지요.)
공유메모리에도 접근권한이 있습니다. 이를 이용하여 특정 권한을 가진 프로세스만이 접근하게 할 수 있습니다.
댓글 달기