본문 바로가기
운영체제

리눅스 공유 메모리 개념 및 함수 설명

by meanjung 2021. 7. 6.

페이지

리눅스 시스템은 메모리를 가상으로 만들어 관리한다.

리눅스 시스템에서 동작하는 프로그램들은 자신들이 시스템의 모든 메모리를 사용할 수 있다, 혹은 그보다 더 많은 메모리를 사용할 수 있다고 착각한다.

이는 리눅스 시스템이 메모리를 가상화해서 프로그램들에게 보여주기 때문이다.

 

리눅스 시스템은 가상화된 메모리를 "페이지"라는 단위로 쪼개서 관리한다.

특정 크기를 정해서 "페이지" 단위로 나누어 관리하는데, 이렇게 해야지 가상화하기 쉽고 os를 제작하는데 편리하다고 한다.

 

아 리눅스에선 메모리를 가상화하는데 이 가상화된 메모리를 '페이지'단위로 쪼개 관리하는구나...

 

공유 메모리

IPC(inter-process communication)를 시작하는 첫 걸음

프로세스간에 서로 공유하기 위한 메모리

 

* 배경

프로세스는 자신만의 메모리를 필요로 한다. 

하나의 프로세스가 다른 프로세스의 메모리에서 자료를 가져가면 그건 잘못된 것이고, 절대 그렇게 동작하지도 않는다.

그런데 프로세스 사이에 자료를 공유하고 싶을 때는 어떻게 해야할까 ☞ 이때 공유 메모리를 사용한다.

 

* 특징

공유메모리는 최초로 공유 메모리를 만드는 프로세스에 의해서 만들어진다. 이렇게 만들어진 메모리는 커널이 관리해준다.

한 번 만들어진 공유 메모리 공간은 직접 삭제를 하거나 리눅스 시스템이 재부팅을 하거나 해야지만 없어진다. 

모든 프로세스가 더이상 공유 메모리를 사용하지 않는다고 자동 삭제되는 일은 없다.

 

* 명령어

ipcs


ipcs -m (* ftz level 10 참고)

Shared memory segment의 정보를 보여준다

 


공유메모리를 사용하기 위해 필요한 헤더파일

#include<sys/shm.h>

#include<sys/ipc.h>

 

관련 함수

- int shmget(key_t key, size_t, size, int shmflg)

shmget 은 커널에 공유메모리 공간을 요청하기 위해 호출하는 시스템 호출 함수

key 는 바로 위에서 설명했듯이 고유의 공유메모리임을 알려주기 위해서 사용된다

shmget 을 이용해서 새로운 공유메모리 영역을 생성하거나 기존에 만들어져있던 공유메모리 영역을 참조할 수 있다 

key : 여러 개의 공유메모리 중 원하는 공유메모리에 접근하기 위한 Key 값

size : 공유메모리의 최소 크기. 새로운 공유메모리를 생성하고자 한다면 크기를 명시해주어야 한다.  존재하는 메모리를 참조한다면 0으로 명시한다.

shmflg : 생성 및 접근. 성공 -> 양의 정수, 실패 -> -1

key와 리턴값의 차이점
key
- shared memory의 id를 얻어오기 위해 사용할 key
리턴값
- success: shared memory의 id를 return한다.
- fail: -1을 return 하며, errno에 error type을 저장해 준다.

- void* shmat(int smId, const void* shm_addr, int flag)

일단 공유메모리 공간을 생성했으면, 우리는 공유메모리에 접근할수 있는 int 형의 "식별자" 를 얻게 된다. (shmget)

우리는 이 식별자를 shmat 를 이용해서 지금의 프로세스가 공유메모리를 사용가능하도록 "덧붙임" 작업을 해주어야 한다.

smId : 공유메모리 식별자, shmget을 이용해서 얻어낸 식별자 번호

shm_addr : 메모리가 붙을 주소를 명시하기 위해 사용하는데, 0을 사용할경우 커널이 메모리가 붙을 주소를 명시하게 된다. 특별한 사항이 없다면 0을 사용하도록 한다

flag : 우리는 해당 공유메모리에 대한 "읽기전용", "읽기/쓰기가능" 모드로 열수 있는데, SHM_RDONLY를 지정할경우 읽기 전용으로, 아무값도 지정하지 않을경우 "읽기/쓰기 가능" 모드로 열리게 된다.

 

- int shmdt(const void* shm_addr)

프로세스가 작업을 끝내고 더 이상 메모리 공유가 필요 없을 때, 공유메모리와 연결된 프로세스 내부의 가상 메모리 연결을 해제

 


https://linux.systemv.pe.kr/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B3%B5%EC%9C%A0-%EB%A9%94%EB%AA%A8%EB%A6%AC/

 

리눅스 공유 메모리 - Voyager of Linux

리눅스 공유 메모리 는 아주 특별하고 중요합니다. 튜닝하는데 있어서 매우 중요한 요소이기 때문입니다. PostgreSQL 를 세팅할때에도 반드시 해줘야 하는 것이기에 정확하게 무엇인지 짚고 넘어

linux.systemv.pe.kr

https://www.joinc.co.kr/w/Site/system_programing/IPC/SharedMemory

< 이거 진짜 정리 잘되어 있음 >

 

공유 메모리의 사용

#include #include int shmget(key_t key, int size, int shmflg) void *shmat( int shmid, const void *shmaddr, int shmflg ) int shmdt( const void *shmaddr) int shmctl(int shmid, int cmd, struct shmid_ds *buf)

www.joinc.co.kr

 

'운영체제' 카테고리의 다른 글

OverlayFS 개념  (0) 2021.07.24
Samba  (0) 2021.07.11
파일 디스크립터  (0) 2021.07.10
LD_PRELOAD를 이용한 후킹  (0) 2021.07.08
공유 메모리  (0) 2021.07.08

댓글