Memory Management(Ⅰ- Address Binding)

2008/04/02 수요일. Memory Management(Ⅰ - Address binding)


 운영체제란? 무엇인가? 라는 물음에 흔히 "윈도(Windows)"라고 대답을 하곤 했었다.

컥! 하지만 조금 공부를 해보니 얼토 당토 않은 말이라는 것을 느꼈다.

 운영체제(Operating System)은 하드웨어와 사용자 프로그램 사이에서 자원의 활용을 극대화 하고 시스템을 비롯한 프로그램 사용을 용이하게 해주는 것 이다. 뭐... 쉽게 말해서 컴퓨터를 사람(개발자 혹은 사용자)이 편리하게 사용하게 해주는 시스템이다.

 언제나 무언가를 배우려고 하면 등장하는 뻔한 개념적 설명이다. 하지만 이러한 개념적 설명을 간과해서는 안된다. 왜냐하면, 우리가 운영체제를 비롯한 다양한 학문(하다못해 벡터의 내적과 같은 연산)을 배우는 과정에서 "우리가 이것을 왜? 배우는 거야?"라는 의문으로 시간을 낭비할 틈이 없기 때문이다. 더욱 중요한것은 그러한 개념을 알고 있어야. 지금 배우고 있는 이 지식을 차후에 재대로 활용을 할 수 있는 것이다.

 음... 그리고 조금더 공부를 해보니 운영체제란? ㅋㅋㅋ 역시 다시 "윈도(Windows)나 리눅스(Linux)"라고 대답한다.



 공룡은 이런 말을 했다. "운영 체제에 대한 완전한 정의는 없다. 운영 체제가 무엇인지보다는 운영체제가 무엇을 하는지에 의해 운영 체제를 정의하는 것이 더 쉽다." 라고,,,


어찌되었든!
지금부터 Operating System중 Memory Management부분을 정리해 보도록하자.

 왜냐면... 이부분이 가장 간지러운 부분이였거든!



Memory Management(Ⅰ - Address Binding)
-------------------------------------------------


 C언어의 초심자 시절. 입문서에는 다음과 같은 설명이 있었다.

 source file을 컴파일 해서 기계어로 되어 있는 object file을 만든다. 이러한 여러 object file들과 start-up code를 Link시켜 execution file을 만든다. 그렇게 만들어진 execution(실행) file을 실행하면 실행된다. 
 
 그리고 자료형과 함수 배열등을 배우는 동안 memory의 얼마를 차지하며 무슨 영역에 자리 잡는다는 등의 설명이 불쑥 튀어 나온다. 또한 일반적으로 많이 사용하는 지역변수 영역(stack)과 동적 할당 영역(heap)에 대해 언급하는 것이 주를 이룬다.

 하지만, 저러한 설명들은 뜬구름을 잡는 설명에 불과했다(적어도 나에겐). 뭔가가 간지럽지 않는가? ㅋㅋ 지금부터 그 간지러운 부분을 잡아 보도록하자.

 
 프로세스(간단히 말해서 실행중인 프로그램)가 생성되어 실행되기 위해서는 실행 프로그램 파일을 메모리(RAM)에 적재해야 한다. 왜냐?! 프로세스의 실행은 결국 CPU가 하는데 이 CPU는 Bus라는 녀석으로 Main-Memory와 연결되어 의사소통을 하기 때문이다. 이렇게 메모리에 적재 된 실행 프로그램 파일은 CPU에 의해 처리(?- 처리라고 해봐야 CPU와 Memory사이에선 읽기/쓰기만 할 뿐이다) 되며 비로소 프로세스라는 명칭으로 불릴 수 있는 것이다.
 하지만, 이러한 실행 프로그램 파일을 무턱대고 메모리에 적재하는 것이 아니라 C입문서에서 봐왔던 것처럼 [코드 영역][데이터 영역][스텍영역]으로 분류 되어 적재된다.

  ▷ 코드 영역:  기계어 코드로된 프로그램 실행코드가 적재 되는 영역이며 CPU는 이 영역의 명령을 읽어들여 차례로 프로그램을 수행하게 된다.  
  ▷ 데이터 영역: 전역변수아 같이 프로세스가 종료될 때까지 게속 사용되는 변수들을 위한 영역
  ▷ 스택 영역: 함수 호출 과정과 같이 임시로 존재하는 변수들을 저장하는 영역

[Figure.01] CPU에 의한 메모리 읽기/쓰기


 전형적인 명령어 실행은 먼저 메모리로 부터 한 명령어를 가져오는 데서부터 시작된다. 명령어를 읽어오는 과정에서는 명령어 주소 레지스터(IP: Instruction Pointer, 또는 PC: Program Counter)에 있는 코드 영역의 주소를 메모리에 전달하고 읽기 작업을 실행한다. 그 다음 명령어를 해독하고, 메모리에서 피연산자(operand)를 가져와 피연산자에 대해 명령어를 실행한 후에 계산 결과를 메모리에 다시 저장한다. 전역 변수에 대응되는 데이터 영역의 주소나 스택 주소 레지스터(SP: Stack Pointer)에 기록된 스택 영역의 주소를 메모리에 전달하고 읽기나 쓰기 작업을 실행한다.

 이처럼 CPU가 Memory를 읽거나 쓰는 작업을 하기 위해선 메모리에 로드 된 실행프로그램파일의 명령코드나 데이터의 저장 주소를 알아야 한다. 즉, [Figure.02]와 같이 소스프로그램이 메모리에 적재될때까지의 과정중에 저장되어야 할 코드의 주소들은 여러가지 다른 표현 방식을 거치게 되고, 코드 영역이나 데이터 영역이 적재될 주소가 결정되면, 코드 영역의 내용 중에 함수의 주소나 변수의 주소가 있는 부분을 결정된 주소에 맞게 수정해야 하며 이러한 작업을 주소 바인딩(address binding)이라고 한다.


[Figure.02] 소스파일에서 메모리 적재 까지의 처리 과정



 소스 프로그램에서 주소는 숫자가 아닌 심볼 형태로 표현되고, 컴파일러는 이 심볼 주소를 재배치 가능 주소(예를 들면 "이 모듈의 첫번째 바이트로부터 열네번째 바이트 주소")로 바인딩시키고, 추후에 연결 편집기(linkage editor)나 로더(loader)가 이 재배치 가능 주소를 절대 주소(예를 들면 74014번지)로 바인딩 시킨다. [Figure.03]의 화살표 좌측은 C언어의 소스파일로서 각 변수나 함수가 숫자가 아닌 심볼 형태로 되어 있음을 보여주고, 화살표 우측은 실행 프로그램 파일로서 실제로는 기계어 코드가 기록되지만 이해를 돕기위해 편의상 어셈블리 언어로 예를 들었다. 화살표 우측을 보면 알겠지만 명령어 코드는 [코드영역]에 자리잡고 전역변수인 val은 [데이터 영역]에 자리하고 있음을 알수 있다. 이 파일에는 전역변수 val과 함수 func의 주소가 결정되지 않은 상태인 재배치 가능 주소의 형태로 볼수 있다. 추후 이 재배치 가능 주소는 절대 주소로 바인딩 된다.


[Figure.03] 컴파일된 실행 프로그램 파일



[Figure.04] 적재된 주소에 따른 주소 바인딩


 
 [Figure.04]에서 보이는 예와 같이 [Figure.03]의 파일이 메모리의 1000번지부터 적재하여 변수 val의 주소는 1200, 함수 func의 주소는 1030번지로 결정되었다고 하면 변수 val을 참조하는 모든 부분을 1200으로 변경하고 함수func를 참조하는 모든 부분을 1030으로 변경하는 주소 바인딩 작업을 해주어야 한다.


 또한, 메모리 주소 공간에서 명령어와 데이터의 바인딩은 그 바인딩이 이루어지는 시점에 따라 다음과 같이 구분된다.

    1. 컴파일 타임(compile time) 바인딩
          프로세스가 메모리 내에 들어갈 위치를 컴파일 시간에 미리 알 수 있으면 컴파일러는 절대 코드를 생성할 수 있다. 예를 들면 사용자 프로세스가 R번지부터 시작한다는 것을 미리 알 수 있다면 컴파일러는 번역할 코드를 그 위치에서 시작해 나간다. 그러나 만일 이 위치가 변경되어야 한다면 이 코드는 다시 컴파일 되어야 한다. 예)MS-DOS의 .COM양식 프로그램
    2. 적재 시간(load time) 바인딩:
          컴파일 시점에서 메모리 적재 위치를 알지 못하면 컴파일러는 일단 이진 코드를 재배치 가능 코드로 만들고 심볼과 진짜 번지와의 바인딩은 프로그램이 메모리로 실제로 적재되는 시간에 이루어지게 된다. 이렇게 만들어진재배치 가능 코드는 시작 주소가 변경되면 아무 때나 사용자 코드를 다시 적재하면 된다.
    3. 실행 시간(execution time) 바인딩 :
          프로세스가 실행하는 중간에 메모리 내의 한 세그먼트로부터 다른 세그먼트로 옮겨질 수 있으려면 "바인딩이 반드시 실행 시간까지 연기되어야 한다". 요즈음 대부분의 운영체제는 이 방식의 바인딩을 체택하고 있다.

지금까지 Address Binding의 대략적인 내용을 다루었다. 다음엔 위에서 언급한바 실행시간 바인딩 기법을 가능하게 하는 특별한 하드웨어인 MMU(Memory Management Unit)에 대해서 알아본다.


참고문헌]

▶ Operating System | 김용석 저 |사이텍미디어
▶ Applid Operating System Concepts| Silberschatz, Galvin, Gagne 원저| 조유근, 고건, 김영찬 공역 |홍릉과학출판사

 

by 케간지무늬 | 2008/04/03 11:24 | ▶▷OperatingSystem◁◀ | 트랙백 | 덧글(3)

트랙백 주소 : http://m00nee.egloos.com/tb/208286
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by ^^ at 2008/04/17 21:08
잘보고 갑니다.
간지럽던 부분이 시원해 졌네요 ^^
Commented by 케간지무늬 at 2008/05/13 00:51
네~ ^^
근데... 전 또 간지러운 부분이 생겼어요. ㅜ.ㅜ
그럼. 열공 하세요~
Commented by 슬기=ㅁ=ㅋㅋ at 2008/05/30 00:28
뭐라고 써져 있는지 모르겠다-ㅁ-;;;ㅋㅋ
그리고 오빠 바보-ㅁ-
블로그 관리좀 하시죠ㅋㅋㅋㅋ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶