본문 바로가기

CS

Ch2. Operating System Overview (3/3)

Address Binding

프로세스의 주소(Address)는 논리적 주소(Logical Address)와 물리적(Physical Address)로 나뉩니다.  논리적 주소는 가상 주소(Virtual Address)라고도 하며, CPU가 생성하는 주소입니다. 프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스의 내부에서 사용하고, 각 프로세스마다 0부터 시작합니다. 물리적 주소는 프로세스가 실행되기 위해 실제로 필요한, 실제로 메모리(RAM)에 올라가는 위치를 말합니다.

 

Address Binding은 어떤 프로그램이 메모리의 어느 위치에, 즉 어떤 물리적 주소에 load될지를 결정하는 과정입니다.  이는 binding 시점에 따라 compile time, load time, execution time(run time)으로 분류됩니다.

 

1. compile time binding

 

프로세스의 물리적 주소가 컴파일 때 정해진다. 프로세스가 메모리의 어느 위치에 들어갈지 미리 알고 있다면 컴파일러가 절대 주소 (Absolute address), 즉 고정된 주소를 생성한다. 따라서 만약 위치가 변경된다면 재컴파일을 해야한다.  컴파일 타임 주소 할당은 프로세스 내부에서 사용하는 논리적 주소와 물리적 주소가 동일하다. 컴파일 타임 주소 할당의 문제점은, 주소가 고정되어 있기 때문에 메모리 상에 빈 공간이 많이 발생할 수 있어 비효율적이고, 로드하려는 위치에 이미 다른 프로세스가 존재할 수 있다.

 

2. Load time binding

 

프로세스가 메모리의 어느 위치에 들어갈지 미리 알 수 없다면 컴파일러는 Relocatable code를 생성해야 한다. Relocatable code는 메모리의 어느 위치에서나 수행도리 수 있는 기계언어 코드이다. 그리고 Loader가 프로세스를 메모리에 load하는 시점에 물리적 주소를 결정한다. 따라서 로드타임 주소 할당은 논리적 주소와 물리적 주소가 다르다. 하지만, 프로세스 내에 메모리를 참조하는 명령어들이 많아서 이들의 주소를 다 바꿔줘야하기 때문에 로딩할 때 시간이 매우 커진다는 단점이 존재한다. 따라서 compile time binding과 Load time binding은 실제로 잘 쓰이지 않는다.

 

메모리 관리는 CPU 자원만큼 컴퓨터를 사용하는데 매우 중요한 자원입니다. 메모리를 최대한 효율적으로 관리하기 위해 매우 다양한 방법이 연구되고 있고, 운영체제 기능에서도 매우 중요한 위치를 차지합니다. 메모리는 Address와 Data로 구성되어 있습니다. 

 

3. Execution Time(Run time)

프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꾸는 방법이다. 즉 Runtime때에 물리적 주소가 결정되며 실행 도중에 주소가 바뀔 수 있다. CPU가 주소를 참조할 때마다 address mapping table을 이용하여 binding을 점검한다.

 

런타임 할당은 MMU(Memory Management Unit)이라는 하드웨어 장치를 사용하여 논리적 주소를 물리적 주소로 바꿔준다. 프로세스가 CPU에 수행되면서 생성해내는 모든 값에 대해서 base register의 값을 더해주어 물리적 주소를 생성하는 방식이다. base register는 하나이므로 프로세스 끼리 공유한다.

 

 

Swapping

메모리는 크기가 크지 않기 때문에 프로세스를 임시로 보냈다가 다시 메모리에 로드해야 하는 상황이 생깁니다. 이 때 디스크로 내보내는 것을 swap out, 메모리로 들여보내는 것을 swap in 이라고 합니다. 일반적으로 중기 스케줄러에 의해 swap out 시킬 프로세스를 선정하여, 우선 순위에 따라 어떤 프로세스를 swap in/out 할지 결정합니다. 우선 순위가 낮은 프로세스를 swap out 시키고, 높은 프로세스를 메모리에 올려놓는 방식입니다.

 

CPU는 주소를 가지고 메인 메모리에 요청을 하거나 해당 주소에 계산 결과를 저장하고, 메모리는 요구하는 주소에 저장되어있는 데이터를 CPU에게 전달합니다. 만약 Compile time이나 Load time binding인 경우 원래 메모리 위치로 swap in 해야 하고, Execution time binding인 경우 추후 빈 메모리 영역 아무 곳에나 올릴 수 있다. swap 하는데 걸리는 시간의 대부분은 디스크 전송 시간이다. 

 

 

MMU (Memory Management Unit)

다중 프로그래밍 환경에서는 여러 프로그램이 메모리에 올라가고 내려가고를 반복하기 때문에, 한 프로그램은 고정적인 공간을 사용할 수 없습니다. 이를 해결해주는것이 MMU(Memory Management Unit)입니다. MMU에는 프로그램이 메모리에 할당될 때마다 다른 주소공간을 사용하기 때문에 재배치 레지스터 (Relocation Register)가 존재합니다.

 

MMU

MMU는 이전에 메모리 보호를 위해 base와 limit레지스터를 갖습니다. 이는 CPU에서 주소를 사용하는데 이 주소가 해당 프로그램의 base나 limit범위를 벗어나면 인터럽트가 발생하여 그 프로그램을 강제로 종료시킵니다. MMU는 이 기능 이외에도 재배치 레지스터를 사용해서 프로그램이 어느 주소를 사용하더라도 실제 메인 메모리에 할당된 주소를 찾아갈 수 있도록 address translation동작을 수행합니다. CPU는 프로그램에 설정된 주소를 계속 사용하고 메모리에 명령을 보내지만, MMU에 의해 실제로 프로그램이 할당된 메모리 주소로 변환해서 사용할 수 있는 것이죠. 그 결과, 프로그램의 실제 메모리 주소 공간의 위치는 CPU에 전혀 영향을 미치지 않고 정상적으로 사용할 수 있습니다.

 

Virtual Memory

기존에는 프로세스가 실행하는 코드 전체를 메모리(RAM)에 로드했고, 메모리 용량보다 더 큰 프로그램은 실행시킬 수 없었습니다. 하지만 실제로는 코드의 일부에서만 대부분의 시간을 사용하고, 프로세스는 특정 순간에는 항상 작은 양의 주소 공간을 사용했기 때문에 아래와 같은 단점이 존재합니다.

 

  • 주 기억장치보다 더 큰 프로그램은 실행할 수 없다.
  • 프로그램이 실행될 때 다른 작업은 할 수 없다.

가상 메모리는 물리 메모리가 가지는 크기의 한계를 극복하기 위해 각 프로세스에서 현재 실행에 필요한 부분만 메모리에 적재하고 나머지는 디스크에 두는 것을 말합니다. 이를 통해 프로세스 전체가 물리적 메모리에 있는 것처럼 수행되는, 즉 물리적 메모리가 훨씬 많이 있는 것처럼 보이게 됩니다. 결과적으로 메모리에 작은 양의 주소 공간만 있으면 프로세스를 충분히 수행하고 그에 따라서 더 많은 프로그램을 동시에 실행할 수 있게 됩니다. 이와같이 현재 필요한 page만 메모리에 올리는 것을 Demand Paging이라고 합니다.

 

'CS' 카테고리의 다른 글

쉽게 배우는 운영체제 | ch8. 가상 메모리 기초  (0) 2022.06.18
Ch12. File Management  (0) 2022.06.09
Ch2. Operating System Overview (2/3)  (0) 2022.06.05
Ch2. Operating System Overview (1/3)  (0) 2022.06.04
Ch1. Computer System Overview  (0) 2022.06.04