[Operating System] Memory

권영태·2025년 4월 29일

Operating System

목록 보기
11/20

Memory

CPU가 명령어를 수행하기 위해서는 메모리에 적재되어 있어야한다.

Main Memory

메인 메모리와 CPU 내 레지스터는 유일하게 CPU가 직접 접근할 수 있는 범용 저장소다.

  • 디스크 주소를 직접 사용하는 명령어는 존재하지 않아, 사용하는 데이터는 반드시 메모리에 적재 되어야 한다.
  • 메인 메모리에는 메모리 버스를 통한 접근할 수 있는데 이는 속도가 많이 느리다.
    • 필요한 데이터가 메모리에서 가져오지 못하면 CPU는 Stall(멈춤) 상태로 변하는데 이는 매우 심각한 성능 저하다.
    • 그래서 캐시 메모리를 써서 더 빠르게 가져오는 방식을 채택한다.

메모리 접근 보호 필요성

메모리에 빠른 접근도 중요하지만 정확한 메모리 접근 보장도 필요하다.
운영체제나 다른 프로세스의 잘못된 접근으로 시스템이 손상될 수 있어서 운영체제 개입없이 하드웨어 수준에서 보호해야한다.

명령어 실행 사이클

다음과 같은 사이클로 명령어가 실행된다.

  • 메모리에서 명령어 가져오기(fetch) -> 명령어 해석(decode) -> (필요한 경우 메모리에 피연산자 가져오기) -> 명령어 실행(execute) -> 명령어 실행 결과를 메모리에 저장(store)

다중 프로그래밍 환경에서 메모리 할당

메인 메모리는 운영체에와 여러 프로세스가 함께 사용하기에 효율적으로 할당하는 것이 중요하다.

연속 메모리 할당

메모리를 운영체제와 사용자 프로세스 두 개의 파티션으로 나눠서 관리하는 방법으로 보통 운영체제 부분을 메모리 상위 영역으로 배치한다. 그리고 각 프로세스가 메모리에 연속된 블록에 위치한다.

고정 분할 방법

시스템 부하를 바탕으로 크기와 개수를 계산해 메모리를 고정된 크기로 분할해 메모리를 할당하는 방법이다.

  • 분할된 메모리보다 프로세스가 크면 오류가 발생하고, 작으면 내부 단편화가 발생한다.

가변 분할 방법

메모리 전체를 하나의 큰 구멍(==여유 공간)으로 간주하고 할당하는 방법이다.
프로세스가 들어오면 요구하는 크기만큼 할당하고 나머지는 남겨두고, 프로세스가 종료되면서 메모리를 반납하고 인접한 구멍들과 병합한다.

  • First-Fit: 처음 마주하는 충분한 구멍을 프로세스에 할당한다.
  • Best-Fit: 딱 맞는 가장 작은 구멍을 프로세스에 할당한다.
  • Worst-Fit: 가장 큰 구멍을 프로세스에 할당한다.
  • First-Fit과 Best-Fit은 Worst-Fit보다 일반적으로 더 좋은 성능(메모리 활용, 검색 시간)을 보여주는데, 보통 Frist-Fit이 Best-Fit보다 더 빠른 검색 속도를 보여준다.
  • 외부 단편화가 발생한다.

Worst-Fit은 언제 쓸까??
과도한 Best-Fit으로 너무 많은 작은 조각이 남는 상황인 경우 일부로 Worst-Fit을 통해 큰 조각들을 만들어 큰 프로세스를 수용할 수 있도록 한다.

단편화(fragmentation)

내부 단편화

남는 구멍의 크기가 관리하는 비용보다 더 작은 경우 이를 관리하지 않는다. 따라서 대부분 사용할 수 없는 공간이 되는데 이를 내부 단편화라고 한다.

외부 단편화

전체 여유 메모리의 총량은 충분하지만, 연속적이지 않아 요청을 만족시킬 수 없는 상태.

  • First-Fit과 Best-Fit 메모리 할당 전략 모두 외부 단편화 문제가 발생한다.
  • 프로세스들이 메모리에 로드 되었다가 제거되는 과정에서 여유 메모리 공간이 작은 조각들로 나누어지기 때문에 발생하는데, 어떤 알고리즘을 쓰든 외부 단편화 문제를 피할 수 없다.
  • 해결방안
    • 메모리 통합 방법: 하나의 작업이 끝났을 때 다른 빈 공간이 인접해 있으면 하나로 합치는 방법
    • 메모리 압축 방법: 메모리 내 내용을 이동시켜서 모든 여유 공간을 하나의 큰 블록으로 압축하는 방법
      • 정적 재배치 상태인 경우 압축할 수 없고, 동적 재배치 상태일 때만 압축이 가능하며 비용이 많이 들 수 있다.

학습하며 정리한 글이기 때문에 혼용된 표현 또는 잘못된 내용이 있을 수 있습니다.
만약, 발견하신 경우 댓글을 통해 알려주신다면 진심으로 감사드립니다.

profile
GitHub : https://github.com/dudxo

0개의 댓글