본문 바로가기
CS/Operating System

[OS] 물리 메모리 관리

by 안녕나는현서 2021. 12. 9.
728x90

메모리 관리

  • CPU의 작업 공간 = 메모리, 모든 프로그램은 메모리에 올라와야 실행 가능
  • 메모리 구조는 1B 크기로 나뉨, 각 영역은 메모리 주소로 구분 (0번지부터 시작)
  • 메모리 주소 레지스터 (MAR) : CPU가 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 사용

 

- 메모리 관리의 이중성

  • 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 되도록 관리를 효율적으로 하고 싶어 하는 것
  • 프로세스 입장에서의 작업의 편리함과 관리자 입장에서 관리의 편리함이 충돌을 일으키는 것

 

소스코드의 번역과 실행

- 컴파일러와 인터프리터

  • 저급 언어 (low level language) : 컴퓨터의 동작을 가장 직접적으로 표현한 언어, 기계어(0과 1)/어셈블리어
  • 고급 언어 (high level language) : 사용자가 이해하기 쉽게 프로그래밍할 수 있는 언어, C언어/자바
  • 언어 번역 프로그램 : 고급 언어로 작성한 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역하는 프로그램
    • 컴파일러 (compiler) : 소스코드를 기계어로 번역 후 한 번에 실행, C언어/자바
    • 인터프리터 (interpretor) : 소스코드를 한 행씩 번역하여 실행, 자바스크립트/베이직
  • 컴파일러와 인터프리터의 차이
    • 컴파일러 사용 프로그래밍 언어는 사용할 변수 먼저 선언 후 사용
    • 컴파일러는 실행 전에 소스코드 점검하여 오류 수정, 최적화
    • 인터프리터는 한 줄씩 위에서부터 아래로 실행되기 때문에 같은 일 반복하는 경우/필요 없는 변수 확인 불가
    • 따라서 크고 복잡한 프로그램에는 컴파일러 사용, 간단한 프로그램에는 인터프리터 사용

 

- 컴파일러의 목적

  • 오류 발견 : 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓은 테이블인 심벌 테이블(symbol table) 사용
  • 코드 최적화

 

- 컴파일 과정

  • 소스코드 작성
  • 컴파일러를 통해 소스코드를 0과 1의 기계어로 번역 (목적코드)
  • 목적코드와 라이브러리 연결 (라이브러리 : 자주 사용하는 함수를 시스템 내에 미리 만들어둔 것)
  • 동적 라이브러리를 포함하여 최종 실행
    동적 라이브러리 : 실행할 때 삽입되는 함수를 가진 라이브러리
    DLL (Dynamic Link Loader) : 윈도우에서의 동적 라리브러리

 

메모리 관리자

  • 일반적으로 메모리 관리 유닛(MMU; Memory Manage Unit)이라는 하드웨어

 

- 메모리 관리자의 작업

  • 가져오기 (fetch)
    • 프로세스와 데이터를 메모리로 가져오는 작업
    • 어떤 상황에서는 데이터의 일부만 가져와 실행하기도 함 (ex 용량이 큰 동영상)
    • 사용자의 요청이 없더라도 앞으로 필요할 것이라고 예상되는 데이터를 미리 가져오기도 함
  • 배치 (placement)
    • 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업
  • 재배치 (replacement)
    • 꽉 차있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업

 

- 메모리 관리 정책

  • 가져오기 정책
    • 프로세스가 필요로 하는 데이터를 언제 메모리로 가져올지 결정하는 정책
    • 일반적으로는 프로세스가 요청할 때 메모리로 가져옴
    • prefetch : 필요하다고 예상되는 데이터를 미리 가져오는 방법
  • 배치 정책
    • 가져온 프로세스를 메모리의 어떤 위치에 올려놓을지 결정하는 정책
    • 페이징 (paging) : 메모리를 같은 크기로 자르는 것
    • 세그먼테이션 (segmentation) : 프로세스의 크기에 맞게 자르는 것
    • 페이징과 세그먼테이션의 장단점을 파악하여 메모리를 효율적으로 관리할 수 있도록 정책을 만드는 것
  • 재배치 정책
    • 메모리가 꽉 찼을 때 메모리 내에 있는 어떤 프로세스를 내보낼지 결정하는 정책
    • 앞으로 사용하지 않을 프로세스를 내보내면 시스템 성능 상승, 자주 사용할 프로세스를 내보내면 성능 감소
    • 교체 알고리즘 (replacement algorithm) : 앞으로 사용하지 않을 프로세스를 찾아서 내보내는 알고리즘

 

메모리 주소

  • 메모리에 접근할 때는 주소를 이용

 

- 34bit CPU / 64bit CPU

  • CPU의 비트 : 한 번에 다룰 수 있는 데이터의 최대 크기
  • CPU의 내부 부품은 비트를 기준으로 제작 (레지스터 크기, 산술 논리 연산장치, 데이터 전송 버스 크기(대역폭), 대역폭의 버스를 통해 옮겨지는 데이터 크기 등)
  • 물리 주소 공간 (physical address space) : 컴퓨터에 설치된 메모리의 주소 공간, 절대 주소 사용하는 주소 공간
  • 논리 주소 공간 (logical address space) : 사용자 입장에서 바라본 주소 공간, 상대 주소 사용하는 주소 공간

 

- 절대 주소와 상대 주소

  • 절대 주소 (absoulte address) : 메모리 관리자 입장에서 바라본 주소, 실제 물리 주소
  • 상대 주소 (relative address) : 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소 지정 방식
  • 상대 주소를 절대 주소로 변환 하기
    • 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근
    • CPU는 메모리관리자에게 상대 주소의 내용 가져오라고 명령
    • 메모리관리자는 재배치 레지스터 값을 더하여 절대 주소로 변환하고 절대 주소에 저장된 데이터 가져옴
    • 재배치 레지스터 : 주소 변환의 기본이 되는 주소를 가진 레지스터, 메모리에서 사용자 영역 시작 주소값 저장됨

 

단일 프로그래밍 환경에서의 메모리 할당

- 메모리 오버레이

  • 프로그램의 크기가 실제 메모리(물리 메모리)보다 클 때 전체 프로세스를 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법
  • 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용
  • 프로그램 전체를 메모리에 올려놓고 실행하는 것보다 속도가 느리지만 메모리가 프로그램보다 작을 때도 실행 가능
  • 프로그램 카운터 (PC)
    • 메모리 오버레이에서 어떤 모듈을 가져오거나 내보낼지 결정하는 CPU 레지스터
    • 앞으로 실행할 명령어의 위치를 가리키는 레지스터
    • 해당 모듈이 메모리에 없으면 메모리 관리자에게 요청하여 메모리로 가져오게 함
  • 메모리 오버레이의 의미
    • 한정된 메모리에서 메모리보다 큰 프로그램의 실행 가능
    • 프로그램 전체가 아니라 일부만 메모리에 올라와도 실행 가능 (메모리를 여러 조각으로 나누어 여러 프로세스에 할당할 수도 있음)

 

- 스왑

  • 스왑 영역 (swap area) : 메모리가 모자라서 쫓겨난 프로세스를 모아두는 저장장치의 공간
  • 스왑인 (swap in) : 스왑 영역 → 메모리, 데이터 가져오기
  • 스왑아웃 (swap out) : 메모리 → 스왑 영역, 데이터 내보내기
  • 메모리 관리자가 관리
  • 스왑을 이용하면 스왑 영역의 크기가 메모리 크기로 인식됨
    (사용자는 실제 메모리 크기+스왑 영역 크기를 전체 메모리 크기로 인식)

 

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

- 메모리 분할 방식

  • 메모리 배치 정책에 해당
  • 현대 운영체제에서는 기본적으로 고정 분할 방식 사용하며 일부분은 가변 분할 방식 혼합

[가변 분할 방식]

  • 가상 메모리 시스템에서의 세그먼테이션
  • 프로세스의 크기에 따라 메모리를 나누는 것
  • 프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치, 연속 메모리 할당 (contiguous memory allocation)
  • 메모리 통합 등의 부가적인 작업이 필요하여 메모리 관리 복잡

[고정 분할 방식]

  • 가상 메모리 시스템에서의 페이징
  • 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것
  • 메모리 관리 수월
  • 쓸모없는 공간으로 메모리 낭비 발생 가능 (일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우)

 

- 가변 분할 방식의 메모리 관리

  • 외부 단편화 (external fragmentation) : 할당할 프로세스보다 메모리에 남아있는 조각이 작아서 할당 불가능한 현상
  • 해결 방법 : 메모리 배치 방식, 조각 모음
  • 메모리 배치 방식
    • 최초 배치 (first fit) : 단편화 고려하지 않고 메모리에서 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법
    • 최적 배치 (best fit) : 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스 배치
    • 최악 배치 (worst fit) : 최적 배치와 정반대, 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스 배치
    • 버디 시스템 (buddy system)
  • 조각 모음 : 서로 떨어져 있는 여러 개의 빈 공간을 합치는 작업, 많은 시간 소요
    • 조각 모음을 하기 위해 이동할 프로세스의 동작을 멈춤
    • 프로세스를 적당한 위치로 이동, 프로세스의 상대 주소값 변경
    • 위의 작업을 마친 후 프로세스 다시 시작

 

- 고정 분할 방식의 메모리 관리

  • 내부 단편화 (internal fragmentation) : 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상
  • 동일하게 분할되는 공간의 크기를 조절하여 내부 단편화 최소화

 

- 버디 시스템

  • 가변 분할 방식이지만 고정 분할 방식과 유사한 점이 있음 (둘의 중간 구조)
  • 작동 방식
    • 프로세스 크기에 맞게 메모리를 1/2로 자르고 프로세스를 메모리에 배치
    • 나뉜 메모리의 각 구역에는 프로세스가 1개만 들어감
    • 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만듦
  • 비슷한 크기의 덩어리가 서로 모여있어 통합이 쉬움 (조각모음을 하지 않아도 간단히 큰 덩어리 만들 수 있음)
  • 효율적인 공간 관리 측면에서는 고정 분할 방식과 비슷한 수준
  • 하지만 메모리 관리 측면에서 고정 분할 방식이 더 단순하여 많이 사용됨
728x90

'CS > Operating System' 카테고리의 다른 글

[OS] 교착 상태  (0) 2021.12.09
[OS] 임계구역, 임계구역 해결  (0) 2021.12.06
[OS] 프로세스 간 통신  (0) 2021.12.05
[OS]CPU 스케줄링 알고리즘  (0) 2021.12.02
[OS] CPU 스케줄링  (0) 2021.12.02

댓글