본문 바로가기
OS 운영체제

shared memory (공유 메모리)

by yororing 2024. 8. 15.

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, 접근권한 | 생성방식)
  • shmmat
    • 함수 원형: void *shmat( int shmid, const void *shmaddr, int shmflg
      • 공유 메모리 공간을 생성한 이후, 공유메모리에 접근할 수 있는 int형의 "식별자"를 얻음
      • 공유 메모리를 사용하기 위해 얻은 식별자를 이용하여 현재 프로세스가 공유 메모리에 접근할 수 있도록 연결하는 작업
      • Argument (식별자, 메모리가 붙을 주소 (0을 사용할 경우 커널이 메모리가 붙을 주소를 명시), 읽기/쓰기 모드)
  • 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 를 이용해서 공유 메모리에 붙어있는) 프로세스의 수를 돌려준다.
  • shmctl
    • 함수 원형: int shmctl(int shmid, int cmd, struct shmid_ds *buf)
      • 공유 메모리를 제어하기 위해 사용
      • shmid_ds 구조체를 직접 제어함으로써, 해당 공유 메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유 메모리 삭제, 공유 메모리의 잠금을 설정하거나 헤제하는 작업
      • Option
        • IPC_STAT : 공유 메모리 공간에 관한 정보를 가져오기 위해서 사용됨, 정보는 buf 에 저장됨
        • IPC_SET: 공유 메모리 공간에 대한 사용자권한 변경을 위해서 사용됨. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자 권한을 가지고 있어야 함
        • IPC_RMID : 공유 메모리 공간을 삭제하기 위해서 사용됨. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유 메모리 공간을 사용하는 프로세스가 없을 때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제됨.

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. (1. 정의 및 사용) https://coding-chobo.tistory.com/16
  2. (2. DB Server 정의 및 사용) https://www.ibm.com/docs/en/informix-servers/12.10?topic=memory-shared
  3.  

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

bitmask (비트마스크)  (0) 2024.09.05
failover (자동 전환)  (0) 2024.08.27
오버헤드 (Overhead)  (0) 2024.08.26
알아두면 좋은 운영체계의 용어  (0) 2024.06.01
운영체제 정의, 기능, 종류  (0) 2024.06.01