메모리

Jongwon·2021년 12월 18일
0

Linux Programming

목록 보기
19/25

프로세스에서 사용 가능한 자원 중 가장 기본적인 핵심자원. 할당, 자원, 반납 등의 메모리 자원 기법 설명

프로세스 가상 주소 공간

각 프로세스는 독립적인 크기의 가상 주소를 가짐(32비트CPU는 2^32바이트만큼)
운영체제의 소프트웨어와 CPU내부의 가상메모리 소프트웨어가 구현

페이지

가상 주소 공간의 기본 구성요소로, 물리메모리나 Swap Area에 있다면 유효페이지, 아니면 segmantation fault반환.

페이지 프레임

물리 메모리의 공간으로, 페이지와 대응됨

페이지 테이블

가상 주소 공간의 페이지가 실제 물리적으로 어디에 위치하는지 나타냄. 운영체제가 페이지 테이블을 만들어두면, 컴퓨터시스템이 MMU라는 하드웨어를 통해 메모리에 접근가능함.


메모리 영역

  • U-area: 커널의 code 데이터 저장

메모리 정렬

2^n바이트 타입에 대해 최하위 n개의 비트가 0으로, 메모리 블록의 배수가 되는 메모리 주소에 위치한 변수나 데이터 지칭
32비트 시스템은 8바이트 단위로, 64비트 시스템은 16바이트 단위로 시작주소가 정해짐.
좀 더 큰 메모리 할당을 할 때, calloc이나 malloc은 메모리 정렬을 해주지 않아 posix 함수 만듬.

비표준 타입의 정렬

  • 비표준타입: 구조체, 배열, union

가장 큰 기본타입 구성요소의 타입크기를 따름. 하드웨어에 따라 자연스럽게 정렬된다. 정렬을 맞추기 위해 채워넣기(Padding)이 필요
GCC 컴파일러에서 -Wpadded 옵션으로 패딩 넣기 막을 수 있다.
align이 안된 주소에 대해 casting을 한다면 결과가 이상하게 나온다.



void xmalloc(size_t size)
비표준함수, 내부적으로 메모리 할당받고 에러체크함.
void
xmalloc0(size_t size)
xmalloc에서 0으로 초기화하는 기능 추가

<stdlib.h> 헤더

  • void *malloc(size_t size)
    캐스팅할 필요가 없다. 오히려 캐스팅 시 버그를 감출수도
  • void *calloc(size_t nr, size_t size)
    크기가 size인 nr개의 objects들만큼 메모리 배정하고 0으로 초기화
  • void realloc(void ptr, size_t size)
    size가 기존보다 크다면 높은 확률로 복사하여 다른 공간에서 다시 할당해야하므로 주소가 변경됨
  • void free(void *ptr)
    NULL 검사할 필요 없다.
C에서 메모리 반납은 필수, 반납을 안하면 메모리 누수현상 발생.
누수 방지를 위해 메모리 할당 시 반납 지점도 고려해야함

객체지향 언어에선 garbage collection으로 반납안해도 미사용 메모리를 반납시킴.
  • int posix_memalign(void **memptr, size_t alignment, size_t size)
memptr: 할당된 메모리의 시작주소
alignment: 정렬할 메모리 크기(alignment의 배수로 시작주소가 할당됨)
size: 할당할 메모리 크기

<sys/mman.h> 헤더

  • void mmap(void start, size_t length, int prot, int flags, int fd, off_t offset)
    anonymous mapping, fd로 지정한 파일에서 offset을 기준으로 length만큼을 가상메모리에 매핑시킴.
  • int munmap(void *start, size_t length)
  • int mlock(const void *addr, size_t len)
    특정 주소공간은 swap area에 저장하지 않고, 메모리에 유지시켜달라.
  • int mlockall(int flags)
    모든 주소공간을 메모리로 올려라. overhead 크지만, 빠른 응답 필요할 때 씀
  • int munlock(const void *addr, size_t len)
  • int munlockall(void)
  • int mincore(void start, size_t length, unsigned char vec)
    `vec라는 page가 RAM에 있는지 Swap Area에 있는지 확인

<alloca.h> 헤더

  • void *alloca(size_t size)
    stack에서 메모리 할당(지역변수와 같은 느낌), 함수가 끝나면 메모리를 반납

<string.h> 헤더

  • char strdupa(const char s)
    stack에 메모리 할당하고, s를 복사해라.
  • char strndupa(const char s, size_t n)
    stack에 최대 n만큼 메모리를 할당하라.
  • void memset(void s, int c, size_t n)
    메모리를 c값으로 초기화
  • void memcmp(const void s1, const void *s2, size_t n)
    두 메모리 s1, s2를 비교
  • void memmove(void dst, const void *src, size_t n)
    src에서 dst에서 메모리를 이동
  • void memcpy(void dst, const void *src, size_t n)
    src에서 dst로 메모리 복사
  • void memchr(const void s, int c, size_t n)
    특정 문자 c가 있는지 확인
  • void memmem(const void haystack, size_t haystacklen, const void *needle, size_t needlelen)
    haystacklen만큼 크기의 haystack에서 needlelen크기의 needle 부분 메모리블록이 있는 지 확인
profile
Backend Engineer

0개의 댓글