안녕하세요? 허니입니다. 메모리 관리는 프로세스 관리만큼 중요한 요소인만큼 많은 분들이 컴퓨팅 자원에 대한 자원 관리 어떻게 하는지에 대해 궁금할 것 같습니다. 해서 메모리 관리는 어떻게 하는지에 대해 포스팅을 하겠습니다 학생이나 연구원분들에게 많은 도움이 될 것이라고 생각하며 언제든지 질문은 환영입니다.

 


오늘의 주제

 

 메모리 관리(MEMORY MANAGEMENT)는 왜 필요한가.
 메모리에는 왜 주소가 필요한가.

주소의 지정 과정

절대주소(absolute address)와 물리적주소(physical address)

 


MEMORY MANAGEMENT는 왜 필요한가.

 서울시내에 살고 있는 인구가 1000명쯤이라고 생각해보자.
그렇다면 그들을 위한 별도의 주택정책, 교통정책 등은 아예 거론할 필요조차 필요 없을 것이다. 서울시가 항상 떠 안고 있는 고민의 근본원인은 바로 서울시 인구가 이미 서울시라는 한정된 구역 안에서 소화해내기에 버거울 정도라는 점이다. 그렇기에 한정된 지역에 시민들이 큰 어려움 없이 생활하도록 수많은 아파트를 짓고 있는 것일 테지만 말이다.
 

 초기 컴퓨터의 메모리 용량은 과연 얼마나 되었을까.

기껏해야 수 Kbyte에 불과했었지만(최근의 컴퓨터의 경우 적어도 256Mbyte이상, 많으면 Gbyte 단위의 용량을 갖고 있는 것과 비교했을 때 엄청나게 적은 수치이다) 처리되는 프로그램 역시 적은 용량으로도 처리가 가능한 단순한 프로그램들이었기 때문에 큰 불편을 느끼지 못했다. 또한 초기 컴퓨터 시스템은 멀티프로그래밍 환경이 아니라, 메모리 내부에 하나의 프로그램만이 자리잡고 있었기에 복잡한 관리 역시 필요하지 않았다. 다시 말해 8Kbyte의 메모리 용량을 가진 컴퓨터가 4Kbyte나 2Kbyte의 프로그램을 실행하고 있더라도 아무 할일 없이 낭비되고 있는 메모리의 용량을 당연한 것으로 생각하였다. 그러나 멀티프로그래밍 환경으로의 변환과 발맞춰 일정 용량으로 한정된 메모리를 보다 효율적으로 분배하고 사용하기 위해 메모리관리가 중요한 쟁점으로 등장한 것이다.

 

 잠깐! 상식

bit와 byte의 차이.
bit와 byte는 컴퓨터에서 사용되는 정보의 단위를 말한다.
1. 비트: bit는 binary digit의 약자로 컴퓨터 신호처리에 있어 가장 기본적인 단위로서 0과 1(혹은 on/off) 두 가지의 상태로 표현되는데 이는 전류의 흐름을 단속함으로써 전기적으로 표현된다. 오늘날의 컴퓨터에서 사용되는 가장 작은 자료의 표현단위이다.
2. 바이트: byte는 8개의 bit들을 하나의 묶음으로 만들어 놓은 것으로서 의미를 가지는 최소단위로서 한 문자를 표시한다. 1바이트는 숫자 1,2,3등과 문자 A, B, C 기호 @!%등을 나타낸다. 한 1Kbyte는 1024byte를, 1Mbyte는 1024Kbyte의 단위로 표시된다.

 
우리 한글 또한 자음이나 모음 하나를 가지고서는 아무 의미전달이 되지 않지만 하나 하나의 자음 모음이 없다면 글자 하나도 단어 하나도 표현될 수 없다. 자음 모음이 모여 한 글자를 표현하고 글자가 모여 하나의 의미를 담은 낱말이 되고 낱말이 모여 의미가 분명히 전달되는 문장이 되는 것처럼 컴퓨터 시스템에서도 그 하나만으로는 별다른 의미를 지니지 않은 듯한 비트 하나로부터 의사소통이 시작되는 것이다.


메모리에는 왜 주소가 필요한가.


한정된 서울시 영역에 수많은 인구가 살고 있기에 많은 아파트가 필요하다면 그들을 제대로 관리하기 위해 무엇이 필요할까. 한집 한집마다 차별된 주소가 필요한 게 아닐까. 주소가 있어야만 국가는 각 가구에 적정한 세금을 청구할 수도 있고 주문한 물건을 제대로 배달받을 수도 또한 친구에게 편지를 썼을 때도 그에게 배달될 수 있을 것이다. 바로 하나의 프로그램이 처리되기 위해선 그것이 메모리의 어느 부분에 자리잡고 있는가 하는 정확한 주소가 지정되어야만 작업수행이 가능한 것이다. 한글프로그램과 인터넷 프로그램이 동시에 메모리에 자리잡고 있다면 컴퓨터가 이것은 한글 이것은 인터넷 프로그램이다 라는 것을 인식하고 있는 것이 아니다. 바로 메모리에 각각의 프로그램이 자리잡을 때 일정한 주소가 지정됨으로써 사용자가 사용하고자 하는 프로그램이 정확하게 수행되는 것이다.

 잠깐, 상식!

메모리상에 주소는 기호주소(Symbolic address)와 명시주소 (Explicit address)의 두 가지 방법으로 표시되게 된다.
기호주소(Symbolic address)란 메모리에 주소를 표시하는데 있어 기호로 정의된 이름을 사용하는 것을 말하고 명시주소(Explicit address)란 숫자로 주소를 표시한 것을 말한다.

 


그렇다면 주소라는 것은 어떻게 지정되는 것일까.


이를 이해하기 위해선 먼저 컴퓨터에서 수행되는 code가 어떤 과정을 거쳐 실행프로그램으로 변화되는지에 대해 알아봐야 한다. 코드는 컴퓨터 시스템에서 정보를 표현하기 위하여 사용되는 기호체계를 말한다. 코드는 원시코드(source code)와 목적 코드(object)로 나뉠 수 있는데 원시 코드란 프로그래머에 의해서 포트란, 코볼, 어셈블리, C언어 등으로 작성된 프로그램을 말한다. 이러한 원시코드는 컴파일러를 거쳐 목적 코드가 된다. 목적코드는 다시 Link를 통해 하나로 모아져 Loader가 메모리로 이동되어 곧바로 실행될 수 있는 프로그램이 되는 것이다. 다시 말해 메모리 관리기법에 따라 Loader에 의해 프로그램들이 적절한 메모리 위치에 자리 매김 될 수 있게 하는 것이다.

그림 37 코드의 변형 과정

 
원시코드는 각각이 하나의 변수를 갖는데 이러한 변수가 바로 원시코드의 주소가 되는 것이다. 원시코드의 주소는 컴파일러를 통해 재배치가능주소(re-locatable address)로 바뀐다. [재배치]라는 말은 메모리에 설치되어 있는 프로그램이 필요에 따라 메모리의 다른 영역으로 이동되는 것을 말한다. 이렇게 이동된 다음에는 현재 프로그램이 놓인 위치에 알맞게 주소가 변경되어야 하는 것이다. 한 아파트 단지(하나의 메모리주소) 일지라도 이사를 하게 되면 당연히 주소가 변경되는 것처럼 말이다. 그러므로 목적코드 안에 주소는 절대적 주소가 아니라 변경이 가능한 상대적 주소가 되는 것이다.

그림 38 재배치 가능 주소
 


주소를 좀더 자세히


주소에는 절대주소(absolute address)와 물리적주소(physical address)라는 2가지 다른 의미의 주소가 있다. 그렇다면 메모리가 관리되는데 있어 왜 두 가지의 주소가 필요한 걸까. 앞서 우린 멀티프로그래밍환경의 등장이 메모리관리의 필요성을 크게 증대시켰다고 잠깐 언급하였다. 하나의 메모리 안에 여러 프로그램들이 자리잡음으로써 처리속도의 향상을 가져오는 것이 바로 멀티프로그래밍이라는 것은 이미 여러분들의 머리 속에 기억되어 있을 것이다. 절대주소라는 것은 메모리의 주소를 0번부터 차례로 열거하여 하나씩 증가되는 값으로 주소를 부여한 다음에 이러한 주소를 사용하여 데이터가 저장되어 있는 위치를 표시하는 것을 말한다. 바로 하나의 프로그램이 메모리 전체에 놓였다고 가정하게 되면 그 프로그램의 주소는 0부터 시작하여 프로그램의 길이에 따라 마지막 주소를 갖게 될 것이다. 이러한 의미의 주소가 절대 주소이고 바로 절대주소가 정의되는 공간을 주소공간(address space)이라고 한다.
 

 여기서 주소공간(address space)의 의미를 살펴보자.

주소를 사용하여 메모리의 위치를 정의할 수 있는 범위를 말하는 것으로 프로세스들이 참조하게 되는 주소들의 집합을 주소공간이라고 한다. 주소공간 안에는 실제 한글 프로그램이 놓인 것이 아니라 메모리의 자리잡은 한글 프로그램이 실제 실행되는 상황에 놓였을 때 메모리의 몇 번 주소를 찾아가면 어떤 자료의 참조가 가능하다는 것을 나타내 주는 것이다. 몇 동 몇 호의 아파트에 누가 사는지를 알고 있어야 나라에서 세금을 제대로 청구할 수 있을 것이다. 만약 정확한 주소와 사람이름을 제대로 알지 못한다면 동사무소에 주소 열람부를 참고해야 할 것이다. 그러나 이러한 절대주소는 메모리에 재배치될 때 다른 주소를 갖게 된다. 하나의 메모리에 3개의 프로그램이 자리잡고 있다고 생각해 보자. 통신 프로그램이 0000부터 999까지의 주소에 자리를 잡고 한글 프로그램은 1000부터 1999까지, 오락프로그램은 2000부터 2999까지 자리잡았다고 생각해 보자. 그러나 이 3개의 프로그램이 항상 같은 순서로 메모리 안에 자리를 차지하는 걸까. 오락 프로그램, 통신프로그램, 한글프로그램 순으로 자리를 잡게 되었다면 이 프로그램들의 주소는 바뀌게 될 것이다. 다시 말해 메모리 내부에 자리잡은 프로그램의 순서가 변할 수 있기 때문에 절대주소만으로 프로그램을 처리하기엔 대단히 큰 문제가 존재하게 되는 것이다.
 

 그렇다면 물리적 주소라는 것은 무엇을 말하는 것 일까.

어떤 프로세스를 처리하고자 한다. 주소공간을 통해 그 프로세스를 처리하기 위해선 한글 프로그램 0020 주소를 참조해야 한다는 정보를 갖고 메모리에 접근을 시도한다. 그러나 메모리의 접근을 시도해 본 프로세스가 만나게 되는 것은 한글 프로그램이 아닌 통신프로그램인 것이다. 메모리상에 1000-1999까지의 주소에 자리잡은 한글프로그램이 CPU를 통해 처리되기 위해서 주소공간을 새로이 배정받았기 때문에 발생한 문제이다. 이러한 문제는 기준 레지스터(base register)를 이용해 해결될 수 있는 것이다. 기준레지스터는 각각의 프로그램이 시작되는 주소를 말한다. 예를 들어 한글프로그램은 1000에서 시작되므로 1000+불러올 주소의 값인 0020을 합쳐주면 물리적 주소인 1020이 된다. 한글 프로그램이 2000부터 2999번지까지 자리잡았다면 물리적 주소는 한글 프로그램의 시작주소인 2000에 주소공간에서 확인한 0020의 주소의 값을 더해주면 프로세스가 정확한 메모리주소를 참조할 수 있게 되는 것이다. 프로세스를 통해 처리할 프로그램이 메모리상에 어떤 순서로 놓였느냐에 따라 물리적 주소는 계속 변화되는 것을 기억해야 한다.


요점정리

 

 메모리 관리란

멀티프로그래밍 환경으로의 전환과 발맞춰 일정 용량의 한정된 메모리를 보다 효율적으로 분배하고 사용하기 위한 것이다.

 

 메모리 주소의 필요성

바로 하나의 프로그램이 처리되기 위해선 그것이 메모리의 어느부분에 자리잡고 있는가 하는 정확한 주소가 지정되어야만 작업수행이 가능한 것이다.

 

 코드란

코드는 컴퓨터 시스템에서 정보를 표현하기 위하여 사용되는 기호체계를 말한다.

 

 절대주소(absolute address)와 물리적주소(physical address)란
절대주소라는 것은 메모리의 주소를 0번부터 차례로 열거하여 하나씩 증가되는 값으로 주소를 부여한 다음에 이러한 주소를 사용하여 데이터가 저장되어 있는 위치를 표시하는 것을 말한다.  절대주소가 정의되는 공간을 주소공간(address space)이라고 한다. 프로세스를 통해 처리되어질 프로그램이 메모리상에 어떤 순서로 놓였느냐에 따라 물리적 주소는 계속 변화되는 것이다.

 

목 차

 운영체제를 시작하는 분들을 위해

 운영체제의 역사와 구체적으로 어떤 일들을 수행하나요?

 운영체제의 목표와 역할이 미래에도 계속 증대될까요?

 운영체제를 이해하기 위해 필요한 기본 개념들은 무엇인가요?

 운영체제 프로세스 생애주기(Process Lifecycle)는 무엇인가요?

 운영체제 프로세스 관리(Process Management)는 어떻게 하나요?

 운영체제 프로세스(Process)의 처리 속도는 어떻게 높일까?

 운영체제 스레드(Thread)는 무엇인가요?

 운영체제 스케줄링 (Scheduling)은 어떻게 하나요?

 운영체제 스케줄링 알고리즘의 비교 기준이 있나요?

 운영체제 프로세스 동기화가 무엇인가요?

 운영체제에서 세마포어(Semaphore)란?

 운영체제 메모리 관리(Memory Management)는 어떻게 하나요?

 운영체제 메모리 분할 방법은 어떻게 하나요?

 운영체제 가상메모리(Virtual Memory)는 무엇인가요?

 운영체제 Page in/out, Swapping 등이 Page Table Entry와 어떤 관계인가요?

 운영체제 메모리 관련해서 알아야 할 개념은 어떤것이 있나요? (TLB, Locality, Working Set, Overlay)

 운영체제 Page replacement (페이지 대체) 알고리즘이란?

 운영체제 파일시스템(File System)은 어떻게 운영되나요?

 운영체제 파일시스템 내부구조는 어떻게 되나요?

 운영체제 디스크 공간 할당(Disk Space Allocation) 알고리즘과 효과적 알고리즘의 판단 기준은?

 운영체제 파일시스템에서 접근 시간, 디스크 스케줄링을 위한 알고리즘, I/O 시스템이란?

 리눅스 인터럽트 (Interrupt)에 대해 자세히 설명해 주세요.

 인텔 구조에서 운영체제 가상 메모리 (Virtual Memory)는?

 운영체제 아키텍처의 종류는 얼마나 있나요?

 

+ Recent posts