malloc lab-핵심 주제 정리

developer_jennifer·2023년 5월 12일
0

크래프톤 정글

목록 보기
8/29

시스템 콜

운영체제는 유저모드와 사용자 모드로 나누어서 구동된다.

유저모드는 pc register가 사용자 프로그램이 올라가 있는 메모리 위치를 가리키고 있을 때 현재 사용자 프로그램을 수행중이라고 하며 CPU가 유저모드에서 수행중이라고 말한다.

커널모드는 pc register가 운영체제가 존재하는 부분을 가리키고 있다면 현재 운영체제의 코드를 수해중이라고 하며 CPU가 커널모드에서 수행중이라고 말한다.

시스템 콜은 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스 이다.
즉, 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 한다.

시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 핸들러 함수 주소로 구성되는 시스템 콜 테이블을 유지한다.

시스템 콜이 호출되면 프로그램은 유저모드에서 커널모드로 전환(Context Switching)되고 명령 수행이 끝나면 다시 유저모드로 복귀(Context Swiching)한다.

  • 시스템 콜 예시


in.txt에 있는 파일 내용과 같은 내용을 복사하여 out.txt 파일을 만드는 것

  • 시스템 콜이 필요한 이유
    우리가 일반적으로 사용하는 프로그램은 '응용프로그램'이다. 유저 모드에서는 많은 기능을 구현하기 힘들기 때문에 반드시 커널의 도움을 받아야 한다. 이 작업은 응용프로그램으로 대표되는 유저 프로세스에서 유저모드에서는 수행할 수 없다. 따라서 커널에 관련된 것은 커널 모드로 전환한 후에야 작업을 수행할 권한이 생기게 된다.

  • 권한이 필요한 이유
    권한이 없다면, 해커가 악의적으로 시스템 콜을 사용하는 경우나 초보 사용자가 하드웨어 명령어를 잘 몰라서 함수를 호출했을 떄 시스템 전체를 망가뜨릴 수 있기 떄문이다.

데이터 세그먼트

데이터 세그먼트란 전역 변수(global)과 정적변수(static)이 저장되는 메모리 공간이다. 특히 초기값이 있는 전역변수, 배열, static으로 선언된 변수가 들어간다. 이 공간은 추후 일정 메모리 접근 공간으로 사용가능하다. 즉 프로그램 런타임에 자유롭게 수정 및 변경이 가능하다.

  • c언어의 메모리 구조

메모리 단편화

메모리 단편화란 RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태

  • 메모리 단편화로 일어날 수 있는 현상들
    • 총 메모리 공간은 충분하지만 실제 사용이 불가능 할 수 있다.
    • 실제 사용 가느안 공간이 줄어들어 시스템 성능 저하를 일으킬 수 있다.

메모리 단편화는 2가지 경우로 구분 가능하다.

  • 내부 단편화(Internal Fragmentation)

    메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간이 낭비되는 상황이다.
    그림처럼 os가 10kb를 할당하고 7kb만 사용하고 있을 때 필요 이상으로 프로세스가 메모리를 할당받아서 내부단편화 3kb가 발생한다.

  • 외부 단편화(External Fragmentation)

메모리가 할당 및 해제 작업의 반복으로 작은 메모리가 중간중간 존재하게 된다. 이때 중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당이 불가한 상황이다.
남은 공간은 12kb이나 프로세스를 분할하여 넣을 수 없으므로 할당할 수 없다.

  • 해결 방법
    -압축, 통합, 페이징, 세그먼테이션의 방식이 있다.

외부 단편화 해결

1. 압축 기법(compaction)

  • 메모리 공간을 재배치하여 단편화로 인해 분산되어 있는 메모리 공간들을 하나로 합치는 기법

2. 통합 기법(Coalescing)

  • 단편화로 인해 분산된 메모리 공간들을 _인접한_ 것끼리 통합시켜 큰 메모리 공간으로 합치는 기법
  • 압축과 다른 점은 통합은 인접 공간에서 통합된다는 것이다.

3. 페이징 기법(가상 메모리 사용)

sbrk/mmap

동적 메모리 할당기 - malloc은 mmap과 munmap 함수를 사용해 힙 메모리를 할당하거나 반환 또는 sbrk 함수를 사용한다.

brk()-sbrk() : 데이터 세그먼트의 영역을 넓혀준다.(세그먼트의 끝을 연장)

brk() : 시스템에 메모리가 충분할 때 데이터 세그먼트의 끝을 brk의 인자인 addr에서 지정한 값으로 설정

sbrk() : space brake 함수 - 힙의 크기를 늘리거나 줄이는 함수이다.

#include <unistd.h>

void* sbrk(intput_t incr);

성공 시 이전의 brk 값 리턴
실패 시 -1 리턴 밑 erno = ENOMEM으로 설정
incr가 0이면 현재의 bkr의 값을 리턴

mmap() : 커널에 새 가상 메모리 영역을 생성해줄 것을 요청하는 함수이다.

#include <unistd.h>
#include <sys/mman.h>

void* mmap(void* start, size_t length, int prot, int flags,
					int fd, off_t offset);


ref) 시스템 콜
데이터 세그먼트
메모리 단편화
brk/mnap

profile
블로그 이전합니다 -> https://heekyoung2000.tistory.com/

0개의 댓글

관련 채용 정보