Symbolic Address / Logical Address / Physical Address
우리는 프로그램을 작성할 때, 변수명과 함수명을 통해 값에 접근합니다. 값에 접근하기 위해 사용되는 변수와 함수 이름을 Symbolic Address 라고 부릅니다.
이렇게 작성한 프로그램은 컴파일이 되면서 독자적인 공간을 가지게 됩니다. 이를 logical memory라고 하며, 가상의 공간이므로 virtual memory 라고도 불립니다. 일반적으로 logical memory는 0번지 부터 시작하여 상대적 주소로 표현되고, CPU는 logical address를 참조하여 명령을 내리게 됩니다.
프로그램과 데이터는 실제 메모리 주소에 올라가야 합니다. logical memory의 코드와 데이터들은 실제 메모리인 physical memory에 올라가게 되는데, 이 때 확정된 물리적 주소를 physical address라고 합니다.
메모리 관리의 가장 큰 이슈는 logcal memory(virtual memory)와 physical memory를 언제, 어떻게 연결할 것인가 입니다.
본 포스팅에서는 logical memory를 physical memory와 연결하여 physical address를 확정하는 시점의 종류에 대해 다룹니다.
소스 코드가 프로세스가 되는 과정
physical address가 확정되는 시점의 종류에 대해 다루기 전에, 소스 코드가 프로세스가 되는 과정을 알아야 합니다.
C언어를 사용하여 프로그램을 만드는 과정을 생각해봅시다. 먼저, *.c 파일로 소스코드를 작성할 것입니다. 이러한 소스코드를 gcc와 같은 컴파일러로 컴파일 하면, *.o 형태의 object 파일이 나옵니다. 링커라는 녀석은 여러 object 파일들과 라이브러리들을 연결하여 실행파일을 만듭니다. 실행파일을 실행하면 로더가 이를 메모리로 올려 프로세스가 될 수 있도록 합니다.
logical memory가 physical memory로 확정되는 시점의 종류는 소스코드를 컴파일하는 compile time, 실행파일을 메모리로 올리는 load time, 프로세스가 CPU에 올라가 실행되는 execution time 이 있습니다.
Compile time
소스 코드를 컴파일하여 logical memory가 생성될 때 실제 physical address를 확정하는 방식입니다. 실행파일을 메모리에 로드할 때는 compile time에 확정된 주소값을 그대로 사용합니다.
해당 방식은 compile time과 load time에서 오버헤드가 없다는 장점이 있습니다. 그러나 멀티프로세스 환경에서 해당 방식을 사용한다면 중복되는 메모리 주소가 할당 되는 경우 오류가 발생할 수도 있고, 메모리가 낭비될 가능성이 있습니다. 따라서 compile time 방식은 하나의 프로세스만 실행시키는 임베디드 장치 등에서만 사용합니다.
Load time
logical memory를 시작 주소가 0인 상대 주소로 표현하고, 이를 메모리에 로드할 때 실제 주소를 확정하는 방식입니다. logical memory에서 이미 상대적인 주소들은 모두 정해져 있으므로, 시작 주소만 확정해 준다면 나머지 주소들에 시작 주소를 더하여 physical address를 확정할 수 있게 됩니다.
위의 그림을 보면, 시작 주소가 0일 때의 98000번 주소는 시작 주소가 100000으로 확정될 때 자연스럽게 198000이 되는 것을 확인할 수 있습니다. 하지만, 프로그램을 로드할 때마다 메모리 주소를 모두 계산하여 확정해 주어야 하기 때문에 실제로는 쓰이지 않습니다.
Execution time
logical memory를 시작주소가 0인 상대 주소로 표현하고, 프로그램의 코드 라인이 실행될 때 physical memory를 확정하고 참조하는 방법입니다. 프로그램이 실행될 때마다 physical address를 할당하거나 확인해야 하기 때문에 하드웨어의 지원을 받아야 하는데, CPU의 명령에 포함된 logical address를 physical address로 변환하는 하드웨어를 MMU(Memory Management Unit)이라고 합니다.
MMU의 자세한 역할은 Demand Paging과 Page replacement를 공부한 이후 더 자세히 이해할 수 있습니다.
해당 포스팅의 링크를 첨부합니다.
'대딩 > 운영체제' 카테고리의 다른 글
메모리 관리_Demand paging, Page replacement algorithms(FCFS, LRU, LRU Approximation(NRU), LFU, MFU) (0) | 2022.06.21 |
---|---|
메모리 관리_Mapping(Contiguous allocation, Paging, Segmentation) (0) | 2022.06.16 |
Deadlock_Deadlock의 발생 조건 (0) | 2022.06.15 |
동기화_High level Synchronizations Tools(Semaphore, Mutex, Monitor) (0) | 2022.06.15 |
동기화_Low Level Synchronization Tools(Spin Lock, Disabling interrupts) (0) | 2022.06.14 |
댓글