[OS] 공룡책_9 메인 메모리

bin1225·2024년 9월 25일
0

OS

목록 보기
9/10
post-thumbnail

9.1 배경

9.1.1 기본 하드웨어

프로세스가 독립된 메모리 고간을 가지도록 보장하기 위해 합법적인 메모리 주소 영역을 설정하고, 레지스터 두개를 이용하여 보호 기법을 제공한다.

  • 기준 레지스터: 가장 작은 합법적 물리 메모리 주소의 값
  • 한계 레지스터: 주어진 영역의 크기
    ex) 기준-1000 한계-3000 -> 범위 1000~4000

사용자 모드에서 만들어진 모든 주소와 레지스터를 비교하여 보호가 이루어진다.

9.1.2 주소의 할당 (Address Binding)

메모리 주소 공간에서 명령어와 데이터의 바인딩은 그 바인딩이 이루어지는 시점에 따라 구분된다.

컴파일 시간 (compile time)

  • 프로세스가 컴파일 시간에 적재될 메모리 위치를 알고 있다면 절대코드를 생성할 수 있다.
  • 해당 위치가 변경돼야 한다면 프로세스가 다시 컴파일 되어야 한다.

적재 시간 (load time)

  • 컴파일 시간에 바인딩 되지 않을 경우 컴파일러는 이진 코드를 재배치 가능 코드로 만든다. 이후 적재시간에 재배치 가능 코드를 이용해 적재한다.
  • 위치가 변경 되어도 사용자 코드를 다시 적재하기만 하면 된다.

실행 시간 (execution time)

  • 프로세스가 실행하는 중간에 메모리 내의 한 세그먼트로부터 다른 세그먼트로 옮겨질 수 있는 상태이다.
  • 특별한 하드웨어를 이용해야 한다.

9.1.3 논리 대 물리 주소 공간

  • 논리 주소: CPU가 생성하는 주소
  • 물리 주소: 메모리가 취급하는 주소
  • 메모리 관리장치(memory management unit, MMU): 논리주소를 물리주소로 바꿔준다.

9.1.4 동적 적재

  • 프로세스 크기가 메모리보다 큰 경우 메모리 공간을 효율적으로 사용하기 위해 동적적재를 사용한다.

  • 각 루틴은 호출되기 전까지 메모리에 올라오지 않고, 재배치 가능한 상태로 디스크에 대기한 후 호출 시 메모리에 올라와 실행된다.

  • 간혹 발생하는데 실행할 코드가 많은 경우에도 유용하다.

9.1.5 동적 연결 라이브러리 (DDL)

  • 공유 라이브러리, 사용자 프로그램이 실행될 때 사용자 프로그램에 연결되는 시스템 라이브러리이다.

  • 실행 시점에 연결되기 때문에 메모리 사용이 최소화되며, 공유가 가능하기 때문에 더 효율적으로 사용할 수 있다.

9.2 연속 메모리 할당 (Contiguous Memory Allocation)

한 프로세스를 연속된 주소의 메모리에 할당하는 방식이다.

9.2.1 메모리 보호

  • CPU 스케줄러가 다음 수행할 프로세스를 선택할 때, 디스패처는 문맥교환 시 재배치 레지스터와 상한 레지스터에 정확한 값을 적재한다.

  • 운영체제는 이 값을 확인하여 다른 프로세스의 접근으로 부터 보호할 수 있다.

9.2.2 메모리 할당

  • 하나의 프로세스를 가변 크기 파티션에 할당하는 가변 파티션 기법이다.
  • 한 파티션에는 하나의 프로세스만 적재된다.
  • 그림처럼 다양한 크기의 hole이 생기게 된다.

이런식으로 적재와 공간 회수를 반복하다보면, 사용 가능한 메모리 영역인(hole)이 작은 크기로 분산되어 존재한다. 이러한 문제를 외부단편화라고 부른다.

기본적인 할당 전략

메모리 할당 요구에 대해 어떤 전략으로 할당해줄 것인지에 따라 다음과 같이 나뉜다.

  • 최초 적합: 가장 처음 나오는 가용 공간을 할당한다.
  • 최적 적합: 사용 가능 공간 중에서 가장 작은 것을 택한다.
  • 최악 적합: 사용 가능 공간 중에서 가장 큰 공간을 택한다.

9.2.3 단편화 (Fragmentation)

외부 단편화

  • 프로세스와 적재와 제거가 반복되면서 가용 공간이 너무 작은 조각이 되어버린다.
  • 합치면 충분한 공간이 되지만 그것들이 너무 작은 조각으로 분산되어 있을 때 발생한다.

내부 단편화

  • 메모리를 먼저 아주 작은 공간들로 분할하고, 메모리 할당 요청시 분할된 공간의 정수배로만 할당해주는 상황에서 발생한다.
  • 할당된 공간이 실제 프로세스 크기보다 조금 더 클 때 해당 공간은 사용할 수 없는데, 이를 내부 단편화라고 부른다.

9.3 페이징

  • 프로세스의 물리 주소 공간이 연속되지 않아도 되는 메모리 관리 기법이다.
  • 외부 단편화와 압축의 필요성을 피한다.

9.3.1 기본 방법

  • 물리 메모리를 프레임(frame)이라 불리는 크기 블럭으로, 논리 메모리는 페이지(page)라 불리는 같은 크기 블록으로 나눈다.

  • CPU에서 나오는 모든 주소는 페이지 번호(p)와 페이지 오프셋(d)으로 구성된다.

  • 페지 테이블(page table)을 이용하여 각 페이지와 물리 메모리의 시작 주소를 매칭한다.

  1. 페이지 번호 p를 추출하여 페이지 테이블의 인덱스로 사용한다.
  2. 페이지 테이블에서 해당 프레임 번호 f를 추출한다.
  3. 논리 주소의 페이지 번호 p를 프레임 번호 f로 바꾸고 offset d를 이용해 실제 물리 메모리에 접근한다.

9.3.2 하드웨어 지원

  • 페이지 테이블은 프로세스별 자료구조이므로 페이지 테이블에 대한 포인터는 각 프로세스 제어블록에 저장된다.

  • 대부분의 컴퓨터는 페이지 테이블을 메인 메모리에 저장하고 페이지 테이블 기준 레지스터(page-table base register, PTBR)로 하여금 페이지 테이블을 가리키도록 한다.

  • 이렇게 하면 문맥교환 시간을 단축시킬 수 있다(페이지 테이블 자체를 레지스터에 저장하면 오래 걸림).

9.3.2.1 Translation Look-Aside Buffer(TLB)

  • 메인 메모리에 페이지 테이블을 저장하면 문맥교환 속도가 빨라지지만 메모리 액세스 시간이 줄어들 수 있다.

  • 페이지 테이블을 찾아 물리 주소를 확인하고 실제 물리 주소에 접근하기 때문에 총 2번에 메모리 액세스가 필요하다.

-> TLB라고 불리는 소형 하드웨어 캐시를 사용한다.

  • TLB의 크기는 작게 유지할 수 밖에 없다. 따라서 페이지 테이블의 일부를 저장한 후 필요시 페이지 테이블을 참고하여 TLB에 저장된 값들을 교체한다.

9.3.3 보호

  • 페이지 테이블의 각 엔트리에 유효/무효 라는 하나의 비트를 추가한다.
  • 해당 비트를 확인하여 해당 페이지가 프로세스의 합법적인 페이진인지 확인한 후 접근을 허용하거나 허용하지 않는다.

9.3.4 공유 페이지

  • 페이징의 장점은 공통의 코드를 공유할 수 있다는 점이다.
  • 동일한 페이지 번호를 공유함으로써 메인 메모리에 적재된 코드 자체를 공유한다.

9.4 페이지 테이블의 구조

9.4.1 계층적 페이징 (Hierarchical Paging)

  • 현대 컴퓨터가 매우 큰 주소 공간을 가지면서 페이지 테이블 자체의 크기도 커진다.
  • 페이지 테이블도 메인 메모리 내에서 연속적으로 할당되지 않게 된다.
    -> 2단계 페이징 기법으로, 페이지 테이블 자체를 페이징 한다.

9.4.2 해시 페이지 테이블 (Hashed Page Tables)

  • 주소 공간이 32비트보다 커지면 가상 주소를 해시로 사용하는 해시 페이지 테이블을 가장 많이 사용한다.
  • 해시 값을 이용하여 페이지 번호를 찾는다.

9.4.3 역 페이지 테이블 (Inverted Page Table)

  • 실제 물리 메모리 프레임마다 한 항목씩 할당한다.
  • 모든 프로세스가 하나의 페이지 테이블을 참조한다.
  • 논리 페이지 마다 항목을 가지는 대신 물리 프레임에 대응하는 항목만 저장하기 때문에 메모리에서 훨씬 작은 공간을 점유한다.
    but, 전체를 탐색해야 할 수도 있기 때문에 탐색이 매우 오래 걸릴 수 있다.

9.5 스와핑(Swapping)

  • 프로세스 혹은 프로세스의 일부분을 실행 중에 임시로 백업 저장장치로 보냈다가 실행을 계속하기 위해 다시 되돌릴 수 있다.

  • 모든 프로세스의 물리 주소 공간 크기의 총합이 실제 물리 메모리보다 큰 경우에도 스와핑을 이요하여 동시에 실행하는 것이 가능해진다.

  • 프로세스 전체를 스와핑하는 것은 작업에 소요되는 시간이 크기 때문에 최신 운영체제에서는 잘 사용하지 않는다. -> 페이지 단위로 스와핑 한다.

Swapping with Paging

0개의 댓글