Published on

상대 주소 지정

Authors
  • avatar
    Name
    유사공대생
    Twitter

여러 프로그램을 동시에 실행하려면 어떻게 해야 할까? 우선, 각 프로그램을 서로 전환시켜줄 수 있는 관리자 프로그램이 필요하다. 이런 프로그램을 운영체제 또는 운영체제 커널(kernal)이라고 부른다. 우리는 OS와 OS가 관리하는 프로그램을 구분하기 위해 OS를 시스템 프로그램이라고 부르고 다른 모든 프로그램을 사용자 프로그램이나 프로세스라고 부른다.

image

여기서 OS는 타이머를 사용해 사용자 프로그램을 전환시켜 줄 때가 됐는지 판단한다. 이런 식으로 사용자 프로그램의 실행 시간을 조절하는 스케줄링(scheduling) 기법을 시분할(time slicing)이라고 부른다. 시분할 방식에서는 시간을 정해진 간격으로 나누고, 정해진 시간 간격 동안 사용자 프로그램을 실행한다. 사용자 프로그램 상태(state) 또는 문맥(context)는 레지스터의 상태와 프로그램이 사용중인 메모리의 상태를 뜻한다. 이때 메모리에는 스택도 포함된다.

image

이런 방법은 잘 작동하지만 아주 느리다. 프로그램을 메모리로 불러들이려면 시간이 걸린다. 프로그램을 메모리로 불러오되 위 그림처럼 각 프로그램에 각기 다른 공간을 허용할 수 있으면 훨씬 더 빠르게 시분할 실행이 가능하다.

위 예제에서 사용자 프로그램은 하나씩 차례로 메모리에 올라간다. 하지만 잠깐, 어떻게 이런 프로그램이 작동할 수 있을까? 전에 예로 든 컴퓨터는 절대 주소 지정(absolute addressing)을 사용했다. 절대 주소 지정은 명령어 주소가 특정 메모리 주소를 가리킨다는 뜻이다. 따라서 1000번지에서 실행되도록 만들어진 프로그램을 2000번지에 읽어 들이면 제대로 실행되지 않을 것이다.

image

어떤 컴퓨터들은 이런 문제를 인덱스 레지스터(index register)를 추가해 해결한다. 인덱스 레지스터를 사용하면 인덱스 레지스터의 값을 명령어에 들어있는 주소와 더해서 유효주소(effective address)를 계산한다. 사용자 프로그램이 1000번지에서 실행되도록 만들어졌다면, OS는 이 프로그램을 3000번지에서 실행하기 위해 인덱스 레지스터를 2000으로 설정할 수 있다.

이 문제를 해결하는 또 다른 방법은 상대 주소 지정(relative addressing)을 사용하는 것이다. 상대 주소 지정은 명령어에 들어 있는 주소를 0(대부분의 기계에서 메모리 시작 부분 주소가 0이다)부터 시작하는 위치로 해석하지 않고, 명령어의 주소를 기준으로 하는 상대적인 주소로 해석한다. 두 번째 명령어에 100(이진수로는 110100)이라는 주소를 볼 수 있 다. 상대 주소 지정을 사용해 같은 주소를 지정하려면 이 값이 99가 돼야한다. 왜냐하면 명령어가 들어 있는 주소가 1 이고 100이라는 주소는 1로부터 99만큼 떨어져 있기 때문이다. 마찬가지로 마지막 명령어는 주소 4로 분기하는 명령어인데, 이를 상대 주소로 표현하려면 -8이 들어가야 한다. 기계어에서 이를 직접 계산하는 것은 악몽에 가깝다. 하지만 요즘 프로그래밍 언어도 구들은 모두 이런 계산을 알아서 해준다. 상대 주소 지정을 사용하면 프로그램을 메모리의 원하는 위치로 자유롭게 재배치(relocate)할 수 있다