본문 바로가기

별걸다하는 IT/운영체제 OS

[운영체제 OS]Address binding 로드타임 바인딩(load time binding), 실행타임(execution time) 바인딩 (run time binding) 주소할당

안녕하세요 여러분

오랜만에 들고 온 운영체제 관련 글입니다. ㅎㅎ

 

[운영체제 OS 완전정복 목차]

 

저번 시간에는,

1. 물리적 주소란 (physical address)

2. 주소 바인딩이란 (Address binding)

3. 절대 코드란 (absolute code)

4. 컴파일 타임 바인딩 (compile time binding)

5. 컴파일 타임 바인딩의 문제 

6. 논리적 주소 엿보기 

이렇게 살펴봤었는데 기억나시나요?! ㅎㅎ

 

[운영체제 OS]Address Binding 주소 할당, 주소 바인딩, 논리적 주소(logical) vs 물리적 주소(physical), 컴파일 타임

[운영체제 목차] 안녕하세요~!! ㅎㅎㅎ 메모리 관련 문의글이 많아, 가장 기초적인 주소 할당부터, 그 종류, 페이징, 캐시메모리...쪽을 한번 먼저 쭉 다뤄볼까해요 ㅎㅎ 요새 기다려주시는 사람들이 있다는걸 알..

jhnyang.tistory.com

 

까먹으신 분들은 아래 포스팅 링크를 참조해주세요!

오늘은 컴파일 타임 바인딩에 이어서, 로드 타임 바인딩부터 시작합시다!

LOAD TIME BINDING

왼쪽이 logical address, 오른쪽 그림이 physical address

번째 알아볼 로드타임 바인딩입니다.

로드~~ 즉 로딩할결정!  말의 뜻은 뭐냐면 프로그램 내부에서 사용하는 주소하고 physical 주소하고 다르다는 거예요.

아까 컴파일 타임에서는 프로그램 내부에서 사용하는 주소를 physical memory주소랑 똑같이 해서 만든거죠. 

그런데 이거를 번지부터 시작 안하고 어디 다른 번지부터 하는거예요. 자자 위 그림만 봐도 왼쪽 data는 0x00098000에 있는데 오른쪽 data는 0x00198000에 있죠?

아두이노 같은 경우에는 프로그램 내부에서 사용하는 주소와 physical 주소하고 똑같다는 건대 지금 현재 로드타임부터는 프로그램 내부에서 사용하는 주소하고 physical RAM에서 사용하는 메모리 주소가 다릅니다.

 

그래서 프로그램 내부에서 사용하는 주소는 프로그램 내부의 메모리 시작을 0번지부터 해서 상대 주소라는 것을 써써요. data라는 것은 0번지에서 부터 98000 위치에 있으니까 (위 그림 참조) 프로그램을 메모리(RAM)에 로딩할 , 예를 들어 10만번지에다가 loading 하면 (기준점에 0에서 10만번지가 됨) data 주소는 당연히 98000 여기에다가 10만을 더하면 되겠죠?

 

그래서 데이터가 어디에 위치해 있어? 198000에 위치 있는겁니다. 

그러니까 여기에 있는 98000 198000으로 바꿔야 되죠. 이렇게 프로그램 안에서 사용하는 메모리에 주소를 프로그램 전체를 로딩 얘가 어디에 로딩되는지에 따라서 주소를 바꾼다는거죠. 이게 loading타임이예요.

 

출처: https://medium.com/@danny4410.eecs04/%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E7%AD%86%E8%A8%98-memory-5be6f0e66de4

load time binding이 상대주소로 가능한 이유가 위 그림에 나와있습니다

보면 MOVE 다음에 주소가 나오는게 아니라 .BS+0x18 이렇게 나와있죠? 기준으로부터 얼마만큼 옮겨가는지가써져있어요.

 

이렇게 주소가 변경되기 때문에 컴파일 타임 바인딩은 absolute code였다면 

load time binding은 relocatable code 특징을 띄게 됩니다.

로드 타임 바인딩시 주소 할당의 문제 

첫번째 프로그램 안에서 사용하는 주소하고 physical memory에서 사용하는 주소를 분리 했으니까 프로그램은 physical memory 어디에서나 loading 되어서 수행될 있죠.

컴파일 타임 바인딩과 다르게 multiprogramming가능한거예요. 

이게 5만 번지에 올라가도, 10만번지에 올라가도, 100번지에 올라가도 가능은 하다는겁니다. 

 

그런대 이거를 할려고 하면  프로그램 안에 code segment 명령어들이 엄청나게 많은데 여기에 메모리 참조하는 명령어도 엄청 많겠죠. 

그거를 바꿔줘야 한다는 거잖아요.  그러니까 메모리 로딩할 때 시간이 엄청 오래걸리는 문제가 발생합니다. 그래서 로딩타임에 메모리주소를 결정하는 방법은 실제로 안쓰이고 있어요.

 

로딩할때마다 모든 메모리 주소가 한번씩 다 바뀌어야 해요. 위에 사진보면 MOVE도 .BS+0x18 계산해서 0x2018로 변경해줬는데 바로 다음 아랫줄 CALL에서 또 계산해줘야하는.. 

이렇게 논리적 주소와 물리적 주소 분리를했어요, 분리를해서 지금 프로그램 아무데나 로딩을 해서 돌아가게끔 하는 방법은 좋은데, 올릴 주소를 한 번에 다 바꾸는 방법 말고 어떻게 하는 방법이 있을  있을까요? 더 좋은 대안이 있을까요? 그게 바로 마지막 세번째 주인공 런타임 바인딩입니다.

 

[정리]

출처: https://stackoverflow.com/questions/35729139/difference-between-compile-time-load-time-and-execution-time

EXECUTION TIME

마지막 바인딩 시점이 다가왔습니다~~! 이번에는 실행 시점에서 바인딩 하는 경우를 살펴볼거예요.

마지막 3번째는 실행할 때 바꾸는 방법입니다.

 

지금 프로그램이 위 그림안의 파란색 박스처럼 이렇게 코드가 짜여 있는데 이걸 컴파일을 해서 가운데에 있는 그림처럼 나왔어요. 현재 0번지부터 상대적으로 98000번지에 data가 있는거고  98000번지에 있는 data를 실행하는 건데,

물리적 주소 10만번지에 로딩되어서 동작할 수도 있잖아요 (앞에서 배운 로드타임 바인딩 잘 생각해보기) 

 

아무튼  명령어를 수행하는 순간 98000번지에다가 10 저장해야하는대 지금 현재 98000 실제로 198000 있죠.  98000 198000으로 명령어를 실행할 바꿔줘야해요. 그런대 지금 딱보니까 어떻게 하면 돼?! 베이스 주소가 10만이면 0에서 10만으로 변경된거니까 10만을 더해주면 될거잖아요. 98000에 10만을더해서 198000으로 만들면 됩니다.

 

근데 문제는 뭐야? 그러면 명령어를 실행하기 위해서 더하기를 실행을 해야 하죠. 그럼 이거는 software 실행하는 걸까 hardware 실행하는 걸까? Hardware 실행하는 겁니다. 명령어를 수행하기 위해서는 operation 수행하는 hardware 별도로 있어야 해요. 그래야지 주소를 그때그때 변환시켜서 변환된 주소를 얻겠죠? 이 하드웨어가 바로 MMU입니다. (memory management unit)

 

load가 되었는데 MOVE보면 똑같은 걸 알 수 있어요. 어차피 어셈블리어가 시작주소 기준을 0으로 잡았다면 0x18만큼떨어져있다는게 되니까, load할때 굳이 시간 오래걸려서 다 변경해주지말고, 실행할때 실행 주소 +0x18을 해주면 되겠죠? 이는 MMU가 한다는거~

내가 그린 MMU가 하는 일

이렇게 base address 값을 더해서 실제 physical address 주소를 만드는 방법을 contiguous allocation이라고 합니다. (즉 기준+상대적으로 떨어진 정도) 하지만 현재 우리가 사용하고 있는 MMU는 정확히 이 방식은 아니예요. ㅎㅎ 이거에 대해서는 다음 포스팅에서 추가적으로 이어가봅시다.

로드 타임 바인딩과 실행 타임 바인딩의 차이점

이렇게 보면 load time과 execution time시 바인딩은 바인딩 시점에만 차이가 있지 큰 차이는 없는게 아닌가요? 생각할 수 있어요. 지금 우리가 한창 얘기하고 있는 base주소로부터 나는 차이 값을 물리적 주소를 찾아내 변환하는 것인데 load time때 하는거나 실행 타임때 하는거나 원리는 같아 보이죠.

 

시점 차로 보자면, 

load 타임은 메모리에 로딩할 때 이 작업을 미리 다 해놓는 의미 합니다. 그런데 실행시에 바인딩하는 excution time은 프로그램을 실행해서 그 코드가 실행될 때마다 변환 반복 작업을 해줘야해요. 즉 그때그때 하는거

load time 같은 경우 한번만 바꿔놓고 그 다음부터 계속 해당 주소로 access하면 되는건데, 실행 타임은 loop를 매번돌아 변환 작업을 수행하잖아요. 

어떻게 보면 load가 좋고 실행타임이 나빠 보일 수 있는데, 이제 하드웨어는 성능이 너무 좋아져서 하드웨어상 로직이 있기 때문에 excution time 실행시 성능상에 문제가 없습니다. 

 

근데 load 경우엔 이거를 메모리에 로드하면서 이런 작업을 한번씩만 다해주면 되잖아요. 하드웨어가 필요가 없죠. 운영체제가 loading하면서 소프트웨어로 번만 해주면 된다고 그래서 loading 오래 걸리지 하지만 다음에 수행할 때는 빠르겠죠. 그럼에도 메모리 로딩할 너무 overhead가 크기 때문에 로드타임은 사용하지 않습니다.

 

따라서 현재 execution time 컴퓨터 시스템이 쓰고 있습니다. 지금 이런 방법은 운영체제만 가지고 수는 없어요. CPU 있는 MMU 이런 작업을 해줘야만 가능한거죠. 그래서 컴퓨터 구조하는 사람은 OS 알아둬야하고 OS하는 사람은 컴퓨터 구조를 모르면 안되는 뗄레야 뗄수 없는 관계를 갖게 되는 겁니다. ㅎㅎ

 

오늘은 여기까지~! 로드 타임 바인딩과 런 타임 바인딩(=실행타임 바인딩)을 알아보면서 MMU까지 살짝 엿보는 시간을 가졌어요. 오늘 포스팅이 이해하기 쉽고 도움이 되었다! 공감 or 댓글 or 광고보답 아시죠? 

항상 여러분의 성원과 방문에 진심으로 감사드립니다