본문 바로가기
컴퓨터 공학/운영체제

Chapter 9. 메인 메모리 - 1부

by 조엘 2020. 12. 1.

안녕하세요 파피몬입니다! 운영체제 9단원에 대해 공부해 보았습니다. 1부입니다!

Abraham Silberschatz의 Operating System Concepts 10th edition과 학부 수업을 듣고 정리한 내용입니다. 오개념이 있다면 알려주세요~~

 

1부에서는 현재 운영체제로 가는 역사 정도로 생각하면 될 것 같습니다. 이렇게 발전해서 페이징과 VM이 등장했구나의 초석을 다지는 내용입니다. 

 

<메인 메모리 공부 전 기본 배경 상식>

기본 하드웨어

CPU에서 직접 접근할 수 있는 장치는 메인 메모리와 각 처리코어에 내장된 레지스터다.

따라서 실행되어야 하는 명령어들은 CPU가 접근할 수 있도록 메인 메모리에 갖다 놔야 한다.

만약 메모리에 없다면 CPU 접근 전, 해당 명령들을 메모리에 옮겨놔야 한다.

 

또한 메인 메모리에는 병행 실행을 위해 여러 프로세스를 메모리에 적재하도록 한다. 

여러 프로세스들이 각자 메모리에 고유의 공간을 차지할 수 있도록, 프로세스 별로 기준 레지스터와 상한 레지스터에 값을 저장해 놓는다. 

기준 레지스터는 가장 작은 합법적인 물리 메모리 주소의 값을 저장하고, 

상한 레지스터는 주어진 영역의 크기를 저장한다. 

 

주소의 할당

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

따라서 실행을 위해서는 프로그램을 메모리에 가져와 프로세스 문맥 내에 배치해야 한다. 

사용자 프로그램은 컴파일러-링커-로더를 거쳐 실행 단계에 도달한다.

해당 단계들을 거치는 동안 코드의 주소들은 여러가지 표현 방식을 거친다. 

  * 원시 프로그램: 주소는 숫자가 아닌 심볼로 표현 된다. 

  * 컴파일러: 심볼을 재배치 가능주소로 옮긴다. 

  * 링커/로더: 재배치 가능주소를 절대 주소로 바인딩 한다.

 

바인딩 과정이란 메모리 주소공간과 명령어/데이터의 만남이다. 3가지 시간에서 바인딩이 이루어진다. 

  * 컴파일 타임 바인딩: 메모리 내에 들어갈 위치를 컴파일 시간에 미리 안다면, 이때 절대 주소 코드를 생성한다. 위치가 변경 된다면 재컴파일은 필수적이다. 

  * 로드 타임 바인딩: 메모리 내에 어디로 올라올지 컴파일 시점에 모른다면, 컴파일러는 일단 이진 코드를 재배치 가능 코드로 만든다. 만들어진 심볼과 진짜 메모리 주소와의 바인딩은 메인 메모리로 적재 될 때 이루어진다. 

  * 실행 타임 바인딩: 실행하는 중간에 메모리 내의 한 세그먼트로 부터 다른 세그먼트로 옮겨진다면 발생한다. 이는 특별한 하드웨어의 지원이 필요하다. 

 

논리주소 vs 물리주소

CPU가 생성한 주소를 논리 주소, 메모리에 올라간 주소를 물리 주소라고 한다. 

컴파일/로드 타임에 주소를 바인딩하면 논리 주소와 물리 주소가 같다. 

하지만 실행 시간 바인딩 기법에서는 논리 주소와 물리 주소가 다르다. 

이 경우에는 논리 주소를 가상 주소라고 지칭한다. 

 

따라서 프로그램의 실행 중에는 가상 주소를 물리 주소로 변환해줘야 하는데, 이를 담당하는 하드웨어 장치가 바로 MMU (Memory management unit) 이다.

여기서 중요한 점은 사용자 프로그램은 실제적인 물리 주소에 접근하지 않는다는 점이다!

 

<연속 메모리 할당>

메인 메모리에 올라가게 되는 프로그램은 크게 OS와 User process로 나뉜다. 

여러개의 User process가 동시에 메모리에 상주하게 된다.

연속적인 메모리 할당에서 새로운 프로세스는 이미 적재된 프로세스에 인접하게 적재되게 된다. 

 

메모리 보호

앞서 기본 배경 상식에서 공부했던 내용을 통해 연속 메모리 할당에서의 프로세스간 메모리 보호를 구현할 수 있다. 

프로세스별로 재배치 레지스터를 통해 최저 물리 주소값을 지정받고, 상한 레지스터를 통해 주소 범위값을 지정받는다. MMU는 동적으로 논리 주소에 재배치 레지스터의 값을 더함으로써 주소를 변환한다. 

한 프로세스가 수행하다가 문맥 교환이 일어나면, 다음에 수행될 프로세스의 알맞은 재배치 레지스터와 상한 레지스터를 적재해 수행하게 된다. 

 

메모리 할당

연속 메모리 할당 개념에서는 프로세스 하나가 한번에 통째로 메모리에 올라간다. 메모리의 어느 부분에 새로운 프로세스를 올려야 하는지에 대해 3가지 방법이 제안된다. 

  * First fit: 첫번째 사용 가능한 가용 공간 찾기

  * Best fit: 가능한 공간들 중에서 가장 작은 공간 찾기

  * Worst fit: 가능한 공간들 중에서 가장 큰 공간 찾기 

 

단편화

위와 같이 새로운 프로세스를 메모리에 하나 둘 올리다보면 필연적으로 발생하는 문제들이 있다. 바로 단편화이다. 

 

  * External fragmentation: 프로세스의 적재와 제거를 반복하면서 가용 공간이 너무 작아져 낭비되는 메모리

이 경우 유휴 공간들을 모두 합치면 충분히 새로운 프로세스를 메모리에 올릴 수 있지만, 너무 작은 조각들로 단편화 되어있는 상태를 일컫는다. 이는 compaction(압축)을 통해 해결이 가능한데, 이는 프로세스들의 재배치가 실행시간에 동적으로 이루어지는 경우에만 가능하다. 

 

  * Internal fragmentation: 할당된 공간이 요구한 공간보다 큰 경우 낭비되는 메모리

이 경우에는 해당 프로세스의 요청된 메모리보다 큰 메모리를 할당 받을 경우를 일컫는다. 이 경우, 과다 할당된 메모리는 아무 유용한 일을 할 수 없다. 

 

반응형

'컴퓨터 공학 > 운영체제' 카테고리의 다른 글

Chapter 9. 메인 메모리 - 2부  (0) 2020.12.01
Chapter 8. 교착 상태 - 2부  (2) 2020.11.18
Chapter 8. 교착 상태 - 1부  (0) 2020.11.18
Chapter 7. 동기화 예제  (0) 2020.11.14
Chapter 6. 동기화 도구들 - 3부  (0) 2020.11.13

댓글