• [운영체제] 메모리 주소 바인딩

    2021. 9. 8.

    by. KimBangg

    머릿말

     

    모든 프로세스는 메모리에 적재 되어야 작동이 될 수 있기 때문에, 매우 비싼 자원으로 여겨집니다.

    그렇기 때문에 주어진 메모리를 최대한 활용하는 것이 중요한데요. 

     

    그리하여, 오늘은 [ 메모리 바인딩과 메모리 관리 전략 ] 에 관해 포스팅을 하고자 합니다.

     

     

     

    메모리 주소 바인딩 ( Memory Address Binding )

     

    위에서 이야기 했던 내용처럼, 프로세스가 실행 되기 위해서는 "메모리" 에 적재가 되어야 합니다.

    하지만 이 때 직접적인 주소 값을 받는 것이 아닌 논리적 주소를 할당 받게 되는데요. 이 때 논리적 주소를 진짜 주소와 맵핑을 해주는 것을 메모리 주소 바인딩 이라고 합니다.

     

    더보기

    여기서 잠깐 ! 그렇다면 왜 최초에 논리적 주소만을 받고 이를 맵핑 하는걸까요?

     

    만약, 직접 주소를 각 프로세스에게 부여 하게 된다면 다른 프로세스가 점유하고 있는 메모리 공간에 접근했을 때 데이터를 망가트리는 문제가 발생 하겠쬬?

     

    이러한 문제를, 논리적 주소를 할당하는 방법으로 전환함으로써 운영체제가 적절히 관리할 수 있도록 하는 것이지요bb

     

    메모리 주소 바인딩의 종류는 실제 주소와  논리적 주소를 연결하는 타이밍 로 구분하여 [ 컴파일, 로드, 실행 타임 ] 총 3가지가 존재합니다.

     

     

    - 컴파일 타임 바인딩 ( Compile Time Binding )

     

    컴파일 타임에 바인딩 되는 것은 쉽게 말해서 처음부터 논리적 주소와 실제 주소를 같은 것을 의미합니다.

     위에서 언급했던  것처럼 [같은 메모리 주소를 참조하는 경우] 문제가 발생하고, 이러한 문제를 해결 하기 위해 새로운 주소를 할당 하기 위해서는 다시 컴파일을 하는 비효율적인 작업을 해주어야 합니다.

     

    그렇기 때문에, 이러한 방식은 하나의 프로세스에서 사용이 가능하고 멀티 프로세스를 지원하는 현대에는 적절한 로드 방법이 아닙니다.

     

     

     

     

    - 로드 타임 바인딩 ( Loading Time Binding )

     

    프로그램이 실제 메모리에 로드 될 때, 메모리를 맵핑 하는 것을 의미합니다. 그렇기 때문에, 처음에 부여되는 논리적 주소는 물리적 주소와 다르고, 멀티 프로세스 환경에 용이합니다.

     

    로더(loader)의 책임 하에 물리적 메모리 주소가 부여되며, 프로그램이 종료될 때까지 물리적 메모리 상의 위치가 고정됩니다.

    ( 여기서 로더는 프로세르를 메모리에 적재하는 역할을 수행합니다. )

     

    하지만, 주소 값을 변경하는 명령어를 수행 함에 있어서 긴 로드 타임을 요구하기에 사용 되지 않는 방법입니다.

      

     

    - 실행시간 바인딩(execution time binding or run time binding)

     

    프로그램이 실행 이후에도, 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식입니다. CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블을 이용해 주소 바인딩을 점검합니다.

     

    실행시간 바인딩은 프로세스가 메모리에 연속적(Continuous) 으로 적재 되이 있음을 가정합니다.

    ( Continous Allocation 은 아래의 글에서 자세히 다루겠습니다 )

     

    기존 바인딩과는 다르게  기준 레지스터와 한계 레지스터를 포함한 MMU라는 하드웨어적인 지원이 요구됩니다.

     

       

    - MMU의 작동방식  

     

    MMU는 [ 논리적 주소 +  기준 레지스터 ] 를  함으로써 실제 주소를 찾아주는 역할을 수행합니다.

    하지만, 멀티 프로세스 환경에서는  위와 같이 작업을 했을 때, 다른 프로세스를 가리키는 상황이 발생 할 수도 있는데요. 이러한 상황을 한계 레지스터에 저장되있는 최대 값과 비교하여 이를 초과하면 "트랩"을 발생 시킵니다.

    *용어정리
    기준 레지스터: 프로세스의 물리적 메모리의 시작 주소를 가지고 있다.
    한계 레지스터: 현재 CPU에서 수행중인 프로세스의 논리적 주소의 최대값, 프로세스의 크기를 가지고 있다.
    MMU: 논리적 주소를 물리적 주소로 맵핑해주는 하드웨어입니다.

     

     

     

    - 로드 타임 바인딩 vs 실행 시간 바인딩

     

    로드 타임은 메모리에 로딩할 때 주소 변환 작업을 미리 다 해놓지만, 실행 시간 바인딩은 실행 할 때만 수행합니다.

    즉, 로드타임은 한 번만 바꿔 놓게 되면 똑같은 해당 주소로 접근하면 됩니다. 그러나 실행 시간 바인딩의 경우 변환 작업을 수행하고 메모리에 접근하게 됩니다. 내용만 본다면 로드 타임이 더 효율적으로 보이지만, 하드웨어 성능이 높아 짐에 따라 MMU 을 이용하는 실행 시간 바인딩이 선호됩니다.

     

     

     

     

     

    출처

     

    https://stackoverflow.com/questions/29771977/purpose-of-logical-address

     

    Purpose of logical address?

    What is the purpose of logical address? Why should CPU generate logical address? it can directly access relocatable register base address and limit to exe a process. Why should MMU make a mapping b...

    stackoverflow.com

     

    댓글