관리 메뉴

너와 나의 스토리

OS - [CH16_Segmentation] 본문

Operating System

OS - [CH16_Segmentation]

노는게제일좋아! 2019. 4. 1. 17:33
반응형

- OS는 base와 bounds로 프로세스들을 physical memory의 다른 부분에 재배치 할 수 있다.

- stack과 heap 사이에 큰 free space 덩어리가 있다.

  ㄴ 프로세스에 사용되지 않지만 여전히 physical memory를 차지한다

- base-bounds register 쌍을 이용해 가상 메모리에 접근하는 것은 낭비이다.

  ㄴ base-bounds는 생각보다 유동적이지 않음

 

The Crux : "How to support a large address space"

16.1 Segmentation: Gernalized Base/Bounds

- MMU 안에 하나의 base-bounds쌍을 두는게 아니라 각 주소 공간의 논리적 segment마다 base-bounds 쌍을 둔다.

   * MMU: 메모리 관리 장치

- OS가 할 수 있는 세분화는 각각의 segment들을 physical memory의 다른 공간에 두어 사용하지 않는 가상 메모리 공 간이 physical memory를 채우는 것을 피한다.

- large amounts of unused address space = sparse address spaces

- MMU의 하드웨어 구조는 세분화를 지원한다.

- 각각의 bounds register은 segment의 크기를 가진다 

- 하드웨어는 세그먼트의 offset 값에 base 값을 더한다.

   * 오프셋(offset)은 일반적으로 동일 오브젝트 안에서 오브젝트 처음부터 주어진 요소나 지점까지의 변위차를 나타내는 정수형

- Segmentation fault

  : segmented machine이 메모리의 불법적 주소에 접근을 하면 발생한다.

- Heap의 주소를 보자

만약 우리가 가상 주소 4200를 heap의 base(34KB)에 더한다고 하자.

heap에서 offset을 추출해야한다.

heap의 가상 주소는 4KB(4096)에서 시작한다. 4200의 offset은 4200 - 4096이다.

offset은 104이고 이것을 base register의 physical address에 더한다

 

- 만약 힙의 끝을 넘는 곳을 참조하려고 하면 하드웨어는 이를 탐지하고 os에게 trap해 프로세스를 중단하도록 한다.

 

16.2 Which Segment are we referring to?

- 하드웨어는 translation 하는 동안 segment register들을 사용한다.

- 가상 주소의 상위 몇 개의 bit들을 기반으로 세그먼트의 주소 공간을 쪼갠다.

  ㄴ 우리는 3개의 세그먼트들을 얻는다.

- 14 bits가 있다

여기서 상위 2bits로 어떤 세그먼트 레지스터를 사용할지 결정한다 

(00: code segment / 01: heap)

나머지 12bits의 세그먼트에 offset 주소가 저장됨

 

- base register에 offset을 더하면 하드웨어는 최종 physical address에 도달한다.

- 만약 offset >= bounds 이면 예외가 발생한다

- 어떤 시스템은 heap같은 같은 세그먼트에 code를 넣어 사용할 세그먼트를 고르는데 1개의 bit만 사용한다.

-

주소는 program counter로부터 발생한다

주소는 code segment 내에 있다  

주소가 stack이나 base pointer 기반인 경우 stack segment에 있어야한다

다른 주소들은 heap에 있어야 한다.

 

16.3 What about the stack?

- stack은 거꾸로 성장한다 (아래에서 위로)

- 하드웨어 지원이 필요하다

단지 base와 bounds 값 대신에 하드웨어는 세그먼트의 성장 방향을 알아야한다

(1: 위에서 아래로 성장, 0: 아래에서 위로 성장)

 

16.4 Support for Sharing

- 주소 공간 사이에서 특정 메모리 세그먼트를 공유하는 것은 유용하다

- 공유를 지원하기 위해서 보호 비트 형태로 하드웨어의 지원이 필요하다

- Basic support (세그먼트 당 몇 개의 비트를 추가해서)

  1. 프로그램이 세그먼트를 읽고 쓸 수 있는지 나타냄

  2. 세그먼트 내의 코드를 실행함

- Code 세그먼트를 read-only로 설정하면 같은 코드는 다수의 프로세스에서 공유 가능하다

- 가상 주소인지 체크하는 것은 bounds 내에서 함

- 하드웨어는 특정 접근이 허락 가능한지 체크함

  아니면, 예외 발생시켜서 os가 처리하도록 함

 

16.6 OS support

- os가 context switch에서 해야 하는 일

  1. 세그먼트 레지스터를 저장하고 복구함

  2. physical memory의 free space 관리

- free space가 여기저기 나눠져 있어 새로운 세그먼트를 할당하거나 어떤 것이 성장하기 힘들다

   : external fragmentation

  ㄴ compact physical memory (free memory를 한 곳으로 모은다)

      ㄴ 프로세서 시간을 많이 차지한다

 

 

출처: http://pages.cs.wisc.edu/~remzi/OSTEP/

반응형

'Operating System' 카테고리의 다른 글

OS - [CH20_Advanced page tables]  (0) 2019.04.14
OS - [CH18_Paging]  (0) 2019.04.07
OS-week3 [Multi-level Feedback]  (0) 2019.03.26
OS-week3 [Scheduling]  (0) 2019.03.26
CLI 및 Linux를 공부해보자  (0) 2019.03.26
Comments