본문 바로가기
computer science/운영체제

[운영체제] 단편화?

by 박연호의 개발 블로그 2019. 3. 3.




요즘 운영체제 위주로 포스팅을 하고 있습니다. 대부분 운영체제 강의시간에 배웠던 내용인데 그때는 그냥 그렇구나~정도로 생각하고 넘겼는데, 이번에 글을 작성하면서 자료들을 찾아보고 공부하니 보다 더 잘 이해가 되는 것 같습니다. 예전에는 그냥 음식을 먹고 맛있구나 였다면 지금은 짠맛, 단맛을 다 느끼고 안에 어떤 재료들이 있는지 생각하면서 먹는 느낌? 정도의 차이가 있습니다.


단편화 ?


디스크에 존재하는 프로그램은 메모리에 올라오고 CPU를 할당받음으로써 실행됩니다. 여러 프로세스들이 메모리에 올라가고 내려가면서 메모리의 빈공간, 자료가 여러개의 조각으로 나뉘는 현상을 말합니다. 그래서 이런 현상이 많이 발생되게 된다면 메모리에 공간이 많이 남아 있어도 실질적으로 사용할 수 없는 메모리가 발생하게 됩니다.



위의 사진처럼 여러개의 프로세스가 메모리위에 올라가 있습니다. 실제로 메모리에는 사용가능한 공간이 3,00kb가 있고, Process 10를 1,300kb을 필요로 합니다.

하지만 3,000kb는 메모리상에 각각 500kb, 500kb, 1,000kb, 1,000kb로 독립되어 있고 실제로 Process 10가 원하는 1,300kb크기의 공간이 없기 때문에 Process 10은 메모리에 올라가지 못합니다. 이런 현상을 단편화(Fragmentation)라고 합니다. 


외부 단편화 vs 내부 단편화 


내부 단편화


내부 단편화는 프로세스에 할당된 메모리 공간이 실제로 프로세스가 필요한 공간보다 많이 할당되었을 때, 프로세스 내부에서 발생되는 단편화를 말합니다.

위의 사진에서 실제로 C작업은 30MB공간이 필요하지만 50MB의 공간이 할당되었을 때, 프로세스 내부적으로 20MB의 단편화, 쓰지않는 공간이 발생하게 됩니다.



외부 단편화


외부 단편화는 메모리가 할당되고 해제되는 작업이 반복되면서 작은 공간의 메모리 영역이 생기게 되는데, 이 공간이 크기가 어떤 프로세스가 필요로 하는 크기보다 작은 경우를 의미합니다. 쉽게 말해서 충분한 공간이 있지만 내가 필요로 하는 크기보다 작아서 사용할 수 없는 경우입니다.


위의 사진에서 C작업은 70MB의 공간이 필요합니다. 메모리상에는 총 100MB공간이 존재하지만 각각 50MB씩 독립적으로 존재하기 때문에 실제로 C작업은 메모리상에 올라갈 수 없게 됩니다.



그렇다면단편화 문제를 어떻게 해결할까 ?


단편화는 계륵같은 존재입니다. 존재하긴 하지만 사용하기에는 좀 문제가 있는, 

그렇다면 이 문제를 어떻게 해결할 수 있을까요 ?


1.  압축

단편화는 메모리 상에 생긴 구멍이라고 생각할 수 있습니다. 그렇다면 사용중인 메모리공간을 한쪽으로 모은다면 충분한 공간이 생기지 않을까요 ?

이런 방법으로 접근하는 것이 메모리 압축입니다. 

여러곳에 분산되어 있는 단편화된 메모리 공간을 합쳐 사용할 수 있는 하나의 큰 공간을 만드는 것을 의미합니다(디스크 조각모음)


2.  통합

통합방법은 단편화가 발생된 공간에서 인접해 있는 다른 단편화 공간들을 하나로 통합시켜 큰 공간을 만드는 방법입니다.


3. 페이징 

하나의 프로세스가 사용하는 메모리공간이 연속적이여 한다는 개념을 탈피한 기법이며. 외부 단편화를 해결할 수 있는 방법입니다. 


쉽게 생각해서 이전까지는 프로세스가 필요한 메모리공간이 10이라면 독립된 10크기의 공간이 필요했습니다. 하지만 페이징에서는 독립된 10크기의 공간이 없어도 프로그램을 메모리에 올려놓을 수 있습니다. 


프로그램을 페이지라는 단위의 크기로 나누고, 실제 메모리 공간은 프레임이라는 단위로 나눕니다. 여기서 페이지의 크기는 프레임의 크기와 같습니다.

각각의 페이지의 논리적 주소는 프레임의 물리적인 주소에 매핑되는데 그 역할을 MMU(Memory Management Unit)이 해주며 페이지 테이블이라고 합니다.


4.  세그멘테이션

페이징 기법에서는 가상 메모리를 같은 크기의 단위로 분할했지만 세그멘테이션 기법에서는 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당하여 실제 메모리 주소로 변환을 하게 됩니다.


 세그먼트들의 크기가 각각 다르기 때문에 미리 분할해 둘 수 없고 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법으로, 페이징 기법과 마찬가지로 논리적인 주소와 물리적인 주소를 매핑하기 위한 세그먼트 테이블이 필요합니다.