본문 바로가기

CS/운영체제

메모리

가상 메모리

프로세스는 프로그램을 실행하기 위해 메모리를 사용한다.

그러나 사용되는 프로그램이 많고 모든 프로세스가 메모리에서 동작할 수 없기 때문에 효율적으로 사용하기 위해 프로세스는 가상 메모리를 사용한다.

가상 메모리는 32bit 기준 프로세스 당 4GB가 할당된다.

가상 메모리는 아래와 같은 구조로 구성되어 있다.

 

리눅스에서는 사진 외에도 커널 영역도 할당되어 있지만 중요한 것은 TEXT 영역과 스택 영역, 힙 영역이다.

 

TEXT 영역 : 프로그램의 코드(명령어)가 저장된 영역

  • PC(Procram Counter): CPU 내부에 있는 레지스터로 다음에 실행될 명령어의 주소를 가지고 있다. 이때 명령어의 주소가 TEXT 영역의 주소를 가리킨다.
    • 명령어가 실행될 때 값이 증가한다.

STACK 영역 : 프로그램이 실행되는 과정에서 일시적인 데이터(지역 변수, 매개 변수, 반환 주소 등)를 저장하기 위해 관리되는 영역

  • 함수의 지역변수, 매개변수, 반환 주소 등이 사용하는 선형 메모리 공간
  • 컴파일 타임에 필요한 메모리 공간의 크기가 확인될 수 있으며, 이는 전적으로 지역변수의 수명을 추적할 수 있기 때문에 가능하다.
  • 호출 스택이 무한정 늘어나는 것은 논리적으로 비효율적일 수 있다.
  • 동적 배열 등을 활용하는 경우, 그와 유사한 경우에 대해 Heap의 역할을 일부 대체할 수 있다.
SP(Stack Pointer): 스택의 최상단 주소 값을 저장하는 레지스터
(스택에 pop, push 될 때마다 값이 갱신된다.)

 

HEAP 영역 : 프로그램이 실행되는 과정에서 동적으로 할당된 메모리 영역

  • 사용자에 의해 관리되는 영역으로 malloc()과 free() 로 할당과 해제를 할 수 있다.
  • 사용자에 의해 관리되기 때문에 접근 또한 가능하다.
  • Heap 영역에는 객체에 대한 정보, Array, List 등의 데이터가 저장

메모리 단편화(파편화)

메모리의 공간이 남지만 프로세스를 적재할 수 없는 경우 해당 메모리 영역은 낭비가 된다.

이를 메모리 단편화라고 한다.

 

가상 메모리에서도 마찬가지로 메모리 단편화가 일어난다.

하나의 페이지 당 보통 4KB가 할당된다.

내부 단편화

하나의 메모리를 일정한 크기로 나눠 사용했을 때, 나눠진 메모리 내에서 전부 사용하지 못하고 메모리 공간이 남는 경우

할당 된 메모리를 프로세스가 전부 사용하지 못하는 경우

페이징 기법을 사용했을 때 발생

외부 단편화

메모리를 나누지 않은 상태에서 메모리 중간 중간에 낭비되는 공간이 있는 경우

세그먼테이션 기법을 사용했을 경우 발생

해결 방식

1. 메모리 풀 사용

  • 마치 배열처럼 미리 할당해두고 재사용하는 방식
  • 네트워크 패킷처럼 최대 크기가 이미 정해진 환경에서 매우 유리하다.

2. GC 직접 구현

  • 메모리 재정렬
  • Mark & Compact 알고리즘

3. Best Fit, Worst Fit 전략

  • 가장 적절한 빈 공간을 찾아 할당
    • 단편화를 줄일 수 있지만, 탐색으로 인한 할당 시간이 크게 증가

페이징

프로세스는 자원을 효율적으로 처리하기 페이지로 나뉘어 관리되는데

프로그램 실행에 필요한 페이지만 물리 메모리에 올려 사용하다가 필요 없어지면 다시 가상 메모리에 저장하는 방식으로 자원을 관리하며, 이와 같은 방법을 페이징이라고 한다.

페이지

가상 메모리를 각각의 페이지로 나누는데 Window 기준 한 페이지의 크기는 4KB이다.

프레임

가상 메모리를 나누었을 때 나눈 하나의 단위를 페이지라 한다면, 물리 메모리를 나누었을 때의 하나의 단위를 프레임이라고 한다.

 

  • 가상 메모리의 페이지 번호를 기준으로 페이지 테이블을 확인
  • 페이지 번호를 기준으로 확인한 페이지 테이블에는 프레임 번호가 있다.
  • 해당 프레임 번호로 물리 메모리에 접근

오류

StackOverflow

코딩을 하다 보면 한 번씩 마주치는 오류 중 하나인 Stack Overflow 에러가 있습니다.

  • Stack Overflow: 해당 에러는 과도한 함수 호출로(재귀 함수) 스택 메모리 영역이 꽉 차 더 이상 진행할 수 없는 경우, Stack을 비우기 위해 Stack Overflow 에러를 발생시킵니다.

OutOfMemory

Heap 영역 또한 위와 같은 오류가 발생합니다.

  • Out Of Memory: 과도한 객체 사용 등으로 Heap 메모리 영역이 꽉 차 더 이상 진행 할 수 없는 경우, Out Of Memory 에러를 발생시킵니다.

헷갈리지 말아야 할 부분은 Stack 과 Heap은 같은 메모리를 공유한다는 점입니다.

시작 지점만 다를 뿐 같은 영역을 공유하기 때문에 Stack 영역이 과도하게 많다면 Heap 영역은 그만큼 사용할 수 있는 범위가 줄어듭니다.

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

리눅스 파일시스템  (0) 2025.03.06
스레드  (0) 2025.03.06
운영체제와 프로세스  (0) 2025.03.06