본문 바로가기

CS

운영체제의 메모리 관리

운영체제의 종류에는 대표적으로 Windows, Linux, MaxOS 가 있습니다.

그 외에도 많이 있지만 자주 사용되는 OS는 위와 같습니다.

그렇다면 OS는 무엇이고 어떤 일을 하는 녀석일까요?

 

우선 컴퓨터 시스템은 하드웨어와 소프트웨어로 구성되어 있습니다.

소프트웨어는 하드웨어에 의해 실행되는데 하드웨어에는 CPU와 메모리, 다양한 입출력 장치로 구성되어 있습니다.

운영체제가 없어도 하드웨어가 동작하긴 하지만 소프트웨어인 프로그램이 운영체제 환경에서 작성되고, 실행되고 있습니다.

운영체제의 주 목적은 컴퓨터 시스템의 자원들을 효율적으로 관리하고 사용자에게 서비스를 제공하는 것입니다.

운영체제가 관리하는 자원에는 물리적 자원추상적인 자원이 있습니다.

  • 물리적 자원: CPU, 메모리 등과 같은 하드웨어
  • 추상적 자원: 프로세스와 가상 메모리, 파일 등으로 운영체제에 의해 생성되고 관리된다.

프로세스란?

프로세스는 “실행 중인 프로그램”을 의미한다.

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

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

가상 메모리는 프로세스 당 4GB가 할당되며, 프로세스는 자원을 효율적으로 처리하기 페이지로 나뉘어 관리되는데

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


가상 메모리

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

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

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

 

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

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

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

  • SP(Stack Pointer): 스택의 최상단 주소 값을 저장하는 레지스터
    • 스택에 pop, push 될 때마다 값이 갱신된다.

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

  • 사용자에 의해 관리되는 영역으로 malloc()과 free() 로 할당과 해제를 할 수 있다.
  • 사용자에 의해 관리되기 때문에 접근 또한 가능하다.

JVM에서의 메모리 관리

 

JVM에서는 공통적으로 Heap 영역과 Stack 영역이 존재한다.

차이점은 TEXT 영역이 아닌 코드 영역 또는 정적 영역이라 부르는 영역이 존재한다.

 

편의성을 위해 코드 영역으로 설명하겠습니다.

  • Stack 영역
    • 프로그램이 실행되면서 호출 된 데이터와 객체를 일시적으로 저장하는 메모리 영역입니다.
    • 스택 영역에도 데이터가 저장 됩니다. (Primitive Type)
    • Primitive Type
      • Int , double , byte , long , boolean 등
  • Heap 영역
    • Stack과 마찬가지로 호출 된 데이터를 저장하는 메모리 영역입니다.
    • 다만 차이점은 사용자가 직접 할당하고 접근할 수 있다는 것입니다.
    • Heap 영역에는 객체에 대한 정보, Array, List 등의 데이터가 저장됩니다.
    • 데이터의 정보가 없더라도 사용자가 메모리를 할당하여 사용할 수도 있습니다.
  • Code 영역
    • Java에는 Class가 있습니다. Class가 로딩 될 때 해당 영역이 생성됩니다.
    • Class와 Interface에 대한 메서드, 생성자, 상수 등을 저장합니다.
    • 특징은 프로그램과 생명 주기를 함께합니다. 프로그램의 시작부터 종료까지 데이터가 살아있습니다.

오류

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

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

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

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

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

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

'CS' 카테고리의 다른 글

함수형 프로그래밍  (0) 2024.08.13
[Java] 객체 지향  (0) 2024.01.24