불연속 할당은 Paging 기법과 Segmantation 기법 두 가지로 나뉘며, 이번 포스팅에서는 Segmentation 기법을 다룰 것이다.
↓ Paging 기법 ↓
2023.02.10 - [Operating System] - [운영체제] Memory Management 4 (불연속할당/Paging 기법)
[운영체제] Memory Management 4 (불연속할당/Paging 기법)
연속 할당 : 프로그램이 메모리에 올라갈 때 통째로 메모리에 올라가는 방식 불연속 할당 : 프로그램을 구성하는 주소 공간을 같은 크기의 페이지 단위로 잘게 쪼개서 페이지 단위로 메모리에
rannnneey.tistory.com
[운영체제] Memory Management 5 (불연속 할당, Paging 기법, Two-Level Page Table)
이전 발행글 2023.02.10 - [Operating System] - [운영체제] Memory Management 4 (불연속할당/Paging 기법) [운영체제] Memory Management 4 (불연속할당/Paging 기법) 연속 할당 : 프로그램이 메모리에 올라갈 때 통째로
rannnneey.tistory.com
2023.02.13 - [Operating System] - [운영체제] Memory Management 6 (다단계 페이지 테이블, 역 페이지 테이블, 공유 페이지)
[운영체제] Memory Management 6 (다단계 페이지 테이블, 역 페이지 테이블, 공유 페이지)
[ 다단계 페이지 테이블 (Multi-Level Paging) ] 페이지 테이블은 다단계로도 사용할 수 있다. 4단계 페이지 테이블을 사용한다고 했을 때 메모리에 한 번 접근하려면 네 번의 주소변환과 한 번의 실제
rannnneey.tistory.com
[ Segmantation 기법 ]
Paging 기법은 프로그램의 주소 공간을 같은 크기의 Page로 쪼갠 것이고, Segmantation 기법은 의미 있는 단위로 자르는 것이다.
프로그램의 주소 공간은 Code, Data, Stack으로 구성되어 있고 의미 있는 단위인 Code Segment, Data Segment, Stack Segment로 구분할 수 있다.
좀 더 세분화해서 더 잘게 쪼개고 싶다면 코드 중에서도 함수별로 별도의 세그먼트로 구성을 할 수 있다.
의미 있는 단위로 나눈 거라 크기가 각각 달라서 Dynamic Storage Allocation Problem 발생 가능성이 있다.
✓ 프로그램은 의미 단위인 여러 개의 segment로 구성
- 작게는 프로그램을 구성하는 함수 하나하나를 세그먼트로 정의
- 크게는 프로그램 전체를 하나의 세그먼트로 정의 가능
- 일반적으로는 code, data, stack 부분이 하나씩의 세그먼트로 정의됨
✓ Segment는 다음과 같은 logical unit 들임
- main(), function, global variables, stack, symbol table, arrays
● Segmentation Architecture
Segmentation에서 말하는 Limit Register와 Base Register의 값은 각각 세그먼트의 길이와 세그먼트의 시작 위치를 나타낸다.
STBR, STLR은 테이블 안에 있던 Base Register와 Limit Register 값이랑은 다르다.
Base Register와 Limit Register는 원래 주소 변환을 위해서 CPU안에 있는 레지스터이고 STBR과 STLR은 Segment Table의 시작 위치와 길이를 나타낸다.
여기서 말하는 길이는 프로그램이 사용하는 세그먼트의 개수 (Entry 개수)를 의미한다.
Logical Address는 Segment number(s)와 Segment Table 안에서 얼마나 떨어져 있는지를 나타내는 Offset(d) 두 개로 구성되어 있다.
각 세그먼트별로 서로 다른 메모리 주소에 올라갈 수 있기 때문에 세그먼트별로 주소 변환을 해야 하기 때문에 Segment Table을 두고 있다.
주소 변환을 위해 Base Register는 Segment의 시작 위치를 나타내는 용도로 쓰이며, Limit Register는 Segment의 길이를 나타내는 용도로 쓰인다.
✓ Logical Address는 다음의 두 가지로 구성
- Segment-Number, Offset
✓ Segment Table
- base - starting physical address of the segment
- limit - length of the segment
✓ Segment-table base register (STBR)
- 물리적 메모리에서의 Segment Table의 위치
✓ Segment-table length register (STLR)
- 프로그램이 사용하는 Segment의 수 : segment number s is legal if s < STLR
● Segmentation Hardware
CPU가 논리 주소를 주면 이 논리 주소는 Segment 번호와 Segment Offset 두 부분으로 나눈다.
Segment Table은 Base와 Limit를 갖고 있으며, Base는 물리적 메모리 시작 위치의 정보를 담고 있고 Limit는 Segment의 길이를 나타낸다.
Paging 기법에서는 Table Entry에 Limit을 갖고 있지 않는다.
Paging 기법에서는 쪼갠 크기가 동일했는데 Segmetation 기법에서는 의미 단위로 나누었기 때문에 Table 마다 길이가 다를 수 있기 때문이다.
주소 변환을 할 때 두 가지를 확인해야 한다.
1. CPU로부터 얻어진 논리 주소의 Segment 번호가 Segment Table Length Register (프로그램이 사용하는 Segment 개수) 보다 작아야 한다.
STLR보다 큰 값의 Segment를 요청했다면 잘못된 요청이기 때문에 Trap에 걸린다.
예를 들어, 어떤 프로그램이 Segment 세 개로 구성되어 있는데 Segment Number가 5번이라면 자신의 영역을 벗어난 것이기 때문에 Trap에 걸린다.
2. Segment의 Length보다 Segment Offset의 값이 더 작아야 한다.
Segment의 길이가 100byte인데 Segment Offset이 2000byte를 요청하게 되면 잘못된 요청이기 때문에 Trap에 걸린다.
위 두 가지를 확인 후, 정상적인 요청이면 Segment의 시작 위치에 Offset의 위치를 더해서 주소 변환을 한다.
물리 메모리 시작 위치부터 Base위치만큼 떨어진 곳에서 Segment가 시작이 되고, 그 위치에서 d만큼 떨어진 곳에 가면 원하는 주소의 내용이 있다.
![](https://blog.kakaocdn.net/dn/dcgOR0/btrWqQtYPrd/tOmGovGQ1nEzvf2fkMc7b0/img.png)
Segment Table의 시작 위치는 Segment Table Base Register(STBR)가 갖고 있을 것이다.
Offset만큼 떨어져 있는 곳에 가면 이 세그먼트가 물리적인 메모리 어떤 번지에 올라가 있는지를 갖고 있다.
Paging 기법은 물리적 메모리도 같은 크기의 프레임으로 나뉘어 있기 때문에 시작 주소가 Frame 번호로 주어지면 된다.
하지만 Segment 기법에서는 Segment의 크기가 다 다르기 때문에 이 Segment가 어디서 시작이 되는지 정확한 Byte 단위의 주소로 매겨줘야 한다.
또한, Segment의 크기가 서로 다르기 때문에 연속 할당 방식에서의 가변 분할 방식처럼 중간중간에 사용되지 않는 메모리 공간(Hole)이 생긴다.
(외부 조각의 발생 가능성)
예를 들어, Protection을 하는 경우에 Read/Write 하는 부분, Reod-Only 하는 부분, 실행 권한이 있는 부분 등등이 있다.
보통 의미 단위로 권한을 부여하기 때문에 Code 영역은 Read-Only, Data는 Read/Write로 권한을 부여할 수 있다.
Paging에서는 Page 단위이기 때문에 권한을 부여할 때 어려움이 있다.
✓ Protection
- 각 세그먼트 별로 protection bit가 있음
- Each entry : Valid bit = 0 => illegal segment, Read/Write/Execution 권한 bit
✓ Sharing : shared segment, same segment number
- segment는 의미 단위이기 때문에 공유(Sharing)와 보안(protection)에 있어 paging보다 훨씬 효과적이다.
✓ Allocation : first fit / best fit, external fragmentation 발생
- segment의 길이가 동일하지 않으므로 가변 분할 방식에서와 동일한 문제점들이 발생
● Example of Segmentation
Segment 기법에서 Table의 Entry 개수가 이 프로그램이 사용하는 Segment의 개수로 정해진다.
왼쪽 세그먼트 번호가 몇 개 있냐에 따라 Entry 개수가 만들어지며 주소 변환은 Segment Table의 해당 Entry에 가면 Base 주소 값이 있다.
각각의 Base 주소 값은 해당 Segment의 물리적 메모리의 시작 위치를 나타내며 Limit 주소 값은 Base 주소 값에서 얼마큼 떨어져 있는가를 나타내는 Offset 값이다.
Paging 기법에서 Page의 개수가 매우 많아서 테이블을 위한 공간 낭비도 굉장히 크다. 반면에 Segmentation 기법에서는 Segment의 개수가 매우 적다.
![](https://blog.kakaocdn.net/dn/R8AuX/btrWpZSxme5/DW4uSoIFkwjFXfhG3hbZm1/img.png)
4번 Segment의 경우 물리적 메모리 4700번지부터 들어가 있고, 길이가 1000 임을 의미한다.
● Sharing of Segments
Segment를 서로 다른 프로세스들이 공유하는 방법이다.
![](https://blog.kakaocdn.net/dn/bZkEeL/btrWuOuYDtZ/YO8lwIGcoX0YKK7My0mMAK/img.png)
Editor라는 같은 코드를 사용하기 때문에 똑같은 0번 Segment를 사용하며 주소 변환을 하여 43062번지에 올라가 있다.
반면 Private Segment는 두 개의 프로세스에서 주소 변환 정보가 서로 다른 위치로 매핑되어 있다.