운영체제 9-4강 (Memory Management 4)

늘보·2021년 7월 6일
0

OS

목록 보기
24/25

→ Open in Slid

  • 본 글은 이전에 사용하던 영상 강의 필기 앱인 'Slid'에서 필기 했던 내용을 Velog로 옮긴 내용입니다.
  • 본 글은 이화여대 반효경 교수님 2017학년도 1학기 운영체제 강의를 기반으로 작성되었습니다.
  • 강의 링크 : http://www.kocw.net/home/search/kemView.do?kemId=1226304

Segmentation

세그먼테이션 기법은 프로세스가 구성하는 주소 공간을 의미 단위로 (Code, Data, Stack,...)으로 쪼갠 것이다. 작게는 프로그램을 구성하는 함수 하나하나를 세그먼트로 정의할 수 있고 크게는 프로그램 전체를 하나의 세그먼트로 정의 가능하다. 일반적으로는 당연히 Code, Data, Stack 부분이 하나씩의 세그먼트로 정의된다.

Segment는 다음과 같은 logical unit들이다. 즉, 다음과 같은 것들이 Segment가 될 수 있다는 것이다.

ex) main(), function, global variables, stack, symbol table, arrays

* Segmentation Architecture (세그먼테이션에서 주소 변환) *

이 기법에서 Logical address는 <segment-number, offset>으로 구성된다.

그리고 Segment별로 주소 변환을 해야 하기 때문에 Segment 마다 Segment Table의 Entry가 존재한다. 즉, Segment Table의 Entry 개수는 Segment의 개수이다. 각 entry는 base와 limit으로 구성되는데, 주소 변환 시에 사용되는 Base register와 Limit register가 기억나는가? Segmentation 기법에서는 Segment-table base register (STBR)Segment-table length register(STLR)로 사용되며 STBR은 base, 즉, starting physical address of the segment(Segment table의 시작 위치)를 담고 있고 STLR은 limit, 즉, length of the segment(프로그램이 사용하는 segment의 수)를 담고 있다. 따라서 <그림 4>에서는 나와있지 않지만, <s, d>에서 s값과 STLR의 값을 비교하여 올바르지 않은 입력 s가 들어온다면 trap을 발생시킨다.

 <그림 4>를 다시 한번 보자. CPU가 논리적 주소를 주게 되면 (s, d), Segment Table의 시작 위치는 STBR 레지스터가 가지고 있으므로 거기서부터 s에 해당하는 인덱스 entry에 가면 해당 세그먼트가 물리적 메모리 주소에 어디에 매핑되는지 그 정보를 가지고 있다. 그런데 Segmentation 기법은 entry에 두 가지 정보를 갖고 있다(limit과 base). Segmentation 기법에서는 Paging 기법에서와는 다르게 각 Segment의 길이가 모두 다를 수 있기 때문에 해당 Segment의 길이가 얼마인지 저장해야 하기 때문이다.

 또한, Segment에서는 Addressing error가 발생할 두 가지 상황이 존재한다.

첫 번째로는 STLR은 Segment의 수를 담고 있기 때문에 만약 (s, d)에서 s가 Segment의 개수보다 크다면 잘못된 정보가 넘어온 것이므로 trap : addressing error가 걸리게 된다.

두 번째로는 Segment의 길이가 Segment Table의 Entry 중 limit에 담겨있는데 이 값보다 (s, d)의 d가 더 크다면 마찬가지로 trap : addressing error가 걸리게 될 것이다.

이를 통과한다면 Segment의 시작 주소 Entry인 Base에다가 d값을 더해서 주소 변환을 하게 되는 것이다.

* Pros/Cons *

 Allocation(Cons) : Paging에서는 Logical address에서 이미 Page의 개수가 정해져 있기 때문에 offset의 최대 길이 또한 정해져 있다. 그러나 Segmentation에서 Segment길이는 d인 offset으로 표현할 수 있는 비트 수 이상은 표현이 불가능하다. 즉, d값이 Segment길이를 제한하는 역할을 한다. 또한 Paging에서는 어차피 물리적 주소도 Page와 같은 크기인 Page Frame으로 잘려 있기 때문에 인덱스만 저장하면 되지만, Segmentation에서는 Segment마다 길이가 다르기 때문에 정확한 시작 주소를 Segment Table의 Entry인 base에 담고 있어야 한다. 즉, 크기가 일정치 않을 때 가변 분할 방식(연속 할당 기법)에서 hole의 발생으로 생기는 문제인 external fragmentation이 발생한다. 따라서 First fit / Best fit 기법을 사용해야 한다.

Protection(Pros) : 대신 장점은 분명히 있다. Segmentation은 의미 단위로 쪼개는 것이기 때문에 Protection을 할 때, 일반적으로 의미 단위로 권한을 부여한다. 특히 Read/Write/Execution 권한을 설정하는 데는 의미적인 단위로 그것을 부여해야 할 것이다. 이런 상황에서 Segmentation은 상당히 유리할 것이다. Paging에서는 Code와 Data가 같이 들어갈 수 있어서 Protection 권한 부여에 관한 복잡한 문제들이 발생할 수 있지만 Segmentation에서는 그것을 쉽게 해결할 수 있다.

Sharing(Pros) : Sharing에서도 Segmentation이 유리하다. 보통 Sharing도 의미단위로 하게 된다. 그러나 Paging에서는 의미 단위의 구분이 전혀 되지 않기 때문에 Sharing 문제가 상당히 복잡하게 된다. 반면 Segmentation에서는 이미 의미 단위로 구분되어 있기 때문에 Sharing에서 상당히 효과적이다.

 Paging 기법과는 다르게 Segmentation 기법에서는 Table 정보를 저장하기 위한 메모리 공간 차지가 아주 적다. Paging에서는 Page의 개수가 100만 개 이렇게 되지만 Segmentation에서는 5개 이런 식이다.

* Segmentation Example *

이 예제는 프로그램을 구성하는 세그먼트가 5개인 예시이다. main(), sqrt(), subroutine, stack, symbol table이 세그먼트를 형성한다. 각 세그먼트의 주소 변환을 위한 Segment Table도 존재한다.

* Sharing of Segments *

Segmentation기법은 의미 단위로 일을 처리하게 되는 Sharing이나 Protection에서 유리하다고 했다. Sharing을 살펴보자. <그림 6>에서 P1의 Segment 두 개중 Segment 0은 Code를 담고 있는 segment이다. Segment를 공유하기 위해서는 Paging에서도 말했지만 같은 논리 주소를 가져야 한다. 즉, Segment 번호가 같아야 한다. 따라서 P1, P2에서 모두 0번 Segment로 되어 있다. 반면 Private Segment인 Segment 1은 두 프로세스에서는 모두 다른 메모리 위치에 매핑되어 있다.

Segmentation with Paging

 Paged Segmentation는 말 그대로 Segmentation과 Paging 기법을 혼합한 것이다. 여기서는 Segment 하나가 여러 개의 Page로 구성된다. 그러니까 결국 메모리에 올라갈 때는 페이지 단위로 쪼개져서 올라가기 때문에 앞서 살펴본 Segmentation의 단점인 Allocation 문제가 발생하지 않는다. 또한 Sharing / Protection과 같은 의미 단위의 작업을 수행할 때는 Segment Table의 Entry에서 그 처리를 한다.

* Architecture *

 Segment에 대한 주소 변환을 한다.(각 프로그램이 가진 논리 주소는 (s, d)로 구성된다.) 그리고 Segment Table에서 s번째 Entry를 가면 이 Segment의 segment legth와 page-table base가 있다. 즉, 하나의 Segment는 하나의 Page Table을 갖는다. 이제 page-table base를 타고 가면, 해당 세그먼트의 Page Table로 이동할 수 있으며 Page Table의 Entry의 개수는 segment length가 되며 요청 d이 길이 제한을 벗어났다면 trap을 발생시킨다.

 그러면 이 Page Table에서 얼만큼 떨어진 index에 접근해야 해당 페이지로의 주소 변환을 할 수 있느냐? 그 방법은 바로 logical address를 (s, d)로 자른 것처럼 d를 (p, d')으로 자르고 p는 Page 번호가 되고, d'는 Page안에서의 offset을 의미한다. 이에 따라 최종적으로 (f, d')으로 물리 주소 변환이 이루어지게 된다.

부가 설명 :

 주소 변환에 있어서 운영체제의 역할은 없다. 전부 하드웨어가 해야 하는 역할이다(MMU, register, ...). 왜냐하면, CPU가 주어진 메모리 주소에 접근을 함에 있어서는 운영체제의 지원을 받지 않기 때문이다. 주소 변환을 할 때마다 운영체제로 CPU를 넘겨주어야 한다는 것은 말이 안 되는 것이다. 매 CPU 클럭 사이클마다 CPU를 운영체제에게 넘겨주어야 한다는 것은 비상식적인 일이다. 기억하자. 주소 변환은 모든 과정에 있어서 운영체제의 도움을 받지 않는다. 오직 하드웨어가 수행한다. 운영체제는 메모리가 아니라 I/O 장치에 접근할 때 도움을 주는 것이다.

본 글들은 이화여대 반효경 교수님 2014학년도 1학기 운영체제 강의를 기반으로 작성됩니다.

링크 : http://www.kocw.net/home/search/kemView.do?kemId=1046323

0개의 댓글