메모리 관리

2023. 11. 24. 22:51스터디/OS 스터디

728x90

메모리 관리는 프로세스들을 위해 메모리를 할당하고 제거하며 보호하는 활동이다. 

또한 디스크에 있는 프로그램을 실행하기 위해 메모리에 적재한 후 메모리 관리자가 예약된 메모리를 할당해주는 역할을 한다.

여러 프로세스가 메모리에 상주할 수 있도록 운영체제가 동적으로 메모리를 세분화하는 역할도 한다. 

 

메모리 정책

적재정책 

디스크에서 메모리로 프로세스를 반입하는 시기를 결정한다.

프로세스가 요청을 할 떄 적재하는 방식(요구 적재)와

시스템이 요청을 미리 예층해서 매모리에 적재(예상 적재)하는 방식이 있다.

 

배치정책

디스크에서 반입한 프로세스를 메모리 어느 위치에 저장할 것인지 결정하는 방식이다.

충분히 큰 첫 공백에 적재하는 최초적합,

가장 작은 크기 공간에 적재하는 최적 적합,

가장 큰 공간에 적재하는 최악 적합 등이 있다.

 

대치 정책(재배치 정책, 교체 정책)

메모리가 충분하지 않을 때 현재 메모리에 적재된 프로세스 중 제거할 프로세스를 결정하는 교체 방법이다. 

 

메모리 구조

메모리 주소는 크게 두 관점으로 해석할 수 있다.

프로그래머가 프로그래밍에 사용하는 공간으로 보는 논리적 관점의 논리적 주소,

실제 데이터나 프로그램을 저장하는 공간으로 보는 물리적 관점의 물리적 주소로 볼 수 있다.

논리적 주소는 가상 주소라고도 한다.

 

논리적 주소와 물리적 주소 변환은 메모리 관리 장치(MMU)가 처리한다.

즉 MMU는 메모리 분할, 페이징, 세그멘테이션 등을 통해 변환할 수 있다.

 

논리적 주소를 물리적 주소로 매핑 시켜주는 작업을 바인딩이라고 한다.

변환하는 과정을 컴파일 -> 적재 -> 실행 으로 구분할 수 있다.

메모리 관리 관련 용어

동적 적재

바인딩을 최대한 늦춰 실행 직전에 주소를 확정하는 방식

메모리를 효율적으로 운영할 수 있다.

모든 루틴을 메모리에 적재하지 않고, 교체 가능한 형태로 디스크에 적재한다. 

프로그램 전체 양이 많을 때 용이하다.

 

중첩(오버레이)

당장 필요하지 않은 프로그램 일부를 중첩으로 설정할 수 있다.

실행하려는 프로그램이 메모리보다 클 때 용이하다.

보통 초기 - 처리 - 출력 모듈로 나누고, 초기 -> 처리 -> 출력 순으로 실행한다.

중첩은 운영체제 지원 없이 실행이 가능하다.

보통 마이크로 컴퓨터나, 메모리 제안이 큰 하드웨어에서 사용한다 

 

 

 

스와핑(프로세스 교체)

프로세스 수행이 완료됐으면 보조기억장치로 보내고(스왑 아웃),

새롭게 시작하는 프로세스는 메모리에 적재하는(스왑 인)

과정을 말한다.

스와핑은 초기 시분할 시스템에서 채택하고, 최근에는 페이지로 발전했다.

 

 

메모리 적재 방법

메모리를 프로세스에 적재하는 방법은 크게 두 가지가 있다.

하나는 연속적으로 적재하는 방법(연속 메모리 적재 방법)

다른 하나는 페이지나 세그먼트 단위로 나눠 여러 곳에 적재하는 방법(비연속 메모리 적재 방법, 분산 적재 방법)이 있다.

직접 배치, 중첩, 고장 분할 등이 연속 적재 방법이다.

허나, 내/외부 단편화 문제 및 실행 시간 낭비 분제가 있어서 보통 분산 적재 방법을 사용한다.

 

 

연속 메모리 할당

메모리를 프로세스에 적재할 때 연속적으로 적재하는 방식이다.

초기 컴퓨터 시스템에서 많이 사용하던 방식이다.

메모리를 제어하는 권한이 사용자에게 있어서 사용자가 주소를 잘못 지정하면 운영체제가 손상될 수 있다

따라서 경계 레지스터를 두어서 이를 방지한다

기준 레지스터는 물리적 주소, 경제 레지스터는 논리적 주소이다.

 

연속 메모리 할당은 구조는 단순하나, 한 번에 한 프로그램만 사용할 수 있고, 메모리 효율성이 떨어진다.

또한, 메모리보다 큰 프로그램을 수행할 수 없어서 스와핑으로 제한된 메모리만 확장한다. 

자원 낭비도 심하고, 스와핑 비용이 많이 든다.

다중 프로그램이 환경에서 연속 메모리는 크게

메모리를 여러 개의 고정된 크기로 분할하는 고정 분할 방법과,

필요한 만큼만 할당하는 가변 분할 방법이 있다.

 

고정 분할 방법

프로세스별로 고정된 크기로 할당하는 방식이다.

내부 단편화

고정분할 방식에서는 기준 레지스터와 경계 레지스터를 통해 메모리를 보호한다.

 

가별 분할 방법

고정된 경계를 없애고, 각 프로세스가 필요한 만큼 메모리를 할당하는 방법이다.

각 메모리 기준 및 크기를 분할 테이블에서 관리한다.

 

가변 분할 시 메모리 배치 방법으로 크게 최초 적합, 최적 적합 최악 적합 등이 있다.

 

최초 적합

사용 가능 공간 중 충분히 큰 첫 공간에 할당하는 방식이다.

공간을 빨리 찾을 수 있으나, 공간 활용율이 떨어진다.

최적 적합

사용 가능 공간 중 가장 작은 공간에 할당한다.

사용 가능 공간을 계속 정렬해야해서 속도는 느리나, 공간 활용도를 높일 수 있다. 

최악 적합

프로세스를 가장 큰 공간에 할당한다.

이름때문에 이게 최악으로 보이지만, 그런건 아니다.

가장 큰 공간에 할당해서 또 다른 공간을 만들어서

오히려 최적 적합처럼 짜잘한 공간을 만드는 것 보다 공간 활용도가 높을 수 있다.

 

메모리 낭비 해결 방안

가변 분할에서는 외부 단편화 문제가 발생한다.

따라서 이러한 문제를 메모리 통합 혹은 압출 방법을 생각할 수 있다.

메모리 통합은 한 작업이 끝나면 인접한 다른 빈 공간과 하나로 합치는 것이다.

 

메모리 압축은 메모리 내용을 움직여서 사용 가능한 큰 블록을 하나 만드는 것이다.

압축을 하는 동안 모든 일을 중지해야하고, 응답 시간이 일정하지 않고, 오버헤드가 발생하고, 자원 소모도 크지만, 통합 방식보다 메모리 활용도가 높다.

 

버디 시스템

고정 분할이나 동적 분할 모두 단편화 문제가 있었다.

이를 해결하기 위해 버디 시스템을 제안했다.

큰 버퍼를 반복적으로 이등분하여 작은 버퍼를 만들며, 프로세스를 할당할 수 있을 때 제공하는 방식이다.

 

버디 시스템으로 고정 분할과 가변 분할 방식을 해결할 수 있다.

하지면 최근에는 페이징이나 세그멘테이션을 활용한 가상 메모리를 선호한다.

 

페이징

작업을 크기가 동일한 페이지로 나눠서 처리하는 방법이다.

프로세스를 크기가 동일한 페이지로 나누고, 메인 메모리도 프레임이라는 고정 크기 블록으로 나누어 프레임에 페이지를 적재하는 방식이다.

 

페이징 시스템에서는 다음과 같은 작업을 준비해야 한다.

- 프로세스에 필요한 페이지를 결정하여 페이지 번호를 부여

- 메모리의 빈 프레임을 조사하여 프로세스를 적재할 위치 파악

- 프로세스의 페이지를 빈 프레임에 적재하도록 준비

 

페이징 방법은 빈 프레임에 어떤 페이지든 적재할 수 있어 메모리를 효율적으로 사용할 수 있고, 외부 단편화도 발생하지 않는다.

하지만, 운영체제가 페이지를 관리해야하고, 필요 공간과 페이지 크기가 맞지 않으면 내부 단편화가 발생한다.

페이지 크기가 작을수록 내부 단편화 발생이 적어지지만, 페이지 테이블을 유지하는 부담이 크다.

 

그러면 OS는 페이지를 어떻게 관리할까?

프로세서가 만드는 논리적 주소는 페이지 번호와 오프셋(Offset)으로 구성된다.

페이지 번호를 기준으로 기준 주소를 얻고, 거기에 오프셋 값을 더하면 물리적 주소가 된다.

이철머 페이지 테이블을 이용하여 논리 주소를 물리 주소로 변환한다.

 

다중 단계 페이징

 

논리적 주소가 클수록 페이지테이블 크기도 증가한다. 

n단계 페이징 시스템을 구성해서 페이지테이블의 크기를 줄일 수 있다.

 

세그멘테이션

페이징은 고정 크기로 분할하기에 내부 단편화가 발생할 수 있다.

이와 달리 세그멘테이션은 메모리 크기를 동적으로 분할할 수 있다.

각 스택, 힙, 메인 프로그램, 전역 변수 등 사용자 관점 별로 메모리를 별도로 분리할 수 있다.

 

각 프로세스는 고유의 세그먼트 테이블을 메모리에 유지해야 한다.

728x90

'스터디 > OS 스터디' 카테고리의 다른 글

페이지 대치 알고리즘  (2) 2023.11.25
가상 메모리  (1) 2023.11.25
스케줄링 알고리즘  (1) 2023.11.24
프로세스 스케줄링이란  (0) 2023.11.18
교착 상태와 기아 상태  (0) 2023.11.11