남이 읽는 CS/운영체제

[운영체제 12편] 페이징 세그먼테이션 (불연속 할당 방식)

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

안녕하세요! 개발자 배씨입니다~ 

저번시간에는 연속할당이라는 것에 배워봤어요 ㅎㅎ 이번 시간에는 연속할당에 반대되는 불연속할당에 대해서 배워 보려고합니다!! 들어가봅시다

 

 


불연속 할당의 대표적인 예로는 페이징세그먼테이션 기법이 있습니다. 

근데 조금 복잡해서 이해하기 힘드니까 천천히 잘 따라오세요 ㅎㅎ

 

일단! 가상메모리라는 것을 알고 있어야합니다. 

가상메모리??? 들어보긴 했는데.. 뭐지? 하셨나요??

 

예를 들어, 만약 프로그램 크기가 12GB 인거에요~ 엄청 크죠??

근데 여러분들이 지금 노트북에 8GB 램(메모리)을 사용하고 있다고 쳐요. 여기서 12GB 프로그램을 실행시키기 위해서는 메모리에다가 할당시켜야 하는데 8GB 램에서 12GB 프로그램을 못담잖아요? 용량이 너무 큰거죠! 

 

그러면 어떻게 해야할 까요?? 

자! 이때 사용하는 기술, 메모리가 실제 메모리보다 많아 보이게 하는 기술을 가상 메모리라고 합니다. 

 

즉, 프로그램이 돌아갈려면 12GB를 모두 넣는게 아니라 필요한 부분들사용하지 않는 것은 메모리에 올리지말고 사용하는 부분들을 쪼개서 메모리에다가 넣는거에요! 

 

어때요? 이해 되셨나요?

 

1. 페이징

 

지금부터 상당히 어려운 내용을 설명드릴거에요. 

이 부분은 저도 어떻게 설명해야할 지 고민을 너무 많이 했던 부분이라 정말 오래 걸렸던 내용입니다. 

최대한 쉽게, 그림을 그려가면서 이해시킬려고 노력할테니까 이해가 될 때까지 읽어보세요!

 

자! 배씨의 집(하드디스크)에 1000페이지 분량의 운영체제(프로그램) 책이 존재하고 있어요. 

배씨가 해당 책(프로그램)을 들고 학교에 갈려고 하는데 너무 무거운거에요~

 

근데 오늘 학교에서  운영체제 수업을 하는데 메모리 관리 파트만 수업을 한다고 해요

그렇다면 굳이 이 책을 다 들고 가야돼? 라는 생각을 하게 됩니다.  

 

그래서 배씨는 운영체제 책을 10등분(page)으로 쪼개서 각각 100p로 총 10묶음으로 만들어버린거에요. 

그리고 배씨는 10등분으로 쪼갠 각 묶음마다 운영체제 0권, 운영체제 1권, 운영체제 2권, .... , 운영체제 9권으로 이름을 정합니다. 

 

이후 배씨는 수업에 필요한 0권, 1권, 2권, 3권만 들고 학교에 갑니다! 

자 여기서 0권, 1권, 2권, 3권을 100p(오프셋) 크기를 갖는 페이지라고 부릅니다. 

 

0권 = page 0

1권 = page 1

2권 = page 2 

 

 

학교에 가니 사물함(메모리)이 보이네요!

중헌, 창환, 예원이가 이미 쓰고 있네요?? 밑에 한 자리가 남아있는 것을 발견합니다.

 

그리고 배씨가 사물함을 여니까 4등분(프레임)으로 분할되어 있는거에요. 근데 이 각각의 공간들이 100p 크기에 딱 맞게 들어가는 공간으로 분할되어 있는거에요!  ( *프레임 크기 = 페이지 크기)

 

그래서 배씨는 각각의 공간(프레임)에 0권, 1권, 2권, 3권을 딱 맞게 채워놓았어요!

 

어때요? 지금까지 이해가 되시나요? 

 

디스크에 있는 프로그램을 실행시킬 때 프로그램 전체를 메모리에 다 넣을 필요 없이 특정 크기의 페이지별로 잘라서 필요한 부분들만 메모리 공간에 분할해서 넣으면 되는 거죠. 

 

그리고 사물함(메모리)에서도 페이지의 크기에 딱 맞는 공간인 프레임으로 분할시켜 놓아요. 

다시말해서, 메모리 공간에 페이지 크기(100p)만큼 잘라서 넣을 수 있는 메모리 공간의 틀(프레임)로 분할시킨다는 뜻!

 

예를 들어, 개발자 배씨가 운영체제 1000페이지 책을 100p로 10등분 한게 아니라 200p 로 5등분을 했다면 

실제 메모리 공간도 200p 크기에 딱 맞는 프레임으로 다 분할되어 있는거에요

 


 

이제 실제로 어떻게 메모리 공간에 접근하는지 한번 살펴봅시다~

 

자! 위의 예시에서 사물함을 메모리에 비유했어요

그리고 배씨가 책을 넣은 위치는 제일 아래 4개의 프레임 공간이였죠??? 

 

쉬운 예를 들기 위해서,

 

운영체제 0권을 넣은 사물함의 1번째 프레임 시작위치를 0번지, 

운영체제 1권을 넣은 사물함의 2번째 프레임 시작위치를 100번지, 

운영체제 2권을 넣은 사물함의 3번째 프레임 시작위치를 200번지, 

운영체제 3권을 넣은 사물함의 4번째 프레임 시작위치를 300번지라고 가정을 할게요

 

 

이때, 배씨는 page table라는 표를 만들어서 각각의 분권들을 어느 위치에 저장해놓았는지 기록을 해놓습니다.

그리고 배씨는 그 page table을 보고 1권은 100번지에 위치하고 있는것을  바로 알 수 있게끔 말이죠 

 

 

이제는 운영체제 구조로써 접근해봅시다. 글씨가 조금 더럽지만 이해해주세요 ㅎㅎ

page table이라는 놈은 실제 메모리의 어떠한 공간에 쓰여집니다.

 

그리고 page table의 시작주소를 page table base register라는 레지스터에 저장을 해놔요. 나중에 필요하거든요 

(위의 그림을 보시면 "정현" 메모리공간은 0번지부터 되어있는데 실제로 메모리에서 저 위치는 0번지가 절대 아닙니다! 

단지 예시로 쉽게 구분짓기 위해서 저 위치를 0번지라고 표시해둔거기 때문에 주의해주세요!)

 

 

 

자 실제로 어떻게 메모리에 접근을 하는지 한번 살펴볼까요? 

만약 학교 선생님이 운영체제 230쪽을 펼쳐서 수업을 한대요! 그러면 저희는 아까 200p~ 300p까지 분할 시킨

운영체제 2권이 필요하겠네요?! 그러면 2권이 어딨더라?? 하면서 찾으러 가야합니다. 

 

먼저 아까 page table에 정보를 기록 해놨으니까 그 정보를 얻기 위해서는 page table이 저장되어 있는 메모리 공간에 가야하겠죠?

 

그렇다면 page table base register에 저장한 page table의 시작 주소를 불러와서 page table을 찾아가요! 

이때, 한번의 메모리 참조(접근)가 발생하는거죠.  

 

그리고 운영체제 2권이 필요하다고 했으니까 page table의 시작주소로부터 2번째에 기록되어있는 내용을 보는거에요 

찾아보니까 200번지라고 적혀있네요! 

 

일단 200번지라는 정보를 들고왔어요~ 

그리고 페이지의 크기(오프셋)는 100p이라는 것을 알고 있기때문에 해당 정보를 가지고 두번째 메모리 참조(접근)가 일어납니다.  즉, 운영체제 2권이 할당되어 있는 메모리 공간은 실제 200번지부터 크기가 100쪽까지인것 을 알 수가 있는 것이죠. 

 

근데 이렇게 메모리 접근이 두번이나 일어나는데 상당히 번거롭지 않나요?? 

그래서 TLB 라는 특수한 고속의 하드웨어 캐쉬라는 것이 존재합니다. 
간단하게 말해서 페이지 테이블의 데이터 정보 일부분을 TLB라는 하드웨어에 미리 저장을 해놔서 페이지 테이블을 찾으러 가지 않고도 바로 메모리에 접근할 수 있게 해주는 하드웨어랍니다. 

해당 주제에서는 페이징이 무엇인지에 설명하는거기 때문에 TLB 관련돼서는 생략하도록 하겠습니다.
궁금하신 분들은 찾아보시길 추천합니다! 

 

암튼! 여기서 중요한 부분이 있습니다~ 

 

페이징기법에서는 외부 단편화가 발생하지 않습니다!

디스크에서 들고오는 페이지들의 크기가 프레임보다 큰 경우가 없기때문에 메모리에 못들어가는 경우는 없다는 거에요!

*메모리가 꽉찬 경우가 아닐 때!

 

 

그렇다면 내부 단편화는 있을까요?? 없을까요??

지금 외부 단편화랑 내부 단편화가 기억 안나시는 분들은 아래 포스팅을 보고 오세요 ㅡ.ㅡ

 

 

[운영체제 11편] 메모리 할당 I(연속할당 방식)

안녕하세요! 오늘은 [운영체제 11편] 메모리 할당I (연속할당 방식)에 대해서 배워보려고 합니다 !! 저번주 포스팅에서 제가 내부 단편화와 외부 단편화에 대해서 언급했습니다 ㅎㅎ 이 주제의 포

baebalja.tistory.com

 

생각을 해보세요!

만약 어떤 책의 크기는 950페이지이고 200p의 크기를 갖는 페이지로 나눴는데 마지막 분권에서는 150p 로 되겠죠?

여기서 150p 크기를 갖는 분권을 들고 메모리에 넣을려고 해요.   

 

이때, 메모리는 200p의 크기를 담을 수 있는 공간으로 분할되어 있는데 그 프레임 속에 150p만 들어가게 되겠죠.

200p 를 담을 수 있는 프레임 공간속에 150p 를 담게 되니 50p 크기만큼 내부 단편화가 생길 수 있습니다. 

 

즉,프로세스의 주소 공간 중 제일 마지막에 위치한 페이지에서는 내부단편화가 발생할 가능성이 있다는 뜻입니다! 

 

 


2. 세그먼테이션

 

지금까지 살펴본 페이징은 프로세스를 물리적으로 일정한 크기로 잘라서 메모리에 할당시키는 거였어요! 

그렇다면 세그먼테이션? 이건 뭘까요? 

 

이 개념은 프로세스를 논리적 내용을 기반으로 나눠서 메모리에 배치하는 것을 뜻합니다. 

 

포스팅 완전 초반에 제가 "프로세스란 무엇인가" 라는 주제로 포스팅을 한적이 있습니다. 

이때 제가 프로세스에는 "코드, 데이터, 힙, 스택" 이러한 영역들로 구성되어 있다고 말씀드렸어요. 

 

자! 이러한 논리적인 영역, 집합세그먼트라고 합니다. 

코드, 데이터 등 세그먼트들 내부에서도 더 작은 세그먼트로 나눌 수도 있어요! 

예를 들면 코드영역에는 여러 함수들이 존재하겠죠? 이때 코드 영역 전체를 세그먼트로 올리는 것이 아니라, 

a 함수 세그먼트, b 함수 세그먼트로 나눠서 메모리에 할당 시킬 수 있다는 겁니다. 

 

여러분~ 여기서 각각의 세그먼트들은 동일한 크기일까요? 

당연히 아니겠죠? 

 

지금 제가 포스팅이라는 하나의 논리적 세그먼트 안에서 페이징과 세그먼테이션이라는 두가지 주제로 나눴는데 

각 주제마다 글자수가 다른 것처럼 각각의 논리적 내용으로 기반으로 나눈 데이터들은 크기가 다 다르잖아요 

 

이처럼 각각의 세그먼트들은 동일한 크기를 갖지 않는다! 

 

 

 

세그먼트를 메모리에 할당할 때는 페이지를 할당하는 것과 동일합니다. 

이때 segment table을 활용해서 메모리에 접근하게 돼요! 

 

segment table은 세그먼트의 번호와 시작 주소, 세그먼트 크기를 엔트리로 갖게 됩니다. 

위의 그림을 보고 설명해드릴게요 ㅎㅎ  일단 디스크에 0~4까지의 번호를 부여한 세그먼트들로 분할되어 있네요!

 

자! 여기서 세그먼트 0번의 위치는 어딜까요?? 

segment table에 들어가서 세그먼트 번호 0을 인덱스로 갖는 base 정보를 찾으러 가보면 1400번지네요?

그리고 limit이 뭡니까? 1000이죠? 

이 말은 1400번지부터 크기가 1000만큼 세그먼트 0번이 할당되어있다라고 보는겁니다. 

 

자 근데! 이때 메모리공간을 한번 보세요~

각각의 세그먼트들은 메모리를 사용하는 공간이 다 다른게 보이네요. 그리고 메모리에 계속해서 세그먼트가 들어오고 나가고 반복하다가 각각의 상주되어 있는 세그먼트들 사이에는 작은 빈틈들이 여러곳에 생길 수 있어요~

 

그렇게 된다면 그 작은 빈틈보다 큰 세그먼트가 메모리에 들어오면 들어갈 수 없겠죠?

 

즉, 외부 단편화가 발생한다는 뜻입니다. 대신에 내부 단편화는 발생하지 않습니다~ 이유는 생각해보세요!

 

 

 

 


* 추가적으로, 페이지, 세그먼테이션 이 두가지를 혼용해 세그먼트를 페이징 기법으로 나눈  Paged segmentation 이라는 방법도 있긴합니다. 페이징 기법을 활용하니까 외부단편화는 사라지겠지만 이것도 단점이 존재합니다~  세그먼트와 페이지가 동시에 존재하기 때문에 주소 변환을 두번 해야합니다. 즉, CPU에서 세그먼트 테이블에서 주소 변환을 하고, 그 다음 페이지 테이블에서 또 주소변환을 해야하는거죠. 속도 측면에서는 떨어지겠죠! 암튼, 이런것도 있다! 

 

 

오늘은 페이징과 세그먼테이션에 대해서 배워봤습니다.

진짜 너무 힘드네요................ㅠ

 

정말 어려운 내용이였고 까다로운 내용이였습니다. 

다음 주제에서는 만약 메모리가 꽉차서 페이지를 교체할 때 어떤 페이지를 교체하면 되는지에 대해서 

설명드릴게요!

 

[운영체제 13편] 페이지 교체 에서 뵙겠습니다. 감사합니다 :) 

 

 

 

 

반응형
반응형

댓글