메모리관리배경
다수의 프로세스들을 사용하면서 메모리 관리의 중요성은 대두되었다.
멀티 프로세스 환경에서는 보다 좋은 성능을 위해서 다수의 프로그램을 주 메모리에 올려놓아야 한다.
이때 메모리에 어느곳에 프로그램을 넣어주고, 다시 하드디스크로 보내는 역할을 운영체제에서 담당한다.
그렇기 때문에 적절한 메모리 위치에 프로그램을 적재하지 못할 경우 문제가 발생하게된다.
이 뿐만 아니라 메모리가 변경될 때 어떻게 하면 더 효율적이고 메모리 낭비를 방지 할 수 있는가에 대한 문제를 해결하기 위해 메모리 관리를 해야한다.
메모리 교체 방식
swapping
메모리가 교체되는 시기
프로세스들이 cpu를 사용하기위해 스케쥴링을 통해 점유하는 것과 비슷한 방식으로 메모리도 빠르게 교체되면서 사용 할 수 있다.
예를 들면 주 메모리에 현재 10개의 프로세스가 있다고 하자.
그런데 이때 새로운 프로그램이 메모리에 적재되려고 한다고 하면, 오랫동안 사용되지 않은 프로세스를
보조메모리(디스크)로 보내 버리는데 이 작업을 "swap out"이라고 한다.
이후에 " swap out " 된 프로세스를 메모리로 불러오거나 기존의 우선순위가 높았던 프로세스의 작업이 끝나면 메모리로 다시 되돌아 오는데 이 작업을 " swap in "이라고 부른다.
메모리 할당 정책
주 메모리만 이용하는 경우 단일 프로세스 환경과 다중 프로세스 환경으로 나누어진다
단일인 경우 오버레이 방식이 있고, 다중일 경우 아래에 연속할당 방식처럼 고정 방식과 가변 방식으로 나누어진다.
하지만 프로그램의 크기가 커 주 메모리만으로 감당 할 수 없을 때 가상메모리를 사용하게 되는데
가상메모리는 다중일 주 메모리와 같이 고정 방식과 가변 방식으로 나누어 지는데
고정 방식에는 페이징, 가변 방식으로는 세그멘테이션 방식이 있다.
- 연속 할당
주소 변환이 매우 간단하지만 단편화 문제가 많이 발생
1. 고정된 크기로 분할
2. 가변 분할
3. 프로세스 배치
- 비연속 할당
연속할당에 비해 단편화 문제는 적지만 주소변환이 복잡
4. 페이징
5. 세그멘테이션
고정된 크기 분할
메모리의 크기를 전부 다 똑같이 분할 할 수도 있고, 아닐 수도 있지만, 미리 정해진 크기만큼 주 메모리를 분할하여 프로그램들을 적재하는 방식이다.
구현은 간단하지만 메모리 공간의 낭비라는 큰 단점을 가지고 있어 단편화가 발생한다.
단편화에는 외부 단편화 / 내부 단편화로 나뉘어진다.
외부 단편화 : 사용가능한 공간을 합치면 충분한 공간이 되지만, 개별로 쓰기에는 너무 작은 조각들로 여러곳에 분산되어있는 상황
내부 단편화 : 고정된 크기의 메모리 보다 더 크게 할당 된 상황
가변 분할
사용 가능한 메모리 블록인 공간(hole)의 크기가 다양하여, 새로운 프로그램이 도착하면, 적재 가능한 충분한 크기의 메모리 공간을 할당해 주는 방식이다.
이런 방식에서 운영체제는 할당된 분할 수와, 사용가능한 분할에 관한 정보를 유지해야한다.
현재 프로세스 5,8,2가 메모리에있는데 8 프로세스가 종료되면 그 만큼의 공간이 생기고 그 공간으로 9 프로그램을 적재
적재 후에도 사용가능한 공간이 존재하기 때문에 10 프로그램 역시 적재 할 수 있다
가변 분할의 경우 프로그램의 크기보다 사용가능한 메모리 공간이 남는 내부 단편화의 현상은 없지만,
중간 중간에 종료되는 프로그램들이 존재하기에 hole 발생하는데 이런 현상으로 외부 단편화 현상은 발생할 수 있다.
프로세스 배치
프로세스의 배치를 통해 가변분할 방식에서 발생하는 문제점인 외부 단편화를 해결 하고자 생겨난 방식
가장 적절한 hole을 찾는 방식
1) First - fit
제일 처음 발견된 사용 가능한 공간에 프로세스를 배치
2) Best - fit
사용 가능한 공간들 중에서 가장 작은 것을 선택
즉, 메모리의 빈 공간을 모두 탐색한 후에 프로세스의 크기 보다 큰 hole 중 가장 작은 hole을 배치
단편화의 크기를 최대한 줄일 수 있지만, 그만큼 탐색하는시간이 필요
3) Worst - fit
Best - fit과 반대로 가장 큰 hole에 배치
가장 큰 hole에 배치하면 남은 공간들이 많이 생겨 추후에 사용 할 수 있지만, 탐색시간도 오래 걸리는데다가
당장 큰 단편화가 발생하기 때문에 효율이 안 좋음
페이징
물리메모리( RAM )을 Frame이라는 고정크기로 분리해 놓고, 논리 메모리( 프로세스 )를 페이지라고 불리는 고정크기의 블록만큼 잘라서 메모리에 적재한다. 이 기법을 사용하면 위의 방식들과는 다르게 연속적으로 저장될 필요없이 물리 메모리에 적절하게 배치됨으로 외부 단편화를 해결 할 수 있다 .
하지만 내부단편화 문제의 비중이 늘어나는 단점이 존재한다.
예를 들면 페이지의 크기가 1024B , 프로세스 A가 3172B 메모리를 요구한다고 하면, 총 3개의 페이지 프레임으로 나누어지고, 100B가 남게되는데, 이때, 마지막 100B는 1024B에 들어가기 때문에 924B 크기의 내부 단편화 문제가 일어나게 된다.
여기서 궁금한 점이 있었다. 프로세스를 나누는데
" 어떻게 메모리에서는 하나의 프로세스로 인식 " 하는가에 대한 문제였다.
그것은 MMU 방식으로 논리 주소를 물리 주소로 변환해 주기 때문이다.
아래의 그림 처럼 프로세스가 가지고 있는 논리적 메모리의 주소를와 물리적 메모리 어디에 저장될지에 대한 정보를 가지고 있는 페이지 테이블을 통해 프로세스의 대한 정보를 저장하고 CPU가 필요로 할떄 다시 꺼내쓰는 방식이다.
세그먼테이션
페이징은 특징 크기만큼 자른거였다면, 세그먼테이션의 방식은 논리적 내용으로 자르는 방법
프로세스 안에 우리는 프로세스 메모리 영역이 있는걸 알고 있다.
그안에는 코드, 데이터, 스택, 힙 영역이 있는데 각각 저장되는 영역이 다른것을 이용하여
Main 따로 함수는 함수끼리 이런식으로 논리적으로 나누는 것이다.
세그멘테이션 역시 프로세스를 나누기 떄문에 페이지 기법에서 MMU 방식을 사용하여 페이지 테이블을 이용해 논리주소를 물리주소 공간에 적재하는 방식과 다를게 없다.
다르다면 세그먼트 테이블을 따로 만들어서 저장하는 것이다.
페이지 기법과는 다르게 물리주소 공간을 나누지 않고 각각의 세그먼트들의 시작 부터 최대 저장될수있는 물리주소 공간까지 범위를 정해주는 세그먼트 테이블을 통해 적재되는데 이때, 세그먼트들의 번호를 같이 저장하여 관리한다.
고정된 크기가 아니고, 빈 공간에 맞게 끔 동적으로 할당하다 보니 내부 단편화는 일어나지 않지만, 영역내에 조금씩 남는 부분이 생겨서 외부 단편화 현상이 발생 할 수 있다.
이러한 이유로 세그멘테이션의 장점과 페이징의 장점을 섞어서 사용하는 세그먼트 페이징 기법이 있다.
이 기법은 세그멘테이션으로 분리를 한 후 각각의 세그먼트들 안에 페이징 기법을 사용하여 저장하는 방식이다.
'운영체제' 카테고리의 다른 글
가상메모리(페이지 교체 알고리즘) (0) | 2022.02.09 |
---|---|
가상 메모리 (0) | 2022.02.09 |
동기 비동기(프로세스 동기화) (0) | 2022.02.09 |
프로세스 상태, CPU 스케줄러 (0) | 2022.02.09 |
프로세스(PROCESS) , 스레드(THREAD) #2 (0) | 2022.02.09 |