일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- kotlin
- terminal
- 코루틴 컨텍스트
- 깡돼후
- 개성국밥
- table not found
- 자원부족
- JanusWebRTCServer
- Value too long for column
- PersistenceContext
- JanusGateway
- 티스토리챌린지
- mp4fpsmod
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 겨울 부산
- taint
- PytestPluginManager
- JanusWebRTCGateway
- python
- vfr video
- tolerated
- 오블완
- JanusWebRTC
- pytest
- k8s #kubernetes #쿠버네티스
- VARCHAR (1)
- 코루틴 빌더
- 달인막창
- Spring Batch
- preemption #
너와 나의 스토리
OS - [CH16_Segmentation] 본문
- 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를 한 곳으로 모은다)
ㄴ 프로세서 시간을 많이 차지한다
'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 |