이전 글에서 base, bounds 레지스터를 통해 OS는 physical memory의 다른 파트들을 프로세스에 relocate할 수 있었다.
하지만 큰 문제가 남아 있다.
할당된 Address space에서 Heap과 Stack 사이의 사용하지 않는 메모리가 보이는가?
이는 매우매우 낭비적이고, physical memory를 효율 있게 사용할 수 없게된다.
이 문제를 해결하기 위한 Segmentation 이라는 기술이 있다.
해결법은 단순하다! MMU에 base레지스터와 bounds레지스터를 갖고 있는 대신에 address space의 segment마다 base레지스터, bounds레지스터 쌍을 갖고 있는건 어떨까? 한 segment는 특정 길이의 address space의 연속된 부분이다.
이 segmentation을 활용하면 physical memory를 사용하지 않는 virtual memory로 채우는 것을 막을 수 있다.
16.3을 보면 Code와 Heap, Stack에 해당하는 세 segment가
pysical memory의 어디에 위치하고 있는지 계산할 수 있을것이다.
Which Segment Are We Referring To?
그럼 주소를 계산할 때 어느 segment인지, offset은 뭔지 어떻게 알 수 있을까?
일반적인 접근법은 address space를 offset과 segment를 나타내기 위해 분리하는 것이다.
우리의 예에서는 상위 2개의 bit으로 사용하는 segment레지스터를 알 수 있다.
What About The Stack?
위의 사진에서 보면 알 수 있듯 스택의 경우에는 28K에서 주소가 더 작아지는 방향으로 성장한다.
이를 위해서 하드웨어의 지원이 필요한데 아래와 같은 정보를 가지고 해결할 수 있다.
OS Support
address space 조각들이 physical memory에 어떻게 relocate되는지 알았을 것이다. 하지만 segmentation은 OS에 여러 문제점들을 갖고 있다. 첫번째는 context switch를 할때 OS가 segment register를 저장하고 복구해야한다는 것이다.(이는 과거의 문제다.
)두번째는 segment가 늘어나거나 줄어들 때, 예를 들어 malloc()을 통해 객체가 동적할당 될 때 OS가 segment 크기를 조정하고 더 큰 공간을 내줘야 한다는 것이다. 마지막으로는 physical memory에서의 free space관리이다. 이는 segment들이 같은 크기를 갖고 있으면 관리하기 쉽겠지만 다 다른 크기를 갖고 있기 때문에 발생한다. 예를 들어, free space가 24K가 있지만 연속되지 않고 분리되어 있는 segment라면 20K address space공간 요청에 응하지 못할 것이다. 이런 문제를 external-fragmentation이라고도 한다.
그러므로 이를 해결한 해결법들이 필요하고 앞으로 다루게 될 것이다.
'운영체제 > Operating Systems in Three Easy Pieces' 카테고리의 다른 글
13. Virtualization) Paging (0) | 2024.09.28 |
---|---|
12. Virtualization) Free-Space (0) | 2024.09.26 |
10. Virtualization) Address Translation (3) | 2024.09.08 |
9. Virtualization) Address Spaces (0) | 2024.04.07 |
8. Virtualization) Multi-CPU Scheduling (1) | 2024.03.19 |