Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- getRequestURI
- urlclassloader
- unmodifiableList
- InvocationHandler
- reflection
- Transfer-Encoding
- Reference
- Java
- object
- chunked
- http/1.1
- clone
- cookie
- http
- toString
- singleton
- Session
- Keep-Alive
- Proxy
- Content-Length
Archives
- Today
- Total
pungjoo
메모리 할당 개념, fragment 본문
'크기가 맞으면 이전 메모리를 배정해 줄수도 있을겁니다'라는 의미에서 fragment 의미에 대해서 언급하고자 합니다. 일반적으로 o/s는 page 단위로 memory를 관리(할당/해제) 합니다.
o/s가 기동되고 내부 memory 관리는 기본적으로 언급했듯이 page 단위로 할당하며 요청되는 size에 맞는 page는 memory 주소가 일련하게 연속되어야 할당을 받을 수 있습니다.
예를 들어 사용하고 있는 o/s의 page단위가 8k이고 실 memory가 800k라고 할때 (생각하기 쉽게. 잡다한 부분은 제외하고. 아주 적죠) application에서 10byte의 memory를 요구하면 1 page를 할당해 줍니다. 당연히 size는 8k이겠죠. 이런 개념으로 9k가 되는 size를 요구해도 2 page 할당 즉, 16k를 내부적으로 사용하게됩니다. 7k는 공중에 붕 뜬 공간이 되겠지요.
위 제시한 memory 공간에서 아래와 같이 현재 사용중이라고 생각해 봅시다.
위 memory 보면 사용중인 page가 45개이며 35개 page는 사용 가능한 상태입니다. 즉, 일반적으로 보면 8k * 35 = 280k를 application에서 사용 가능하다고 생각하지만 답은 '그때 그때 달라요'입니다. 만약 요청되는 size가 1byte~24k 안에 속한다면 문제 없이 할당을 해 줄수 있지만 만약 30k가 필요한 상태라면 위 구조에서는 일련하게 사용하지 않는 memory가 없기때문에 할당을 해 줄수 없는 상태가 발생합니다. 그래서 memory 관리 알고리즘에 의거해 수시로 중간 중간 구멍난(fragment) 부분을 한쪽으로 이동시켜 일련되게 미사용 memory 공간을 확보하는 과정을 수행하게 됩니다.
그러나 이러한 과정이 그리 녹녹한건 아닙니다. 현재 사용중인 memory pointer를 빈번하게 움직일 수 없기 때문에 할당은 받았으나 정의된 시간동안 사용하지 않는 부분에 한해서 이루어지게 됩니다. 이해 하기 쉽게 process가 idle 상태라지만 가능하기 때문에 바쁜 process에서 점유하고 있는 memory는 중간 중간 구멍난 상태로 memory를 사용하게 됩니다. (idle일때만 가능한것은 아니나 이해하기 쉽게 한정합니다.)
흔히 우린 disk 조각 모음을 하지요? 그 부분도 동일한 의미로 생각하시면 됩니다. 또한 예를 들어 내용은 10byte이지만 Windows의 경우 속성에서 보면 '크기'와 '디스크 할당 크기'로 구분해 관리함을 보실 수 있을 겁니다.(이 부분이 page 단위)
위 관점에서 좀 확장해서 page 단위가 8k이고 실 memory는 80k일때 500byte짜리 8개일때는 당연히 아래와 같습니다.
즉, 작은 size가 빈번하게 많이 사용되는 application이라면 실 memory가 넉넉해도 낭비가 심하다는 겁니다. 위 내용으로 보면 실제 500byte * 8 = 4,000 byte만 필요한데 64k를 사용하는 즉, 61,536 byte는 절대 사용할 수 없는 공간으로 남게 됩니다.
@
Comments