segmentation이란 mmu에서 base, bound 를 활용해서 가상메모리에서 물리적 주소로 변환할 때에 사용한다.
그런데 이때에 충돌을 경계해서 메모리의 구역을 나누는 것이 segmentation이다.
예를 들어서 메모리에 code, heap, stack 을 할당해야 할 때에 전체 메모리를 4등분을 해야한다. 3개인데 4등분을 하는 이유는 2의 제곱으로 나누어야 하기 때문이다.
따라서 4등분을 위해서는 2개의 bit를 필요로 하는데, 그렇기에 16kb 메모리의 가상주소의 14bit 중의 앞의 2비트는 segment 를 나타내는 수로 사용되고 뒤의 나머지 12bit 는 base 주소로 부터 떨어진 offset을 나타낸다.
아래의 그림에서의 segement 는 code 는 00 , heap 은 01, stack은 11 로 표현할 수 있다.
segment 하는 방법에는 fine-grained 가 있는데, 이는 segment를 더더욱 잘게 나누는 것이다.
이는 allocate 와 반납을 반복하게 되면 중간의 잘게 나뉘는 조각이 많이 생성된다. 이를 external frogmentation이라고 한다.
따라서 이를 해결하기 위해서 compact, 합치기도 한다.
프로세스가 할당된 메모리를 반납하는 경우는 프로세스가 종료되었을 때, 메모리 함수를 호출하였을 때가 있다.
위 의 그림처럼 각각의 메모리에 할당되는데, code의 경우 할당되는 크기는 2k 이고, 시작 주소가 32K 이므로 32k 부터 34k - 1 까지 할당 된다.
heap의 경우에는 34k 부터 37K - 1 까지 할당된다.
Stack 의 경우 역방향 이기 때문에 base 가 28kb 라고 할 때 마지막 값은 28kb - 1 이다.
그리고 가상주소의 segmentation 으로 해당 가상주소가 code인지, heap 인지등의 판단을 할 수 있지만, 발생하는 곳의 부분에 따라서 판별 또한 가능하다.
Va 가 pc 에서 발생하면 무조건 code.
Va 가 sp 에서 발생하면 stack 이다.
Va 가 어디에 들어있는지에 따라서 판단이 가능하다.
offset의 경우는 뒤의 12bit 로 거리를 판단한다.
Stack 의 경우에는 역방향으로 증가하는데, 가상주소의 offset 값은 정방향으로 떨어진 값이 구해진다. 따라서 역방향의 ㄱ리는 최대 bound 에서 따로 구해야 한다. Offset - 물리적 최댓값 = 음수
free space는 메모리를 할당을 한후에 나머지 빈 곳들을 관리하는 자료구조이다.
이는 보통 연결리스트로 관리한다.
맨 처음에 메모리를 할당 할 경우에는 할당하는 사이즈 + 8byte 만큼이 할당된다. 그 이유는 head 가 추가로 할당되는데 이곳에 size와 magic number 가 int의 형태로 할당되기 때문이다.
magic number 는 할당이된 후에 메모리를 반납할때에 알맞은 곳인지 판별할 때에 사용된다.
그리고 반납한 후에는 head에 size와 next가 저장된다. next 는 다른 곳의 빈 메모리를 가리킨다. (연결리스트처럼)
따라서 반납을 진행을 하면 위처럼 된다.
free space 관리의 경우에 여러 방법들이 있다.
best fit : 가장 알맞는 메모리를 할당하는 방법
- 이를 계속 진해을 하게 된다면 작은 부분들이 계속 남는다.
- 연결리스트를 다 돌아야 하기 때문에 오래 걸린다.
worst fit : 가장 많이 남는 메모리에 할당한다.
- 이를 진행 하면 남는 부분도 크기 때문에 활용에 용이하다.
- 다 돌아야 하긴하다.
first fit : 연결리스트를 돌면서 가장 처음으로 찾는 곳에 할당한다.
- 메모리의 전반부에 작은 조각들이 모이게 된다.
node 순서를 정렬??
next fit : 그 이전에 할당한 부분을 기억한 후에 그곳 부터 돌면서 가장 먼저 찾는 할당 가능한 곳애 할당한다.
- 작은 조각들이 퍼진다.
buddy system
최초에 블럭을 나누어 놓은 후에 들어갈 수 있는 블럭을 통째로 할당한다.
이때의 이점은 반납시마다
'운영체제' 카테고리의 다른 글
운체 궁금했던거 (0) | 2023.03.26 |
---|---|
운영체제 adress translation (0) | 2023.03.12 |
운영체제 address space (0) | 2023.03.12 |
운영체제 scheduling proportional share (0) | 2023.03.12 |
운영체제 MLFQ (0) | 2023.03.11 |