-
level10war game Write up/ FTZ 2018. 10. 9. 17:40
음,, 이 문제를 접하면서 공유 메모리라는 것을 공부하게 되었다.
공유 메모리 즉 shared memory 는 컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리
과다한 복사를 피하거나 해당 프로그램 간 통신을 위해 고안됨
환경에 따라 프로그램은 하나의 프로세서에서 여러 개의 프로세서에서 실행 가능함.
공유 메모리 즉 shared memory 는 여러 IPC 중에서 가장 빠른 수행 속도를 보여준다고 한다.
IPC 란 Inter-Process Communication 의 약자로 프로세스 간 통신이라고 하며 프로세스들 사이에 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
CPU1 CPU2 CPU3 I/O
↓ ↓ ↓ ↙
System Bus or crossbar switch
↓ ↓
MEMORY
--> (3개의 프로세서의 공유 메모리 시스템 그림)
먼저 문제의 힌트는 다음과 같다.
key_t = 7530
대화방은 공유 메모리를 이용해서 만들어짐.
<sys/ipc.h> http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysipc.h.html
<sys/shm.c> http://pubs.opengroup.org/onlinepubs/009695299/basedefs/sys/shm.h.html
https://www.joinc.co.kr/w/man/2/shmget
를 참고하길 바란다.
간단하게 코드를 분석해보자면 int shmid=shmget(key_t key, size_t size, int shmflg);
즉 메모리 영역을 할당한다는 의미이다.
IPC_CREAT 는 새로운 영역을 할당하는 의미로 만약 이 값이 사용이 안되면 shmget()은 key로 이미 생성된 접근 가능한 공유 메모리 영역이 있는지 확인하고 이에 대한 식별자를 리턴할 것이다.
long shared_memor=shmat(int shmid, const void *shmaddr, int shmflg);
즉 공유 메모리 관련 연산을 한다는 의미이다.
shmat()는 공유메로리 식별자인 shmid에 공유 메모리 세그먼트를 붙이기 위해 사용한다. 붙이는 영역은 shmaddr로 결정
SHM_RDONLY가 만약 shmflg에 지정 되었다면 세그먼트는 읽기 전용이 되며 공유메모리 영역에 접근하고자 하는 프로세스는 읽기 전용허가 접근권을 가져야 한다.
반환값으론 성공하면 attach된 shared memory segment를 반환하고 실패하면 -1을 반환한다.
아래는 성공한 attach 된 shared memory segment를 반환 한 값이다.