00 개요
- 운영체제에서의 공유 메모리에 대한 정리
01 shared memory (공유 메모리)란
1. 정의 및 사용
- 공유 메모리는 IPC(Inter-Process Communication)의 한 가지 방법으로 프로세스간 통신이 필요할 경우 사용
- 공유 메모리를 통한 통신은 둘 이상의 프로세스가 공통 메모리에 액세스 할 수 있는 개념으로 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근 가능
- 공유 메모리의 생성 요청은 최초 공유 메모리 영역을 만드는 프로세스가 커널에 공유 메모리 공간의 할당을 요청함으로써 이루어지며 만들어진 공유 메모리는 커널에 의해서 관리됨
- 만들어진 공유 메모리는 시스템을 리부팅하거나 직접 공유 메모리의 공간을 삭제시키지 않는 한, 공유 메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도 공유 메모리의 공간은 계속적으로 유지됨
- 프로세스가 커널에게 공유 메모리 공간을 요청하게 되면, 커널은 공유 메모리 공간을 할당시켜주고 공유 메모리 공간을 관리하기 위해 내부 자료구조를 사용
- 공유 메모리 정보들은 shmid_ds라는 구조체에 의해 관리되며 shm.h에 정의되어 있음
- 공유 메모리를 사용하지 위해서는 아래의 헤더파일을 include 해줘야됨
#include <sys/types.h>
#include <sys/shm.h>
- shmget
- 함수 원형: int shmget(key_t key, int size, int shmflg)
- 커널에 공유 메모리 공간을 요청하기 위해 사용하는 시스템 호출 함수
- KEY값은 고유의 공유 메모리임을 나타냄
- Argument (KEY, MEMORY_MAX_SIZE, 접근권한 | 생성방식)
- 함수 원형: int shmget(key_t key, int size, int shmflg)
- shmmat
- 함수 원형: void *shmat( int shmid, const void *shmaddr, int shmflg
- 공유 메모리 공간을 생성한 이후, 공유메모리에 접근할 수 있는 int형의 "식별자"를 얻음
- 공유 메모리를 사용하기 위해 얻은 식별자를 이용하여 현재 프로세스가 공유 메모리에 접근할 수 있도록 연결하는 작업
- Argument (식별자, 메모리가 붙을 주소 (0을 사용할 경우 커널이 메모리가 붙을 주소를 명시), 읽기/쓰기 모드)
- 함수 원형: void *shmat( int shmid, const void *shmaddr, int shmflg
- shmdt
- 함수 원형: int shmdt( const void *shmaddr)
- 프로세스가 더이상 공유 메모리를 사용하지 않을 경우 프로세스와 공유 메모리를 분리시키는 작업
- 해당 시스템 호출 함수는 현재 프로세스와 공유 메모리를 분리시킬 뿐, 공유 메모리의 공간을 삭제하지 않음
- shmdt 가 성공적으로 수행되면 커널은 shmid_ds 의 내용을 갱신, 즉 shm_dtime, shm_lpid, shm_nattch 등의 내용을 갱신 하는데, shm_dtime 는 가장 최근에 dettach (즉 shmdt 를 사용한)된 시간, shm_lpid 는 호출한 프로세세의 PID, shm_nattch 는 현재 공유 메모리를 사용하는 (shmat 를 이용해서 공유 메모리에 붙어있는) 프로세스의 수를 돌려준다.
- 함수 원형: int shmdt( const void *shmaddr)
- shmctl
- 함수 원형: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
- 공유 메모리를 제어하기 위해 사용
- shmid_ds 구조체를 직접 제어함으로써, 해당 공유 메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유 메모리 삭제, 공유 메모리의 잠금을 설정하거나 헤제하는 작업
- Option
- IPC_STAT : 공유 메모리 공간에 관한 정보를 가져오기 위해서 사용됨, 정보는 buf 에 저장됨
- IPC_SET: 공유 메모리 공간에 대한 사용자권한 변경을 위해서 사용됨. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자 권한을 가지고 있어야 함
- IPC_RMID : 공유 메모리 공간을 삭제하기 위해서 사용됨. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유 메모리 공간을 사용하는 프로세스가 없을 때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제됨.
- 함수 원형: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
2. (DB server) 정의 및 사용
1) 정의
- Shared memory is an OS feature that allows the DB server threads and processes to share data by sharing access to pools of memory
2) 사용
- DB server가 공유 메모리를 사용하는 목적:
- to reduce memory usage and disk I/O
- to perform high-speed communication b/w processes
- shared memory enables the DB server to reduce overall memory usage b/c the participating processes (e.g., virtual processors) do not require maintaining private copies of the data that is in shared memory
- shared memory reduces disk I/O, b/c buffers (i.e., managed as a common pool) are flushed on a DB server-wide basis instead of a per-process basis
- Furthermore, a virtual processor can often avoid reading data from disk b/c the data is already in shared memory as a result of an earlier read operation
- the reduction in disk I/O reduces execution time
- shared memory provides the fastest method of interprocess communication, b/c it processes read and write messages at the speed of memory transfers
참조
- (1. 정의 및 사용) https://coding-chobo.tistory.com/16
- (2. DB Server 정의 및 사용) https://www.ibm.com/docs/en/informix-servers/12.10?topic=memory-shared
'OS 운영체제' 카테고리의 다른 글
bitmask (비트마스크) (0) | 2024.09.05 |
---|---|
failover (자동 전환) (0) | 2024.08.27 |
오버헤드 (Overhead) (0) | 2024.08.26 |
알아두면 좋은 운영체계의 용어 (0) | 2024.06.01 |
운영체제 정의, 기능, 종류 (0) | 2024.06.01 |