시스템 프로그래밍[4-10]

Turtle·2024년 5월 12일
0
post-thumbnail

❓메모리 구성

❓각 영역의 특징과 영역별 저장되는 데이터의 유형

코드 영역

  • 실행할 프로그램의 코드가 저장되는 메모리 공간
  • CPU는 코드 영역에 저장된 명령문을 하나씩 가져다가 실행

데이터 영역

  • 전역변수와 static 변수가 할당되는 영역
  • 프로그램 시작과 동시에 할당되어 종료 시까지 남아있는 특징의 변수(Ex. 전역변수)가 저장되는 영역

힙 영역

  • 프로그래머가 원하는 시점에 메모리 공간에 할당 및 소멸을 하기 위한 영역

스택 영역

  • 지역변수와 매개변수가 할당되는 영역
  • 함수가 종료되면 자동으로 소멸되어 사용할 수 없는 변수들의 모임

❓malloc() 함수

malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있도록 해준다.

#include <stdlib.h>
void *malloc(size_t size);  

malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다.

이 함수는 전달받은 메모리 크기에 맞고 아직 할당되지 않은 적당한 블록을 찾는다.
이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다.

만약 힙 영역에 할당할 수 있는 크기의 적당한 블록이 없다면 Null 포인터를 반환한다.
주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터 형식의 변수를 사용해야 한다.

이와 같이 동적 메모리 할당을 해야 하는 이유는 필요할 때 필요한 만큼만 메모리를 요청해서 사용하고 메모리를 절약하기 위해서이다.

❓calloc() 함수

calloc() 함수는 malloc() 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수이다. malloc() 함수와 다른 점은 할당하고자 하는 메모리의 크기를 두 개의 인수로 나누어 전달받는다는 것이다.

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);

calloc() 함수의 첫 번째 인수는 메모리 블록의 개수를 나타내며, 두 번째 인수는 각 블록 당 할당될 바이트 수를 나타낸다.

❓free() 함수

C에서는 free() 함수를 통해 힙 영역에 할당받은 메모리 공간을 다시 운영체제에게 반환해주어야 한다. 메모리 관리가 자동으로 이루어지지 않기 때문에 해당 함수를 사용하는 것이다.
free() 함수를 사용하여 다 사용한 메모리를 해제해주지 않으면, 메모리가 부족해지는 현상이 발생한다. 이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(Memory Leak)라고 한다.

#include <stdlib.h>
void free(void *ptr);

free() 함수의 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달하면 된다.

❓공유 메모리 생성 함수 : shmget()

공유 메모리란 프로세스 사이에 메모리 영역을 공유해서 사용할 수 있도록 하는 메모리를 말한다.

#include <sys/shm.h>
#include <sys/ipc.h>
int shmget(key_t key, size_t size, int shmflg);

key_t_key : 공유 메모리를 구별하는 key값
int size : 공유 메모리 크기
int shmflg : 여러가지 옵션을 추가

❓공유 메모리 연결 함수 : shmat()


#include <sys/shm.h>
#include <sys/ipc.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);

int shmid : shmget() 함수에 의해 반환된 int형의 식별자
const void *shmaddr : 일반적으로 Null 지정. 커널에 매핑되지 않은 곳을 자동으로 찾아서 붙여준다.
int shmflg : 여러가지 옵션을 추가

❓공유 메모리 연결 해제 함수 : shmdt()

프로세스에서 공유 메모리를 분리한다.

#include <sys/shm.h>
#include <sys/ipc.h>
int shmdt(const void *shmaddr);

const void *shmaddr : 분리할 공유 메모리 주소

❓공유 메모리 제어 함수 : shmctl()

공유 메모리를 int형 타입의 cmd 명령어에 따라 제어한다.

#include <sys/shm.h>
#include <sys/ipc.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

int shmid : 공유 메모리를 구별하는 식별자
int cmd : 여러가지 제어명령

❓메모리 초기화 함수 : memset()

메모리 영역을 초기화하는 함수이다.

#include <string.h>
void *memset(void *s, int c, size_t n)

s : 메모리 영역에 대한 포인터
c : 초기화 값
n : 초기화되기 원하는 크기

❓메모리 관리 함수

memset, memcpy, memmove, memchr, memcmp

0개의 댓글