CPU가 직접적으로 접근할 수 있는 저장소는 메인메모리와 캐시, 레지스터 뿐
레지스터에 대한 접근은 하나의 CPU 클럭 사이클(또는 그 이하) 내에 완료됨
메인메모리에 접근하는 데는 레지스터에 접근하는 것보다 훨씬 더 오랜 시간이 소요됨. 이로 인해 "메모리 지연"이라는 현상이 발생할 수 있음
이러한 메모리 지연을 최소화하기 위해, 캐시는 CPU 레지스터와 주 기억장치 사이에 위치하여 데이터 접근을 가속화함
메모리가 전달받는 스트림은 주소 + 읽기 요청 또는 주소 + 쓰기 요청 + 데이터 2종류임
메모리 보호는 시스템의 정확한 작동을 보장하기 위해 필요함

base register와 limit register를 사용하여 프로세스의 논리적 주소 공간을 정의할 수 있음
위와 같은 구조로 하드웨어에서 주소를 검사한 뒤 유효한 주소만을 접근 허용함

✅ 그냥 내가 궁금해서 찾아본 거 (시험에 안나올듯)
- 소스 코드: 프로그래머가 원하는 기능을 가진 소스 코드를 작성
- 컴파일: 소스 코드는 컴파일러에 의해 컴파일되어 object 파일로 변환됩니다. 컴파일러는 소스 코드를 기계어로 번역하고, 함수 및 변수의 선언을 기록하는 object 파일을 생성합니다. 이 단계에서는 아직 모든 함수 및 변수가 정의되지 않은 상태입니다.
- 링킹: 링커는 여러 개의 object 파일을 하나의 실행 파일로 결합합니다. 링커는 각 object 파일에서 사용된 함수 및 변수의 정의를 찾아서 연결하고, 실행 파일에 필요한 외부 라이브러리와의 연결도 수행합니다. 이러한 과정을 통해 실행 파일이 완성됩니다.
- 로딩: 로더는 실행 파일을 메모리에 로드합니다. 메모리에는 프로그램의 코드, 데이터, 스택 등이 위치하게 됩니다. 로더는 실행 파일을 메모리에 배치하고, 프로그램의 시작 위치를 지정합니다.
- 실행: 로딩이 완료된 후에는 CPU가 프로그램의 시작 위치로 이동하여 프로그램을 실행합니다. 프로그램은 메모리에 로드된 코드와 데이터를 참조하여 작동하게 됩니다. 프로그램은 사용자의 입력이나 시스템의 이벤트에 따라 동작하며, 실행 중에는 CPU와 메모리를 사용하여 계산 및 데이터 처리 작업을 수행합니다.
프로그램에서 사용되는 주소(변수, 레이블 또는 함수)를 해당 주소의 실제 메모리 위치에 연결하는 프로세스
각각의 시간에 바인딩되는 주소 유형은 다음과 같다:
- 메모리 위치가
미리 알려져 있으면절대 코드를 생성할 수 있습니다.- 시작 위치가 변경되면 코드를 다시 컴파일해야 합니다.
- 메모리 위치가 컴파일 시간에 알려지지 않은 경우, 컴파일 타임에서 재배치 가능한 코드를 생성해야 합니다.
- 프로세스가 실행 중에 다른 메모리 세그먼트로 이동될 수 있는 경우, 바인딩은 실행 시간까지 지연됩니다.
- 주소 맵을 위한 하드웨어 지원이 필요합니다. (예: 기본 및 제한 레지스터)


프로그램 실행 시 필요한 루틴 또는 함수를 호출하기 전까지
해당 루틴이 메모리에 로드되지 않는기법
프로그램의 전체가 메모리에 올라와 있을 필요 없이 필요한 부분만 동적으로 로드됨
메모리 공간을 더 효율적으로 활용할 수 있으며, 사용되지 않는 루틴은 로드되지 않아 자원을 절약할 수 있음
특히, 드물게 발생하는 상황을 처리하기 위해 많은 양의 코드가 필요한 경우에 유용함
운영 체제로부터 특별한 지원이 필요하지 않으며, 프로그램 설계를 통해 구현됨
운영 체제는 동적 로딩을 구현하기 위한 라이브러리를 제공함으로써 도움을 줄 수 있음
실행 시간(execution time)까지 링킹을 연기하는 기법
동적 링킹을 하면 모듈들이 실행 가능한 이미지에 포함되지 않음
동적으로 링크된 라이브러리(DLLs)는 사용자 프로그램이 실행될 때 해당 프로그램과 링크되는 시스템 라이브러리임
정적 링킹은 라이브러리가 로더에 의해 이진 프로그램 이미지에 결합되는 방식과 달리, 동적 링킹은 실행 시에 필요한 라이브러리가 메모리에 로드되고 링크됨
동적 링크된 라이브러리는 여러 프로세스 사이에서 공유되며, 메인 메모리에는 DLLs의 단일 인스턴스만 존재함
운영 체제의 지원을 통해 여러 프로세스가 동일한 주소 공간에 접근할 수 있음
동적 링킹은 Windows 및 Linux 시스템에서 널리 사용되며, 특히 표준 C 라이브러리와 같은 시스템 라이브러리에 유용함
또한 시스템 라이브러리의 패치에 적용 가능성을 고려할 수 있으며, 버전 관리가 필요할 수 있음

연속 할당은 간단하고 직관적인 메모리 관리를 제공하지만, 외부 단편화와 제한된 유연성의 문제점이 있습니다. 가변 파티션 스키마는 이러한 제한 사항을 해결하기 위해 더 효율적인 메모리 할당과 활용을 가능하게 합니다.
External Fragmentation (외부 단편화)를 일으키는데, 이는 충분한 전체 메모리 공간이 요청을 충족시키지만 연속적이지 않은 상태를 의미함50-percent rule (50% 규칙)은 N개의 블록이 할당된 경우, 0.5N개의 블록이 단편화로 인해 손실되는 것을 의미함압축(compaction)프로세스의 물리적 주소 공간이 비연속적일 수 있도록 허용하는 메모리 관리 방식
Frame이라는 고정 크기의 블록으로 분할Page라는 같은 크기의 블록으로 분할
CPU가 생성하는 주소는 다음과 같이 나뉩니다:
p) : 페이지 테이블에 대한 인덱스로 사용되며, 페이지 테이블에는 물리 메모리의 각 페이지의 기본 주소가 포함됩니다.d) : 기본 주소와 결합되어 메모리 단위로 전송되는 물리 메모리 주소를 정의합니다.

다음과 같은 주소 관련 조건이 주어졌을 때의 페이징에 대해 설명합니다:
이 예제에서는 16바이트의 논리적 주소 공간이 4바이트 크기의 페이지로 나누어지고, 물리적 메모리는 32바이트로, 총 8개의 페이지(프레임)로 나누어집니다.

페이지 테이블은 프로세스당 데이터 구조로, 각 프로세스의 프로세스 제어 블록(PCB)에 페이지 테이블에 대한 포인터가 저장됩니다.
페이지 테이블 기본 레지스터(Page-table base register, PTBR)는 페이지 테이블을 가리킴페이지 테이블 길이 레지스터(Page-table length register, PTLR)는 페이지 테이블의 크기를 나타냄
TLB는 연관 메모리(Associative memory)를 이용한 고속 메모리 캐시입니다.
key(or tag), valuep가 연관 레지스터에 있다면, 프레임 번호를 추출주소 공간 식별자(Address-Space IDentifiers, ASIDs)를 저장주소 공간 보호를 제공TLB 미스가 발생하면, 그 값은 차후 참조를 위해 TLB에 로드됨대체 정책(Replacement policies)을 고려해야 하며, 예를 들어 최근에 가장 적게 사용된 것(Least Recently Used, LRU)을 대체고정(wired down)될 수 있음
TLB 내에서 페이지 번호가 발견되는 횟수의 비율을 '히트 비율(Hit Ratio)'이라 합니다.
EAT는 히트 비율에 따라 결정되며, 이는 페이지 번호가 TLB에서 발견되는 빈도를 나타냅니다. 히트 비율이 높을수록 EAT는 감소하며, 이는 시스템 성능 향상을 의미합니다.
각 프레임에 연관된
Protection bits (보호 비트)를 사용하여 읽기 전용인지 읽기-쓰기 모두 가능한지를 나타냅니다.
유효-무효 비트(valid-invalid bit)가 첨부됨:Valid(유효) - 연관된 페이지가 프로세스의 논리적 주소 공간 내에 있음; 합법적인 페이지Invalid(무효) - 페이지가 프로세스의 논리적 주소 공간 내에 없음이러한 메커니즘을 통해, 운영 체제는 각 프로세스의 메모리 접근을 제어하고, 불법적인 메모리 접근이 시스템을 손상시키는 것을 방지합니다.

14비트 주소 공간(0 ~ 16383)을 가진 시스템을 가정해봅시다.
이 예시에서, 각 페이지의 크기는 2KB이며, 전체 주소 공간을 8개의 페이지로 나눌 수 있습니다. 프로그램이 0에서 10468까지만 사용하기 때문에, 나머지 주소 공간은 보호됩니다. 이는 메모리 보호 메커니즘이 어떻게 프로세스의 불법적인 메모리 접근을 방지하는지를 보여주는 예시입니다.

여러 프로세스 간에 공유될 수 있는 페이지
이 메커니즘을 통해, 여러 프로세스는 필요한 공유 자원에 대한 접근을 최적화할 수 있으며, 동시에 개인 데이터와 코드는 안전하게 보호됩니다.
직접적인 방법을 사용하면 페이징에 대한 메모리 구조가 거대해질 수 있습니다.
해결책은 페이지 테이블을 더 작은 단위로 나누는 것입니다:
이러한 방법들은 페이지 테이블의 메모리 사용량을 효과적으로 줄이고, 메모리 관리를 효율적으로 수행할 수 있게 돕습니다.

논리적 주소 공간을 여러 페이지 테이블로 나눕니다.
이러한 계층적 페이지 테이블 구조는 메모리 사용량을 줄이고, 더 큰 주소 공간을 처리할 수 있게 합니다. 또한, 페이지 테이블을 페이지화하면 필요한 페이지 테이블만 메모리에 유지하고, 나머지는 디스크에 저장하여 메모리를 효율적으로 관리할 수 있습니다.


4KB 페이지 크기를 가진 32비트 머신에서 논리 주소는 다음과 같이 나눠집니다.
페이지 번호: 20비트
페이지 오프셋: 12비트
페이지 테이블이 페이지화되어 있으므로, 페이지 번호는 다시 10비트 페이지 번호와 10비트 페이지 오프셋으로 나눠집니다.
논리 주소는 다음과 같습니다:
외부/내부 페이지 테이블 크기:
이를 전방 매핑 페이지 테이블(Forward-mapped page table)이라고 부릅니다.

Hashed page table은 가상 페이지 번호를 해시 테이블에 해싱하고, 해당 위치에 체인의 요소들이 저장되며, 이 체인에서 매치되는 가상 페이지 번호를 찾아 해당 물리 프레임을 추출하는 방식으로 작동합니다.
이 해시 페이지 테이블 방식은 주소 공간이 매우 큰 시스템에서 페이지 테이블의 크기를 줄이는 데 효과적입니다.

프로세서 아키텍처가 64비트 가상 주소 공간으로 이동함에 따라, 우리는 페이지 테이블의 확장을 지원해야 합니다.
클러스터 페이지 테이블은 매우 크지만 희소하게 채워진 주소 공간을 효율적으로 관리할 수 있게 해줍니다.

Inverted Page Table은 가상 페이지를 물리적 프레임에 매핑하는 기존 방식 대신 물리적 메모리 프레임을 가상 페이지에 매핑하는 데이터 구조입니다
Inverted page table은 모든 물리 페이지 프레임을 추적하며, 각 엔트리는 실제 메모리 위치에 저장된 페이지의 가상 주소와 해당 페이지를 소유한 프로세스 정보를 포함하며, 페이지 참조 발생 시 테이블을 검색하여 주소를 찾습니다.

프로세스는 일시적으로 메모리에서 백업 스토어로 스왑될 수 있으며, 이후 계속 실행을 위해 메모리로 다시 가져올 수 있습니다.
대부분의 시스템에서, Linux 및 Windows를 포함하여, 프로세스 전체가 아닌 프로세스의 페이지를 스왑할 수 있습니다.