[운영체제와 정보기술의 원리] 7. 메모리 관리

진예·2024년 1월 15일
0

Operating System

목록 보기
6/8
post-thumbnail

💡 주소 바인딩

논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업

  • 논리적 주소 (가상 주소) : 프로그램이 메모리에 적재되면 생성되는 프로세스의 독자적인 주소 공간

  • 물리적 주소 : 물리적 메모리에 실제로 올라가는 위치

CPU논리적 주소를 통해 메모리를 참조하게 되면, 해당 논리적 주소가 물리적 메모리의 어느 위치에 매핑되는지 확인해야 한다.

✔️ 컴파일 타임 바인딩

물리적 주소가 프로그램을 컴파일할 때 결정됨

✔️ 로드 타임 바인딩

물리적 주소가 프로그램의 실행이 시작될 때 결정됨

➡️ 프로그램이 종료될 때까지 위치 고정

✔️ 실행시간 바인딩

실행을 시작한 후에도 물리적 주소가 변경될 수 있음

MMU 기법 : 물리적 주소 = 주소값 + 기준 레지스터 값

기준 레지스터는 프로세스의 물리적 메모리 시작 주소를 가지고 있다. 여기에 논리적 주소를 더하게 되면, 해당 프로세스의 기준 레지스터로부터 주소값만큼 떨어진 위치에 있는 곳에서 CPU가 요청한 정보를 찾을 수 있다.

다중 프로그래밍 환경에서, 논리적 주소값이 실제 프로세스의 크기보다 크면 실제 물리적 주소다른 프로세스의 메모리 영역을 침범하게 된다.

이를 방지하기 위해 프로세스의 크기를 담고 있는 한계 레지스터를 두고, 논리적 주소가 이 값보다 크면 트랩을 발생시켜 해당 프로세스를 시킨다.


💡 메모리 관련 용어

📒 동적 로딩 (dynamic loding)

프로세스 내에서 실행에 필요한 부분만 메모리에 적재

: 여러 프로세스가 동시에 메모리에 올라갈 수 있는 다중 프로그래밍 환경에서 메모리를 효율적으로 사용하기 위해, 한 프로세스의 주소 공간 전체를 적재하는 것이 아닌 실제 실행에서 필요한 부분만 메모리에 적재하는 방식이다.


📝 중첩 (overlays)

프로세스 내에서 실행에 필요한 부분만 메모리에 적재

의미만 보면 동적 로딩과 같아 보이지만, 동적 로딩은 다중 프로그래밍 환경에서 메모리를 효율적으로 사용하기 위한 기법이고, 중첩 메모리 크기의 제약으로 인해 하나의 프로세스조차 올릴 수 없는 경우에 사용하는 기법이다.


📒 동적 연결 (dynamic linkng)

연결을 프로그램 실행 시점까지 지연

연결 (linking) : 소스 코드를 컴파일하여 생성된 목적 파일과 이미 컴파일된 라이브러리 파일을 묶어 하나의 실행 파일을 생성하는 과정

정적 연결에서는 연결된 실행 파일 자체를 메모리에 적재하여 실행하므로, 여러 프로세스에서 동일한 라이브러리를 가지고 있다고 하더라도 각 프로세스의 주소 공간을 메모리에 적재해야 했다.

동적 연결은 실행 시점에서 라이브러리가 필요할 때 연결되므로, 하나의 라이브러리 파일이 메모리에 적재되어 있으면 여러 프로세스에서 해당 라이브러리에 접근이 가능하다.


📒 스와핑 (swaping)

메모리에 올라온 프로세스의 주소 공간 전체디스크스왑 영역일시적으로 내려놓는 것

디스크에는 비휘발성 저장공간인 파일 시스템과, 메모리의 연장 구조인 스왑 영역이 존재한다. 프로세스가 봉쇄 상태이거나, 타이머 인터럽트로 인해 준비 큐로 이동해야 하는 경우와 같이 당장 메모리를 필요로 하지 않는 프로세스들의 주소 공간스왑 영역으로 내리는 것스왑 아웃이라고 한다. 반대로, 디스크에서 메모리로 올리는 작업을 스왑 인이라고 한다.


💡 물리적 메모리 할당 방식

물리적 메모리 = 운영체제 상주 영역 + 사용자 프로세스 영역


📒 연속 할당

프로세스 주소 공간을 분할하지 않고, 한 곳에 연속적으로 적재하는 방식


📝 고정분할 방식

메모리를 특정 개수의 분할로 나누어두고, 각 분할하나의 프로세스를 적재하는 방식

: 메모리에 적재 가능한 프로세스의 수크기제한

  • 내부 조각 : 적재된 프로세스 크기 > 할당된 메모리 영역의 크기
    ➡️ 내부 조각이 발생하여도 한 영역에는 하나의 프로세스만 적재할 수 있으므로 해당 공간은 아무런 의미 없이 남은 공간이 되어 메모리 낭비를 초래한다.

  • 외부 조각 : 적재되어야 할 프로세스의 크기 > 남은 메모리 영역의 크기
    ➡️ 남은 메모리의 영역이 적재되어야 할 프로세스의 크기보다 작으면 해당 공간에 프로세스를 적재할 수 없으므로, 아무런 의미 없이 남은 공간이 되어 메모리 낭비를 초래한다.


📝 가변분할 방식

적재될 프로그램의 크기에 따라 분할의 크기, 개수동적으로 변하는 방식

: 기본적으로 프로그램의 크기에 맞춰 메모리를 할당하기 때문에 내부조각이 발생하지는 않지만, 남은 영역의 크기프로세스의 크기보다 작으면 적재할 수 없기 때문에 외부 조각은 여전히 발생한다.


✔️ 동적 메모리 할당 문제

: 프로그램을 적재할 수 있는 가용 공간은 메모리 내의 곳곳에 분산되어 있다. 어떤 프로그램을 적재하려고 할 때, 여러 가용 공간 중 어떤 위치에 프로그램을 올리는 것이 좋을까? (가용 공간 >= 프로그램 크기인 경우)

  1. 최초 적합 (first-fit) : 가장 먼저 발견한 공간에 적재 ➡️ 시간 측면에서 효율적

  2. 최적 적합 (best-fit) : 크기가 가장 작은 공간에 적재 ➡️ 공간 측면에서 효율적

  3. 최악 적합 (worst-fit) : 크기가 가장 큰 공간에 적재 ➡️ 효율성 ↓

컴팩션 (compaction) : 사용 중인 메모리 영역 가용 공간을 각각 한 쪽으로 모아서 관리 ➡️ 메모리 상 위치를 이동시켜야 하므로 비용이 매우 많이 든다.


📒 불연속 할당 기법

하나의 프로세스물리적 메모리의 여러 위치분산시켜 적재하는 방식


📝 페이징 기법

물리적 메모리페이지와 동일한 크기의 프레임으로 나누어 적재하는 방식

✔️ 주소 변환

  • 페이지 번호 (p) : 페이지 테이블 인덱스 ➡️ 해당 항목에 물리적 메모리 상의 시작 위치 보관

  • 페이지 오프셋 (d) : 하나의 페이지 내에서의 변위 ➡️ 시작 위치로부터 얼마나 떨어져 있는가?

✔️ 페이지 테이블

페이지 테이블 : 물리적 메모리에 위치한 주소 변환을 위한 자료구조

  • 기준 레지스터 : 메모리 내에서의 페이지 테이블의 시작 위치
  • 길이 레지스터 : 페이지 테이블의 크기

➡️ 페이징 기법을 사용하게 되면 주소 변환을 위해 페이지 테이블에 접근하게 되고, 변환된 주소로 실제 데이터에 접근하여 메모리에 총 두 번 접근해야 한다. 이를 줄이고 접근 속도를 향상시키기 위해 빈번히 참조되는 페이지에 대한 주소 변환 정보를 담는 TLB를 사용하기도 한다.

✔️ 역페이지 테이블

물리적 메모리페이지 프레임 하나 당 페이지 테이블에 하나씩의 항목을 두는 방식

: 시스템 전체에 페이지 테이블을 하나만 두어, 각 항목은 프로세스 번호(pid)프로세스 내의 논리적 페이지 번호(p)를 담게 한다.

✔️ 공유 페이지

공유 코드를 담고 있는 페이지

공유 코드 : 여러 프로세스에 의해 공통으로 사용될 수 있도록 작성된 코드물리적 메모리하나만 적재되어 있으면, 여러 프로세스해당 코드를 공유하며 사용하므로 메모리의 공간을 효율적으로 사용 가능

: 공유 페이지는 세 프로세스의 주소 공간 내에서 동일한 위치에 존재해야 한다.


📝 세그먼테이션

프로세스의 주소 공간을 의미 단위(코드, 데이터, 스택)세그먼트로 나누어 물리적 메모리에 올리는 기법

  • 각 세그먼트는 크기가 균일하지 않다. ➡️ 외부 조각 발생 가능
  • 논리적 주소 : <세그먼트 번호, 오프셋>

: 페이지 테이블과 유사하게, 세그먼트 테이블기준 레지스터와 길이 레지스터를 통해 특정 요청의 세그먼트 번호범위 안에 해당하는지 체크하고, 올바르지 않은 요청일 경우 트랩을 통해 예외를 발생시킨다.

✔️ 페이지드 세그먼테이션

페이징 기법 + 세그먼테이션 = 세그먼트동일한 크기의 페이지 집합으로 나누는 것


🙇🏻‍♀️ 출처 : 운영체제와 정보기술의 원리

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글