본문 바로가기

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

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

[운영체제 목차]

 

안녕하세요~!! ㅎㅎㅎ 메모리 관련 문의글이 많아, 가장 기초적인 주소 할당부터, 그 종류, 페이징, 캐시메모리...쪽을 한번 먼저 쭉 다뤄볼까해요 ㅎㅎ

요새 기다려주시는 사람들이 있다는걸 알게되니까...?ㅎㅎ

시간이 없는데 노트북부터 켭니다 ㅎㅎㅎㅋㅋㅋㅋ

PHYSICAL ADDRESS 물리적 주소란?

이 포스팅이 들어가 있는 운영체제 챕터도 그렇고, 제목도 그렇고 메모리와 연관되어 있다는건 다들 눈치채셨겠죠

어떤 프로그램을 돌리는데 메모리를 잡아먹는다, 라는 말을 많이 사용하는걸 보면

'어떤 프로그램을 실행시키면 그 데이터가 메인메모리(RAM)을 차지하면서 실행되는구나' 를 기본적으로 생각할 수 있어요.

 

 

우리가 '메이플 스토리.exe'를 눌러서 실행시켰다고 합시다. 고럼 실행하기 위해서 해당 exe파일에 있는 데이터는 일단 다 램에 올라가야 돼요.

 

정확히는 디스크 스케줄링에 의해서 어떤 프로세스가 수행될지 결정되고 그 결정된 프로세스가 메모리 레디큐에 올라가는거죠

 

Usually, a program resides on a disk as a binary executable file

대게 프로그램은 디스크에 바이너리 형태의 실행가능한 파일로 존재합니다. (exe파일)

 

 

← 이렇게 생긴 게 physical memory입니다. 메모리는 워드의 큰 배열로 이루어져있다는거 알고 계시죠?(참고로 워드는 저 그림에서 한 라인이 차지하는 크기라고 생각하면 됩니다)

 

요걸 RAM이라 생각하면 돼요. 여러분 램이 8기가짜리 컴퓨터를 샀다. 그러면 요게 8기가가 되는거죠. 0부터 8기가 되는 이게 physical memory!

ADDRESS BINDING이란?

여러분, 프로그램에다가 

data = 10;

이렇게 코딩을 짜면, data라는 메모리 번지에다가 10을 쓰는(write) 프로그램을 코딩한거죠.

근데 실제로 CPU가 명령어를 수행을 하면 

store #198000, 10   (#198000은 임의의 데이터가 저장될 주소!)

요렇게 나올텐데, 이 data라고 하는 메모리 번지를 언제 결정하느냐가 크게 3단계가 있습니다.

1. compile time

2. load time

3. execution time.

이 메모리 번지를 언제 어떻게 결정하느냐!! 이걸 어드레스 바인딩! 주소 할당이라고 합니다.

absolute code가 뭐냐,

저기 위에 어셈블리어 명령어에 보이듯이, 정확히 어셈블리어가 정한 위치에 물리적으로 고정되어 위치되는 코드를 말해요. relocatable code의 반댓말로, relocatable이 움직있수 있는 위치시킬 수 있는 이잖아요. absolute는 절대적인 즉 fix되는 것을 말합니다. 

It means code that loads at a known, fixed memory address. 
코드가, 이미 정해진 메모리 주소에 로드되는 것을 말한다.

 

간단하게 전체 훑기

Compile time은 뭐야?

얘를 명령어로 컴파일을 해서 실행파일로 만들  주소를 결정한다는 방법이겠지

 

Load time은?

Load time은 언제야? 프로그램을 실행 전에 메모리에 올릴 때 이 주소 값(#198000)을 결정하는 방법이고

 

Execution time?

실행시에 결정된다는 것은 실행시에 load까지도 올라오고 요 명령어를 실행하는 순간에 이 값(#198000)을 결정한다.

명령어를 실행할 때 이 주소 값을 결정하는 말이 무슨 말인지는 그림을 가지고 조금 더 이해하기 쉽게 이야기 해볼게요.

compile time과 load time이 뭔지

이해하기 쉽도록 그려봤어요 ㅎㅎ 

혹 이해가 어렵다면, 컴파일 포스팅을 보고 오도록 합시당 :)  

COMPILE TIME

가장 쉽게 우리가 생각할 수 있는 컴파일 타임

현재 여러분이 어떤 프로그램을 만들었어 만들었는대 data는 10이예요.

이거를 compile하면 store(어셈블리어 명령어) 요 198000 번지에다가 10을 지정하는건데, 요 번지를 compile time에 결정을 한다는 이야기는 여기서 어떤 값(10)을 썼으면 요 data라는 변수는 반드시 #198000에 있어야 한거죠. 

198000번지에다가 10을 쓰는거잖아요. 그러니까 data라는 변수는 반드시 198000번지에 올라가야 되죠.

 

그 말은 무슨 말이냐면 컴파일을 딱 하면 이 컴파일 된 프로그램이 몇 번지에 올라가서 수행된다는 것이 결정된다는 겁니다. 이해 되나요? 지금 우리 컴퓨터는 이럴까 이렇지 않을까? 지금 현재 우리 컴퓨터는 이렇지 않겠죠.

 

컴파일타임이라 그럼 괜시리 어렵게 느껴지지만

그냥 쉽게 말해 프로그램 내부에서 사용하는 주소와 physical 주소하고 똑같다는 겁니다.

컴파일 또는 어샘블러로 목적 코드를 만드는 과정이 컴파일 과정이었죠

즉 내가 프로그램을 왼쪽 코드처럼 짜고 컴파일을 돌리면 가운데 그림처럼 absolute code가 생성이 됩니다. 그럼 이 때 결정된 주소가 결국 메모리에 올라가는 주소가 된다 해서 컴파일 타임에 결정되는 메모리 할당이라고 하는 거예요 ㅎㅎ

 

컴파일 타임 주소 할당의 문제

지금 우리 컴퓨터는 이럴까 이렇지 않을까요? 지금 현재 우리 컴퓨터는 이렇지 않겠죠 ㅎㅎ

지금 현재 내 컴퓨터의 상황이 어떨지 모르는잖아요 ㅎㅎ 프로그램에서 이 메모리에 얘를 올려! 이랬는데 이 메모리에 실제로 차지하고 있는 다른 프로세스가 있다면..?

이 컴파일 타임 방식을 사용했다는 것은 여러분들 게임 만드는 회사에서 이 프로그램은 이 PC가 뭐가 됬든간에 여기서부터 여기까지 메모리에 올라가서 수행된다 가정하고 만드는거잖아요 이건 불가능 합니다.

 

이 방식이 가능한 상황?

compile time에 메모리 번지가 결정되는 상황은 뭐가 있을까요?

아무것도 없을 때!! 한 예로, 아두이노에는 내가 만든 프로그램 말고 다른 프로그램은 안 돌아가는 특성이 있어요.

거기는 컴파일을 하면 이 프로그램은 0번지에서부터 돌아간다고 가정해도 돼죠. (사실 0번지에는 OS 커널이 위치하고 있어서 안되겠지만~~) 한 프로그램밖에 안돌아가니까 겹칠 일이 없잖아요! 그래서 실제로 아두이노 프로그램을 컴파일을 할 때는 컴파일 타임에 메모리 주소가 결정이 됩니다. 특정번지에 올라가서 돌아갑니다. 왜냐하면 어차피 하나밖에 안되니까!

즉, 이 컴파일 타임에 결정이 되는 방법은, OS도 없고 프로세스가 딱 하나 있을 때 그 때 사용할 수 있는 방법, 임베디드 시스템에서 사용하는 방법입니다. ㅎㅎㅎ

Logical address

이 컴파일 타임을 보고 여러분들은 이제 짐작하실거예요.

아 physical memory 주소로 직접 매핑하는 방식 말고, 또 다른 메모리 방식이 필요하겠구나,

참고로 다음 포스팅에서 배울 load time이나 그 이후부터 사용되는 방식에는 그래서 logical address라는 개념이 나옵니다.

 

An address generated by the CPU is commonly referred to as a logical address, whereas an address seen by the memory unit-- that is, the one loaded into the memory-address register of the memory -- is commonly referred to as a physical address

CPU에 의해서 생성되는 주소체계를 보통 논리적 주소라고 불러요. 반면, 메모리 유닛에 의해 보여지는, 그니까 실질적으로 메모리의 메모리 주소 레지스터에 로드되는, 주소체계를 물리적 주소라고 부릅니다.

 

이 논리적 주소는, 가상 주소라고도 말해요. 이 가상주소를 어떻게 꿍짝꿍짝 해서 물리적 주소와 매핑하게 됩니다. 오늘 포스팅에서 배운 컴파일 타임 주소 할당의 논리적 주소는 물리적 주소와 동일하겠죠?ㅎㅎ

하지만 미리보기 하자면..? 로드 타임 논리적 주소는 사용되기 전에 물리적 주소에 매핑되어야하며이 매핑은 메모리 관리 장치 (MMU)라고하는 하드웨어 장치를 사용하여 처리됩니다!

정리

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

컴파일 타임 바인딩이란, 컴파일하는 시점에 논리적 주소를 물리적 주소로 변환시켜주는 것입니다.

이제 이런 타입의 바인딩 방법은 사전에 메모리의 내용들을 다 알고, 어디서부터 할당을 해줘야 좋은지 파악이 된 상태에서만 가능합니다. 이런걸 하는 건 현 멀티프로그래밍 시스템에서 불가능합니다. 따라서 멀티프로그래밍이 지원되지 않는 시스템에서만 아넌하게 사용될 수 있다고 말할 수 있죠

 

아무래도 이번 포스팅에서 로드타임이랑 실행타임부터 MMU까지 다루기에는 너무너무 길어질꺼같아서 여기서 한 번 나누고 가려고 해요!!

이어서 보시려면 아래 포스팅을 참조해주세요!

 

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

안녕하세요 여러분 오랜만에 들고 온 운영체제 관련 글입니다. ㅎㅎ [운영체제 OS 완전정복 목차] 저번 시간에는, 1. 물리적 주소란 (physical address) 2. 주소 바인딩이란 (Address binding) 3. 절대 코드란 (ab..

jhnyang.tistory.com

오늘 포스팅이 이해하기 쉽고 도움이 되었다! 공감 or 댓글 or 광고보답 아시죠? (찡긋)

항상 여러분의 응원에 감사드려요 짱!