diff --git a/_posts/fast/2024-10-25-os.md b/_posts/fast/2024-10-25-os.md index f4f9d62..15ebeed 100644 --- a/_posts/fast/2024-10-25-os.md +++ b/_posts/fast/2024-10-25-os.md @@ -65,7 +65,7 @@ use_math: true 1. [ROM의 종류](#2-2-2-1-rom의-종류) 3. [캐시 메모리](#2-2-3-캐시-메모리) 1. [지역성](#2-2-3-1-지역성) - 4. [메모리 구조와 주소](#2-2-4-메모리-구조와-주소) + 4. [논리 주소와 물리 주소](#2-2-4-논리-주소와-물리-주소) 3. [보조기억장치](#2-3-보조기억장치) 4. [입출력장치(I/O)](#2-4-입출력장치io) 5. [버스](#2-5-버스) @@ -1076,7 +1076,34 @@ CPU가 메모리(RAM)에 자주 접근하면 그만큼 성능이 저하되나, > $\text{캐시 적중률(%)} = \left( \frac{\text{캐시 히트 수}}{\text{전체 메모리 접근 수}} \right) \times 100$ {: .prompt-info } -### 2-2-4. 메모리 구조와 주소 +### 2-2-4. 논리 주소와 물리 주소 + +앞서 메모리에 접근한다 하면 컴퓨터 내에 하나의 RAM에 접근하는것이라고 설명했다. 하지만 컴퓨터는 두가지의 주소 체계를 사용하는데, 바로 **논리 주소(Logical Address)**와 **물리 주소(Physical Address)**이다. + +먼저 **물리 주소**는 물리적인 RAM의 주소를 의미한다. 즉, RAM의 실제 주소를 의미한다. 여태 "12번지의 데이터"라고 했을때, 이 12번지가 바로 RAM의 물리주소를 의미했었다. + +하지만 프로그램 내에선 논리 주소를 사용하는데, **논리 주소**는 CPU와 프로그램 내에서 사용되는 주소 체계다. +실행되는 프로그램엔 각각 0번지 부터 시작하는 주소가 할당된다. 반면 물리 주소는 이러한 구분 없이 0번지부터 시작한다. + +때문에 어떤 프로그램 내에서 "12번지" 라고 하면 이는 논리 주소를 의미하며, 물리 주소에선 다른 주소일 수도 있다. + +이렇게 논리 주소를 물리 주소로 변환해야 하는데, 이를 변환하는 장치를 **메모리 관리 장치(Memory Management Unit, MMU)**라고 한다. 간단하게 설명하면 논리 주소 "12번지"를 물리 주소로 변환하려면 물리 주소에서의 프로그램의 시작점을 더한다. + +예를 들어 어떠한 프로그램이 물리 주소 100번지부터 시작한다고 하면, 이 프로그램의 논리 주소 12번지는 물리 주소 112번지가 된다.[^lapa1] + +--- + +논리 주소와 물리 주소로 나누는 이유는 여러가지가 있는데, 가장 큰 이유는 프로그램의 주소 변동과 메모리 보호 때문이다. + +프로그램이 실행될 때마다 매번 메모리 주소가 변동하는데, 이때 논리 주소를 사용하면 프로그램의 주소 변동에 따라 물리 주소를 MMU를 통해 변환해주기만 하면 되기 때문에 편리하다. + +또한 논리 주소를 사용하면 메모리 보호도 쉽게 가능하다. +예를 들어, 프로그램 A는 물리 주소 100번지 ~ 150번지를 사용하고, 프로그램 B는 200번지 ~ 250번지를 사용한다고 하자. + +만약 프로그램 A가 70번지 데이터를 사용하려고 한다면, 이는 논리 주소이기 때문에 MMU를 통해 물리 주소로 변환되어 물리 주소 170번지로 변환된다. +하지만 프로그램 A는 물리 주소 150번지까지만 사용하므로, 170번지에 접근하려고 하면 Segmentation Fault 에러가 발생한다. + +이처럼 논리 주소를 사용하여 메모리 보호를 할 수 있으며, 프로그램의 주소 변동에도 유연하게 대처할 수 있다. ## 2-3. 보조기억장치 @@ -1109,3 +1136,4 @@ CPU가 메모리(RAM)에 자주 접근하면 그만큼 성능이 저하되나, [^risc1]: 실제론 RISC의 명령어가 더 적거나 하진 않을 수 있다. 하지만 주소 지정 방식이 CISC보다 단순하여 명령어 처리에 효율적이다. [^risc2]: 실제로 전력 소모면에선 임베디드를 제외하면 큰 차이가 없긴 하다. [^ram1]: 프로그램의 명령어들과 프로그램이 가지고있는 데이터를 의미한다. +[^lapa1]: 프로그램의 시작점의 물리 주소를 가지고 있는 레지스터가 베이스 레지스터이다.