봉황대 in CS

[Chapter 8. 메모리 관리 전략] 주소 결속과 메모리 보호 본문

Computer Science & Engineering/Operating System

[Chapter 8. 메모리 관리 전략] 주소 결속과 메모리 보호

등 긁는 봉황대 2022. 7. 30. 20:51

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

주소 결속 (Address Binding)


프로그램은 이진 실행 파일 형태로 디스크에 저장되어 있다.

 

주 메모리와 프로세서 자체에 내장되어 있는 레지스터들은 CPU가 직접 접근할 수 있는 유일한 범용 저장장치이기 때문에

모든 실행되는 명령어와 데이터들은 주 메모리와 레지스터에 있어야 한다.

 

즉, 프로그램이 실행되기 위해서는 주 메모리로 올라와 "프로세스"가 되어야 한다.

 

 

아래의 그림은 프로그램이 주 메모리에 올라가기 위해서 거쳐야 하는 과정을 나타낸 것이다.

 

 

일반적으로 컴파일(compile)과 링킹(linking)을 거쳐서 만들어진 exe 파일 또는 loadable 파일 내의 모든 주소는 논리 주소이다.

논리 주소(logical address)는 CPU가 생성하는 주소이다.

 

메모리 상에서의 실제적인 주소는 물리 주소(physical address)이기 때문에

어느 시점에 논리 주소를 물리 주소로 변환하는 체계가 필요하다.

 

논리 주소가 물리 주소로 확정되는 것을 주소 결속(address binding)이라고 한다.

 

주소 결속 시점

주소 결속 시점은 명령어나 데이터가 메모리 주소 공간에서 결속이 이루어지는 시점에 따라 구분된다.

 

1. 컴파일 시점 결속 (compile time binding)

프로세스가 특정 물리 주소인 R번지부터 시작하는 것을 컴파일 시간에 미리 알 수 있을 경우,

컴파일러가 물리 주소(절대 주소)를 생성할 수 있다.

(논리 주소 = 물리 주소)

 

하지만 만약 R번지가 변경된다면 해당 코드는 다시 컴파일되어야 한다.

 

 

2. 적재 시점 결속 (load time binding)

프로세스의 적재 시점에 시작 주소가 확정되면 코드 내 논리 주소(상대 주소)들을 물리 주소로 변환하여 적재한다.

(논리 주소 = 물리 주소)

 

 

3. 실행 시점 결속 (execution time binding)

프로세스가 먼저 논리 주소로 적재된 후 실행 중에 물리 주소가 확정된다.

(논리 주소 != 물리 주소)

 

CPU가 프로그램을 수행하며 특정 메모리에 접근하기 위해 사용하는 주소는 논리 주소(가상 주소, virtual address)이다.

 

실행 시 하드웨어의 지원을 받아 논리 주소를 물리 주소로 변환(mapping)하는 작업을 진행하는데,

이 작업을 진행하는 하드웨어 장치는 메모리 관리기(MMU, Memory Management Unit)이다.

 

* 재배치(relocation) 레지스터 = 기준 레지스터

   기준 레지스터에 저장되어 있는 값은 주소가 메모리로 보내질 때마다 그 모든 주소에 더해진다.

 

 

컴파일러 시점 또는 적재 시점 결속 시, 프로세스가 적재된다면 그 후에 재배치가 불가능하지만

실행 시점 주소 결속 시에는 프로세스 재배치 및 부분 적재가 가능하다.

ex. 동적 연결 라이브러리 (Dynamic Linking Library, DLL)

 

즉, 주소 결속 시점이 늦어질수록 메모리 경영의 유연성은 높아진다.

 


* 동적 연결 라이브러리 (Dynamic Linking Library, DLL)

 

동적 연결이란, 연결(linking)이 실행 시기까지 미루어지는 것이다.

즉, 동적 연결 라이브러리는 사용자 프로그램이 실행될 때 연결되는 시스템 라이브러리들을 말한다.

 

동적 연결에서는 라이브러리를 부르는 곳마다 스텁(stub)이라는 코드 조각이 생긴다.

 

스텁은 실행될 때 필요한 라이브러리 루틴이 메모리에 존재하는지 검사하게 된다.

만약 메모리에 존재하지 않는다면 그것을 디스크에서 가져와야 한다.

 

스텁은 검사를 통해 그 라이브러리 루틴의 번지수를 알아내고, 자신을 그 루틴의 번지로 대체하게 된다.

이를 통해 다음번에 그 라이브러리 루틴이 불리면 또다시 동적 연결을 할 필요 없이 직접 그곳의 라이브러리 루틴을 수행하면 된다.

 

따라서 같은 라이브러리를 10개의 프로세스가 사용한다고 해도, 해당 라이브러리 코드는 한 개만 있으면 된다.

 

결속 방식에 따른 메모리 경영 기법의 분류

분류 요소는 다음과 같다.

 

  1. 논리적 주소 공간과 물리적 주소 공간 간의 크기
  2. 사상(mapping) 함수가 취급하는 단위 (= 사상 단위)
  3. 프로그램 전체 적재 또는 부분 적재 여부

 

분류 공간 크기 사상 단위 적재 단위
분할 방법 논리 = 물리 전체 프로그램 전체 프로그램
페이징 / 세그먼테이션 논리 = 물리 페이지
(세그먼트 기법은 가변 크기)
전체 프로그램
가상 메모리 논리 > 물리 페이지 프로그램 일부 적재

 

* 논리적 주소 공간 (logical address space) : 프로그램에 의해 생성된 모든 논리 주소의 집합

* 물리적 주소 공간 (physical address space) : 해당 논리 주소와 일치하는 모든 물리 주소의 집합

 

메모리 보호


메모리는 각각 주소가 할당된 일련의 바이트들로 구성되는데, 각각의 프로세스들은 독립된 메모리 공간을 가지도록 보장해야 한다.

 

즉, 개별적인 메모리 공간을 분리하기 위해서

특정 프로세스만 접근할 수 있는 합법적인(legal) 메모리 주소 영역을 설정하고

프로세스가 합법적인 영역만을 접근하도록 하는 것이 필요하다.

 

 

이를 위해서 기준 레지스터와 상한 레지스터를 사용한다.

 

기준(base) 레지스터 : 가장 작은 합법적인 물리 메모리 주소의 값을 저장

상한(limit) 레지스터 : 주어진 영역의 크기(범위 값)를 저장

 

 

CPU 하드웨어는 사용자 모드에서 만들어진 주소와 해당 레지스터 값들을 비교하여

만약 합법적인 메모리 주소 영역이 아니라면 트랩(trap)을 거는 것을 통해 메모리 공간의 보호가 이루어진다.

 

 

실행 시간 주소 결속 시 논리 주소에 대해서 상한(limit) 레지스터의 값으로 영역을 확인한다.

각각의 논리주소는 상한 레지스터가 지정한 범위 안에 존재해야 한다.

 

만약 논리 주소가 상한 레지스터 값의 범위를 벗어났다면 트랩을 걸어 분할 영역의 보호를 실현하며,

벗어나지 않았다면 MMU가 해당 논리 주소에 재배치 레지스터의 값을 더하여 물리 주소로 변환하고 그 주소를 메모리로 보낸다.

 

재배치 레지스터는 위에서 언급한 바와 같이, 각 프로세스에 할당된 공간에 base 주소를 기록하여 기준 레지스터와 같은 역할을 한다.

 

CPU 스케줄러가 다음으로 수행할 프로세스를 선택할 때 디스패처(dispatcher)는 재배치 레지스터와 상한 레지스터에 값을 적재한다.

* 디스패처 : CPU의 제어를 단기 스케줄러가 선택한 프로세스에게 주는 모듈

 

이에 압축 기법에 의해 프로그램이 이동될지라도 재배치 레지스터의 값만 수정하는 것을 통해 주소 결속이 원활하게 이루어질 수 있다.

 

 

 

반응형
Comments