남이 읽는 CS/운영체제

[운영체제 10편] 메모리 접근

배발자 2022. 5. 8.
반응형

 

벌써 운영체제 10편을 할 차례가 되었네요~ 

아직 갈 길은 멀지만 그래도 포스팅 하나를 완료하고 나면 나름 뿌듯하답니다~

 

저번주에 정말 복잡한 스케줄러에 대해서 학습을 하셨으니 오늘은 조금 가볍고 직관적인 내용에 대해서 포스팅 할 예정입니다. 10편 기념으로 복잡한 주제는 잠깐 미룰게요. 사실 흐름 상 어쩔 수 없이 이 주제를 가지고 해야한답니다 :)

 

오늘은 메모리 관리에 대해서 알아볼려고 해요~ 

메모리의 동의어는 많아요. 램, 메인 메모리, 주기억장치 뭐 이렇게 부르잖아요~ 근데 보통 메모리라고만 부릅니다!

 

암튼! 프로그램을 실행하면 해당 프로세스 데이터들이 어떻게 메모리 공간에 할당되는지에 대해서 학습을 하는 것이 오늘의 목표입니다!


 

만약 여러 프로세스들이 메모리에 상주할 때 CPU가 수행하고 있는 프로세스의 데이터에 접근을 해야하는데 수행중인 프로세스가 아닌 다른 프로세스의 메모리 공간으로 접근해도 될까요?

 

그러면 절대 안되겠죠?!

기본적으로 CPU는 수행중인 프로세스의 메모리에 접근해야하기 때문에 현재 작업중인 프로세스의 영역이 어디까지인지는 구분할 필요가 있습니다. 

 

일단 프로세스가 메모리에 상주하게 되면 그 프로세스를 위한 독자적인 주소공간이 생기게 돼요~ 

이 주소를 논리적 주소 혹은 가상 주소라고 부릅니다. 

 

CPU는 이와 같이 프로세스마다 독립적으로 갖는 논리적 주소에 근거해 명령을 실행합니다

논리적 주소는 각 프로세스마다 독립적으로 할당 되며 0번지부터 시작됩니다. 

 

조금 헷갈릴 수 있는데 쉽게 다시 설명드릴게요 ㅎㅎ

 

 

자 위에 그림을 보시면 밑에서부터 A, B, C 라는 책이 쌓여있다고 가정해봅시다 ㅎㅎ

A는 300page , B는 100page, C는 320page 의 분량을 가지고 있다고 생각해봐요! 

 

자 여기서 논리적 주소가 뭐냐면~ 책마다 독립적으로 가지는 주소 공간인거에요

A는 0page(표지) 부터 300page 까지 총 300page의 논리적 주소를 갖고 있는 거에요. 

B는 0page(표지) 부터 100page 까지 총 100page의 논리적 주소를 갖고 있다는 거죠! 

 

논리적 주소가 이제 무엇인지 아시겠죠?

 

그리고 물리적 주소라는게 있어요! 물리적 주소는 메모리에 실제로 올라가는 위치를 말합니다.

이게 무슨말이냐! 위의 그림에서 A라는 책 위에 B라는 책이 위치하는데 실제로 B라는 책의 시작점은 A라는 책 바로 위에 위치하기 때문에 A 책의 분량 300page 위인 301page 위치에 존재한다는 거죠.

그러니까 실제로 B라는 책의 시작위치는 301page부터라는 거에요! 그렇다면 B의 물리적 주소는 301page부터 601page 인거죠! 

 

 


논리적 주소와 물리적 주소를 이제 알아봤으니까 CPU는 어떻게 각 프로세스의 메모리 공간의 범위를 알 수 있을까요?

 

CPU가 기계어 명령을 수행하기 위해 논리적 주소를 통해 메모리 참조를 하게 되면 해당 논리적 주소가 물리적 메모리의 어느 위치에 매핑되는지 확인해야합니다. 이렇게 프로세스의 논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업을 주소 바인딩이라고 한답니다. 

 

주소 바인딩의 방식은 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 세가지로 분류할 수 잇어요~

크게 컴파일 타임 바인딩, 로드 타임 바인딩, 실행 타임 바인딩이 있어요!

 

1. 컴파일 타임 바인딩

먼저 물리적 메모리 주소가 프로그램을 컴파일할 때 결정되는 주소 바인딩 방식컴파일 타임 바인딩이라고 불러요.

이 바인딩 기법은 컴파일을 한 시점에 해당 프로그램이 물리적 메모리의 몇번지에 위치할 것인지를 결정합니다.

이와 같은 주소바인딩 방식에서 프로그램이 올라가 있는 물리적 메모리의 위치를 변경하고 싶다면 컴파일을 다시 하는 수고가 필요해요.

따라서 컴파일 타임 바인딩 방식은 비현실적이고 현대의 시분할 컴퓨팅 환경에서는 잘 사용하지 않는 기법이에요 

 

2. 로드타임 바인딩

두번째로 프로그램의 실행이 시작될 때에 물리적 메모리 주소가 결정되는 주소 바인딩 방식을 로드타임 바인딩이라고 합니다. 이 바인딩 방식에서는 로더의 책임하에 물리적 메모리 주소가 부여되며 프로그램이 종료될때까지 물리적 메모리상의 위치가 고정됩니다. (로더란 사용자 프로그램을 메모리에 적재시키는 프로그램을 말합니다. )

로드타임 바인딩은 프로세스 내에 메모리를 참조하는 명령어들이 많아서 이들의 주소를 다 바꿔줘야 해서 로딩할 때의 시간이 매우 커질 수 있다는 단점이 존재해요. 

 

로드타임 바인딩도 실제로 잘 쓰이지 않습니다. 

 

3. 실행시간 바인딩

세번째로 실행시간 바인딩 방식은 프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식입니다.

이 방식에서는 CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지, 주소 매핑 테이블을 이용해 바인딩을 점검해야 합니다.

또한 다른 방식들과 달리 실행시간 바인딩 방식이 가능하기 위해서는 기준 레지스터와 한계 레지스터를 포함해 메모리 관리 장치 (Memory management Unit) MMU 라는 하드웨어적인 지원이 뒷받침 돼야해요. 

 


지금부터 MMU를 사용해 가장 기본적인 방식으로 주소 변환을 수행하는 MMU 기법에 대해서 알아보도록 하겠습니다.

 

이것만 하면 오늘의 포스팅은 끝나니까 힘내세요 ㅎㅎ

 

MMU는 CPU 안에 탑재되어 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치입니다. 

 

어떻게 매핑을 시키냐?

CPU가 특정 프로세스의 논리적 주소를 참조하려고 할 때 MMU 기법은 그 주소값에 기준 레지스터의 값을 더해 물리적 주소값을 얻어냅니다. 기준 레지스터 (Base Register)는 재배치 레지스터(relocation register) 라고도 불리는데 그 프로세스의 물리적 메모리 시작 주소를 가지고 있어요:) 

 

자! CPU 는 현재 수행 중인 프로세스의 물리적 메모리의 시작 주소를 알고 있어요. 

위의 그림을 보시면 논리적 주소 346번지에 있는 내용을 요청할 경우 재배치 레지스터에 저장된 14000이라는 값에 이 주소를 더해 물리적 메모리 14346번지에 있는 내용을 참조하게 됩니다. 

지금 살짝 숫자 많이 나오니까 헷갈리시죠? ㅎㅎ
예를들어, 책 여러권이 차곡차곡 쌓여있는데 중간에 위치한 "정현이의 운영체제" 라는 책의 시작 지점이 14000page인거죠.  그니까~ "정현이의 운영체제" 라는 책 아래에 13999page 분량의 책들이 쌓여져있고 그 위에 "정현이의 운영체제" 라는 책이 올라가있는거죠.  그리고 "정현이의 운영체제"의 346쪽을 보고 싶으면
14000쪽+346쪽을 더하라는 거에요! 쉽죠? 

 

그러면 물리적 메모리 14346번지에서 CPU가 요청한 정보를 찾게 되는거죠. 

이 예에서 논리적 주소 346번지는 물리적 메모리의 시작 위치인 재배치 레지스터값으로부터 요청된 위치가 얼마나 떨어져 있는지를 나타내는 일종의 오프셋 개념으로 생각할 수 있습니다! 

 

 

 

또한, 한계 레지스터라는 또 하나의 레지스터를 사용하는데 CPU가 해당 프로세스의 주소 공간을 넘어서는 메모리 참조를 하려고 하는지 체크하는 용도로 사용되며, 현재 CPU에서 수행 중인 프로세스의 논리적 주소의 최댓값, 즉 그 프로세스의 크기를 담고 있어요! 

 

또 뭔말인지 모르겠죠?? ㅎㅎ
자! 다시 책으로 비유하자면 "정현이의 운영체제" 는 총 400page의 분량을 담고 있어요. 
그렇다면 한계 레지스터도 400page의 메모리 공간을 담고 있는거죠~ 

그리고 CPU가 아까 346page의 논리적 주소를 요청했다면 400page의 내에 존재하니까 위의 부등식이 만족하여 우측 조건식으로 갑니다. 그리고 재배치 레지스터가 담고있는 14000page + 논리적 주소 346page 가 더해서 물리적 주소로 접근하는 거에요

만약 CPU가 401page의 논리적 주소로 접근시도를 한다면 한계 레지스터를 넘어서는 범위잖아요??
그러면 "정현이의 운영체제" 책의 분량을 넘어서 다른 책에 접근 시도를 하게 되는거죠!

그렇게 된다면 부등호의 조건식이 만족하지 못해 트랩을 발생시켜 해당 프로세스를 강제 종료시키는거에요! 

* 트랩 기억 안나시면 아래 더보기를 눌러주세요

더보기

 

Exception 인터럽트 (Trap)

 

오..! 까먹으셨군요!!!! 

예외 많이 들어보셨죠?? 보통 트랩이라고도 많이 불리는 인터럽트에요~

대표적으로 0으로 나누는 비정상적인 작업을 시도하거나, 오버플로우/ 언더플로우와 같이 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 처리하는 인터럽트인거에요! 이럴때는 CPU가 수행할 수가 없잖아요! 이와 같은 경우에 Exception 인터럽트가 발생한답니다!

즉, CPU가 명령어를 수행하다가 처리할 수 없는 예외상황을 만나면 자기 자신을 인터럽트 걸어서 커널의 처리루틴으로 가는거죠~


다음 주제에서는 어떤 것을 배워볼까요! 

운영체제에서 정말 중요한 페이징 기법과 세그먼트 기법에 대해서 배워야하는데 그 전에 

내부 단편화외부 단편화에 대해서 짚고 넘어가야합니다 ㅎㅎ 

 

다음 포스팅은 내부 단편화 그리고 외부 단편화에 대해서 배워봅시다! 감사합니다:) 

 

반응형
반응형

댓글