[TIL] [WEEK11-12] Keywords

woo__j·2024년 6월 4일
0

TIL - Today I Learned

목록 보기
23/23
WEEK 11 - Keywords
Virtual Memory/Page Table/TLB/Page Fault/Lazy Loading/
Page Replacement Policy/Anonymous page/File-backed Page/Swap Disk/DMA

📍 Virtual Memory (가상 메모리)

: 컴퓨터 시스템에서 물리 메모리의 한계를 극복하고 효율적인 메모리 관리를 위해 사용되는 기술

[등장 배경]
컴퓨터의 실제 물리 메모리(RAM)은 한정되어 있어 많은 프로그램을 동시 실행하기 어렵다.
하드 디스크를 이용해 이를 실제 메모리처럼 사용해 더 많은 프로그램이 실행될 수 있도록 하는 기법을 고안하게 됨

1) 개념
프로그램이 실제 물리 메모리(RAM)보다 더 큰 메모리 공간을 사용할 수 있도록 하는 메모리 관리 기법
실행하고자 하는 프로그램을 일부만 메모리에 적재해 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 한다.

2) 원리
운영체제가 물리 메모리와 보조 기억 장치(디스크) 사이 메모리 주소를 매핑해, 프로그램을 실행하는데 필요한 만큼의 메모리를 가상으로 사용될 수 있도록 한다.

CPU가 프로세스를 실행할 땐 가상 메모리 주소를 사용하고, 해당 가상 주소에서 데이터를 읽고 쓸 때만 물리 메모리 주소로 접근해 실행한다.
즉 CPU는 가상 주소를 먼저 찾고, 물리 메모리 주소가 필요한 경우 해당 물리 주소를 찾아내 프로세스를 실행한다. 이 때 MMU를 통해 가상 주소를 물리 주소로 변환하고 매칭된 물리 주소로 물리 메모리에 접근해 해당 data를 CPU에 전달한다.

[Memory Management Unit]
가상 주소를 물리 주소로 빠르게 변환해주는 하드웨어 칩

  • virtual address: 프로세스가 참조하는 가상 주소
  • physical address: 실제 메모리 물리 주소

📍 Page Table

[페이징]
프로세스의 가상 주소 공간을 페이지라는 일정한 단위로(page size: 4096byte=4KB) 자르고, 메모리 물리 주소 공간을 프레임이라는 동일한 크기의 일정한 단위로 자른 뒤 페이지를 프레임에 할당(매칭)하는 가상 메모리 관리 기법
-> 일정한 단위로 자르고, 메모리에 불연속적으로도 할당할 수 있기에 외부 단편화 문제 해결

[스와핑]
현재 실행되지 않는 프로세스를 임시로 보조기억장치 일부 영역으로 쫒아낸 후, 생긴 메모리 공간에 또 다른 프로세스를 적재해 실행하는 방식

  • swap space: 쫒겨나는 보조기억장치의 일부 영역
  • swap-out: 실행되지 않는 프로세스가 스왑 영역으로 옮겨지는 것
  • swap-in: 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨와지는 것 (원래 있던 주소와는 다른 주소에 적재될 수 있음)

페이징에서도 페이지 단위로 스와핑이 일어남
메모리에 적재될 필요가 없는 페이지들이 보조기억장치로 page-out(=swap out), 실행에 필요한 페이지들은 메모리로 page-in(=swap-in)된다.
-> 즉, 이는 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요가 없다는 의미다.
프로세스를 이루는 페이지 중 실행에 필요한 일부 페이지만을 메모리에 적재하고, 당장 실행에 필요하지 않은 페이지들은 보조기억장치에 남겨둘 수 있어 물리 메모리보다 더 큰 프로세스를 실행할 수 있게 됨

[페이지 테이블]
페이징 기법을 통해 프로세스의 페이지 단위가 메모리 물리 주소 공간에 불연속적으로 배치되어 있다면, CPU가 이를 순차적으로 실행할 수가 없다. 즉, ‘다음 실행할 명령어 위치’를 찾기가 어려워진다.

이를 해결하기 위해 페이지 테이블을 이용한다.
이는 프로세스가 실제 메모리 내 주소인 ‘물리 주소’에 불연속적으로 배치되더라도, cpu가 바라보는 주소인 ‘논리 주소’에는 연속적으로 배치되도록 한다. = 페이지 번호와 프레임 번호를 짝지어 주는 이정표로, 어떤 페이지가 어떤 프레임에 할당되었는지 알 수 있음

그래서 프로세스마다 각자의 페이지 테이블을 가지고 있고 각 페이지 테이블들은 메모리에 적재되어 있다.
또한 CPU 내 페이지 테이블 베이스 레지스터(PTBR)은 각 프로세스의 페이지 테이블이 적재된 주소를 가리키고 있다.

예를 들어 프로세스 A가 실행된다면,
PTBR은 프로세스 A의 페이지 테이블을 가리키고, CPU는 프로세스 A의 페이지 테이블을 통해 각 페이지들이 적재된 프레임을 알 수 있다.

이렇게 각 프로세스들의 페이지 테이블 정보들은 각 프로세스의 PCB에 기록되고, 문맥 교환이 일어날 때 다른 레지스터들과 마찬가지로 함께 변경된다. 위와 같은 경우에서 프로세스 B로 문맥 교환이 일어나면 PTBR이 프로세스 B의 페이지 테이블을 가리키게 됨

근데 이렇게 페이지 테이블을 메모리에 둔다면 메모리 접근 시간이 두 배로 늘어난다.
메모리에 있는 페이지 테이블을 보기 위해 한 번, 그렇게 알게 된 프레임에 접근하기 위해 한 번.

이 문제를 해결하기 위해 CPU 곁에 TLB라는 페이지 테이블의 캐시 메모리를 둔다.

📍 Translation Lookaside Buffer (TLB)

TLB는 페이지 테이블의 캐시이기 때문에 페이지 테이블의 일부 내용을 저장한다.
참조 지역성에 근거해 최근 사용된 페이지 위주로 가져온다.
즉, 가상 메모리 주소를 물리 메모리 주소로 변환하는 속도를 높이기 위해 사용되는 캐시

  • TLB Hit: CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우 = 메모리 접근 한 번
  • TLB Miss: 페이지 번호가 없을 경우 = 메모리 접근 두 번

📍 Page Fault

[페이지 테이블 엔트리]
페이지 테이블의 각각의 행들

페이지 테이블 엔트리에는 페이지 번호/프레임 번호 외에도 다른 정보들이 담겨있다.

  • 유효 비트: 해당 페이지의 접근 가능 여부, 즉 메모리에 적재되어 있는지(1) & 보조기억장치에 있는지(0)
    이 때 만약 CPU가 유효 비트가 0인, 즉 메모리에 적재되어 있지 않은 페이지로 접근을 시도하면 Page Fault라는 예외가 발생해 처리하는 과정이 필요함
    page fault는 운영체제에 의해 처리되는 인터럽트로, 운영체제는 이 인터럽트를 받아 아래 과정을 거친다.
* CPU는 기존 작업 내용을 백업
* 페이지 폴트 처리 루틴 실행 = 원하는 페이지를 물리적 메모리로 로드한 후 유효 비트를 1로 변경 (페이지 테이블 업데이트)
* 이제 CPU가 해당 페이지에 접근 가능해지면서 프로세스 재개
  • 보호 비트: 페이지에 접근할 권한을 제한해 페이지를 보호하는 기능, 해당 페이지가 읽기만 가능한지(0) & 읽고 쓰기가 모두 가능한 지(1)
* 읽기(r), 쓰기(w), 실행(x)의 조합으로 구현할 수도 있다.
  ex) 읽고 쓰기만 가능하고 실행은 불가능하다 = 110
  • 참조 비트: CPU가 이 페이지에 접근한 적이 있는지 여부, 적재 이후 읽거나 쓴 페이지(1) & 한 번도 읽거나 쓰지 않은 페이지(0)
  • 수정 비트: 해당 페이지의 수정 여부, 변경된 적 있는 페이지(1) & 한 번도 접근한 적 없거나 읽기만 했던 변경된 적 없는 페이지(0)
  • 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지, 할 필요가 없는지 판단하기 위해 존재

[Page Fault]
메모리에 적재되어 있지 않은 페이지로 접근을 시도하면 발생하는 예외
이 때 페이지 폴트 처리 루틴, 즉 해당 페이지를 메모리에 적재하고 유효 비트를 1로 설정한 후 다시 접근을 시도할 수 있다.

📍 Page Replacement Policy

: 페이지 교체 정책
페이지를 메모리에 적재하다 보면 언젠가 메모리가 가득 차게 되는데, 이 때 당장 실행에 필요한 페이지를 적재하기 위해 메모리에 적재된 페이지를 보조기억장치로 page-out을 해야 한다.
그럼 어떤 페이지를 내보내는 것이 최선일까? 이를 결정하는 방법이 페이지 교체 알고리즘이다.

  • FIFO 페이지 교체 알고리즘
    : 메모리에 가장 먼저 올라왔었던 페이지부터 내쫒는 방식
  • 최적 페이지 교체 알고리즘
    : CPU에 의해 참조되는 횟수를 고려해 앞으로 사용빈도가 가장 낮을 페이지를 내쫒는 방식, 이는 예측이 불가능하기 때문에 일반 OS에선 사용이 불가능
  • LRU 페이지 교체 알고리즘
    : 가장 오랫동안 사용되지 않은 페이지를 교체하는 방식
  • LFU 페이지 교체 알고리즘
    : 가장 적게 사용한 페이지를 교체하는 방법
  • NRU(클럭 알고리즘, second chance)
    : LRU와 마찬가지로 가장 늦게 사용된 페이지를 교체하나, 각 페이지의 참조비트를 조사하며 동작
- 프레임 내 페이지가 참조될 때, 하드웨어에 의해 참조 비트가 1로 세팅
- 한 바퀴 돌며 참조되지 않은 페이지의 참조 비트값을 0으로 바꾼 후 지나감
- 참조 비트가 0인 페이지를 방문하면 해당 페이지를 교체
-> 즉 페이지가 참조되어 reference bit가 1이 되고, 한 바퀴 도는 동안 사용되지 않는다면 0이 된다.
또 다시 한 바퀴를 도는 동안 사용되지 않는 페이지는 참조되지 않았으므로 교체 대상 페이지로 선정된다.
  • 추가 공부
    지나치게 빈번한 페이지 교체로 인해 CPU 이용률이 낮아지는 문제 = 스래싱
    스레싱이 발생하는 원인이 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않아서임
    그래서 운영체제가 각 프로세스들이 무리없이 실행하기 위한 최소한의 프레임 수를 파악하고 프로세스들에 적절한 수만큼 프레임을 할당해줄 수 있어야 함 -> 프레임 할당 방식

📍 Lazy Loading

모든 데이터를 다 로딩하는 것이 아닌, 필요한 데이터만 로딩한 후 나머지는 지연시켜서 로딩하는 것
프로그램이 시작할 때 필요한 모든 데이터를 메모리에 즉시 로드하지 않고, 필요한 순간에만 해당 부분을 로드함

즉 페이지를 할당되어 대응하는 페이지 구조체가 있다. 그러나 그것과 연결된 물리 프레임은 없는 상태다.
그리고 페이지의 실제 컨텐츠는 아직 로드되지 않은 상태.
이 때 페이지 폴트가 일어나면, 이제 그것이 필요하다는 의미기 때문에 이 때 페이지의 실제 컨텐츠가 로드된다

  • Demand Paging
    : Lazy Loading의 대표적인 예로, 프로세스가 페이지에 접근하려 할 때 해당 페이지가 메모리에 없으면 Page fault가 발생하게 된다. 이 때 운영체제는 필요한 페이지를 디스크에서 메모리로 로드
  • 리소스 사용 최적화
    : 프로세스가 실제로 사용하지 않는 페이지는 메모리에 로드되지 않는다. 이는 시스템 리소스 낭비를 줄이고, 사용 가능한 메모리를 보다 더 효율적으로 사용할 수 있게 한다.

📍 Anonymous page (익명 페이지) / File-backed Page (파일 기반 페이지)

페이지에는 두 종류가 있다.

[Anonymous Page]
커널로부터 프로세스에게 할당된 일반적인 메모리 페이지로, 파일과 연결되지 않은 가상 메모리 공간이다.

어떤 파일과도 매핑되지 않은 메모리 페이지로, 이러한 페이지는 주로 프로세스의 heap이나 stack 영역에 할당되며, 프로세스의 동적 메모리 할당 요청에 응답해 생성됨
프로세스의 런타임 동안만 존재하며, 디스크에 있는 파일과 연결되지 않으므로 시스템 종료 시 해당 데이터는 사라진다.

[작동 원리]
1) 메모리 할당
: 프로세스가 동적 메모리 할당 요청 시, 운영체제는 anon 페이지를 할당 (프로세스의 런타임 동안만 존재)
2) 페이지 폴트 처리
: 프로세스가 처음 anon 페이지에 접근 시 페이지 폴트 발생, 이 때 운영체제가 해당 페이지를 물리 메모리에 매핑하고 필요에 따라 초기화
3) 스왑 아웃
: 시스템 메모리가 부족할 때, 메모리를 확보하기 위해 운영체제는 anon 페이지를 스왑 영역으로 이동시킴

[File-backed Page]
디스크의 파일과 연결즉, 파일의 내용이 메모리에 로드되어 있다.

파일 시스템에 있는 특정 파일과 매핑된 메모리 페이지로, 이러한 페이지는 프로세스가 파일의 내용을 메모리에 매핑할 때 생성된다.
주로 실행 파일의 코드나 데이터, 리소스 파일 등과 같이 디스크에 저장된 파일을 메모리에 로드하여 사용하는 데 사용된다.

[작동 원리]
1) 메모리 매핑
: 프로세스가 파일을 메모리에 매핑하면 운영체제는 파일의 내용을 메모리 페이지에 매핑, 이 페이지들은 파일의 실제 데이터를 반영
2) 페이지 폴트 처리
: 프로세스가 처음으로 file-backed 페이지에 접근 시 페이지 폴트 발생, 이 때 운영체제가 해당 파일의 적절한 부분을 읽어 메모리에 로드
3) 데이터 동기화
: 프로세스가 이 페이지들을 변경 시, 변경 사항은 나중에 파일 시스템에 다시 쓰여질 수 있다. 이를 통해 파일-메모리 간 데이터 동기화가 이루어짐

[Anonymous Page와 File-backed Page의 차이점]

📍 Swap Disk

: 물리적 메모리(RAM)이 가득 찼을 때 사용되는 디스크 기반의 보조 저장 공간으로, 운영체제가 사용하지 않는 프로세스의 메모리 페이지를 임시로 저장하는데 사용된다. (swapping)

[역할과 기능]
1. 메모리 확장 = swapping
물리적 메모리가 부족할 때 가상 메모리를 확장하는 역할
운영체제는 RAM에 여유가 없을 때, 사용되지 않는 메모리 페이지를 스왑 디스크로 이동시켜 RAM을 확보한다.
2. 페이지 교체
운영체제는 페이지 교체 알고리즘을 사용해 스왑 디스크로 이동할 메모리를 선택
스왑 디스크로 이동된 페이지는 다시 필요할 때 RAM으로 불러와진다, 이 때 다른 페이지가 스왑 디스크로 이동될 수도 있다.
3. 시스템 안정성
시스템이 메모리가 부족한 상황에서도 안정적으로 동작할 수 있도록 한다.
메모리가 부족하더라도 프로그램이 강제 종료되지 않고, 스왑 공간을 활용해 계속 실행된다.

[요약]
스왑 디스크는 물리적 메모리가 부족할 때, 사용되지 않는 메모리 페이지를 일시적으로 디스크에 저장하는 공간으로, 메모리 부족 문제를 완화시키며 동시 실행 프로세스 수를 증가시킬 수 있다. 또한 시스템 성능과 안정성을 유지하는데 중요한 역할을 한다.
그러나 디스크 기반의 스왑은 속도가 느리고, 과도한 사용은 시스템 성능 저하를 초래한다. (thrashing)
스왑 디스크의 크기와 위치를 적절하게 설정해 시스템 성능을 최적화하는 것이 중요

📍 Direct Memory Access (DMA, 직접 메모리 접근)

: CPU의 개입 없이 주변장치가 시스템 메모리(RAM)에 직접 데이터를 읽고 쓸 수 있게 하는 기능
이는 시스템 성능을 향상시키고 CPU의 부담을 줄이기 위해 사용된다.
DMA 컨트롤러가 데이터 전송을 관리하므로 CPU는 데이터 전송 작업에서 벗어나 다른 작업을 수행할 수 있게 된다.

DMA 컨트롤러: DMA 작업을 관리하는 하드웨어 컴포넌트로, 주변 장치와 메모리 간 데이터 전송을 관리한다.

[작동 방식]

1. 메모리 접근

  • 주변 장치 요청
    : 주변 장치가 전송할 준비가 되면, DMA 요청을 DMA 컨트롤러에게 보냄
  • 주소 설정
    : DMA 컨트롤러는 CPU가 지정한 메모리 주소를 사용해 데이터 전송
  • 데이터 전송
    : DMA 컨트롤러가 메모리와 주변 장치 간 데이터를 직접 전송하며, CPU는 관여하지 않음

2. 인터럽트 & 완료 신호

  • 전송 완료
    : 데이터 전송이 완료되면, DMA 컨트롤러는 CPU에 인터럽트를 보내 전송 완료를 알림
  • CPU 처리
    : CPU는 인터럽트를 받아 전송된 데이터를 처리하거나, 다음 작업 수행

0개의 댓글

관련 채용 정보