프로세스 메모리

프로세스에 할당되는 메모리 영역

프로세스가 시스템으로부터 할당받은 메모리의 구조는 다음과 같다.

코드(code)

프로그램의 시작부터 종료까지 메모리가 계속 존재함.

사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간

컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 되어있다.(변경하면, 오류 발생함)

코드 자체를 구성하는 메모리 영역으로 Hex파일이나 Bin파일 메모리임

데이터(data)

프로그램 시작과 동시에 할당되며, 종료 시 소멸됨.

전역 변수, 정적변수, 배열, 구조체 저장함

BSS 영역 + Data(GVAR) 영역

BSS 영역 - 초기화되지 않은 데이터

Data(GVAR) - 초기화된 데이터

Why?

  • 초기화된 데이터는 초기 값을 저장해야되서 Data 영역의 Rom에 저장됨
    초기화되지 않은 데이터는 Ram에 저장됨.(Rom에 그것까지 저장하면 사이즈가 너무 커져야됨)

스택(stack)

함수 호출시 할당되고, 호출 완료 후에는 소멸됨

함수 호출과 관계되는 지역,매개 변수 저장

LIFO(Last In First Out) 구조

Compiletime의 크기 결정

힙(heap)

프로그래머에 의해 동적으로 메모리가 할당, 해제 됨

C에서는 malloc() calloc() 등의 함수로 메모리 크기 할당가능.

stack은 heap과 같은 공간을 공유한다. heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당된다. 그래서 각 영역이 상대 공간을 침범하는 stack overflow heap overflow 가 발생하게된다.

FIFO(First In FIrst Out)구조

프로세스 메모리 구조

CPU와 가장 가까운 공간부터 말하자면,

레지스터 → CPU 캐시 → 메인메모리 → 보조기억장치 → 외부기억자치

  • cpu로부터 멀어질수록
    데이터 저장 용량이 커지고,
    접근 속도는 느려짐.

메모리 분할

메모리 관리의 주된 작업은 처리기에 의해 실행될 프로세스를 주기억장치로 가져오는 것인데, 이 메모리를 관리하기 위한 기법들 중 ‘분할’이 있다.

고정 분할

고정된 경계를 가지는 메모리 영역으로 구분하는 것.

균등 분할

각 분할이 모두 같은 크기를 가지도록 하는 기법

한 프로세스의 크기가 분할의 크기보다 작거나 같으면, 사용 가느한 파티션 중 하나에 적재가 된다.
모든 파티션이 사용 중이며, 준비 또는 실행 상태의 프로세스가 없다면 운영체제는 어느 한 파티션의 프로세스를 스왑아웃 시키고, 다른 프로세스를 적재하여 프로세서가 쉬지 않도록 한다.

문제점

  • 프로그램이 파티션보다 클때,
    • 오버레이를 사용하는 프로그램을 설계하여, 어느 순간에는 프로그램의 필요한 부분만 주기억장치에 있도록 해야한다.
  • 적재되는 데이터가 파티션보다 작을때,
    • 파티션 내부 공간의 낭비가 발생→ 내부 단편화 발생

동적 분할

  • 파티션의 크기와 개수가 가변적이어서 정확히 요구된 크기 만큼의 메모리만 할당받음.
  • 크기가 6M인 프로세스를 배치할 공간이 없으므로, 4M짜리 구멍이 남게되고, 기존 공간중 프로세스2를 스왑아웃하여 메모리를 확보한다. 이때, 프로세스2보다 프로세스 4가 더 작기때문에, 또다른 구멍이 생기게되는 문제가 생긴다.

  • 이런식으로 주기억장치에 작은 ‘구멍’들이 만들어진다. 시간이 지날수록 메모리 단편화가 점점 심해지며, 메모리 이용률또한 감소한다.
    메모리가 점차 사용할 수 없는 조각으로 변하는 현상을 외부 단편화 라고 한다.

외부 단편화의 해결 방법 → 메모리 집약

  • 각 파티션이 연속적이게 되도록 인접하게 만들어 메모리의 모든 빈 공간이 하나의 블록이 되도록 하는 방법.
  • 시간이 많이 걸리며, 처리기 시간을 낭비한다는 단점이 있다.
  • 동적 재배치 기능이 필요하다. 즉, 프로그램의 메모리 참조가 아무런 영향을 받지 않고 프로그램을 주기억장치 내에서 이동시킬 수 있어야 한다.

페이징

주기억장치를 비교적 작은 고정 사이즈 파티션으로 나눈다고 하자. 페이지라 불리는 이 프로세스 조각은 프레임 또는 페이지 프레임이라고 알려진 빈 메모리의 조각에 저장될 수 있다.

페이지 : 고정사이즈의 가장 메모리 내 프로세스 조각

프레임 : 페이지 크기와 같은 주 기억장치의 메모리 조각

  • 외부 단편화로 인한 메모리 낭비가 없다.
  • 내부 단편화로 인한 낭비가 존재하지만, 각 프로세스의 마지막 페이지에서만 발생한다.

세그멘테이션

가상 메모리를 서로 크기가 다른 논리적 단위로 분할 한 것을 의미함. 프로세스를 물리적 단위인 페이지가 아닌 논리적 단위인 세그먼트로 분할하여 메모리에 적재하는 방식이다.

세그먼트 테이블

  • 분할 방식을 제외하고, 페이징과 세그멘테이션이 동일하기 때문에, 매핑 테이블의 동작 방식이 동일하다. 논리 주소의 앞 비트들은 페이징 번호가 아니라 세그먼트 번호가 된다.
  • 장점
    • 내부 단편화 문제가 해소된다.
    • 보호와 공유 기능을 수행할 수 있다. 프로그램의 중요한 부분과 중요하지 않은 부분을 분리하여 저장할 수 있고, 같은 코드 영역은 한번에 저장할 수 있다.
  • 단점
    • 외부 단편화 문제가 발생할 수 있다.

메모리 할당 방식

  • First fit(최초 적합) : 최초로 할당받을 수 있는 크기의 공간에 무조건 할당함
  • Best fit(최적 적합) : 크기가 가장 근접한 공간에 할당
  • Worst fit (최악 적합) : 크기가 가장 많이 차이가 나는 공간에 할당

페이지 교체 알고리즘 종류

  • OPT (Optimal)
  • FIFO (First In First Out)
  • LRU (Least Recently Used)
  • LRU-K (Least Recently Used K-th)
  • Clock Algorithm
  • Enhanced Clock Algorithm
  • LFU (Least Frequently Used)
  • MFU (Most Frequently Used)

CS 스터디 : 노션 주소

Reference

profile
같이 공부하자!

0개의 댓글