본문 바로가기

카테고리 없음

7장 물리 메모리 관리

메모리 관리의 개요

 

1 메모리 관리의 복잡성

우리는 컴퓨터는 폰노이만 아케텍쳐 처리 방식을 전제하기 때문에

모든 프로그램은 '메모리'에 올라와야 실행이 가능하다.

 

과거에 일괄 처리 시스템을 작업을 할 때는 

한가지 작업에만 집중했기 때문에 메모리 관리가 어렵지 않았지만,

현재 우리가 사용하고 있는 

'시분할'시스템은 메모리 관리가 복잡하다고 할 수 있다.

 

 

2 메모리 관리의 이중성

프로그램을 돌릴 때 2가지 관점으로 우리는 메모리를 바라 볼 수 있다.

 

프로세스 입장 : 하나를 독점해서 빨리 끝내려고 함.

메모리 관리자 입장 : 한꺼번에 다 끝내는게 아니라 도마를 쪼개서 여러가지를 효율적으로 관리하길 원함.

 

이런 이중성으로 프로그램 내 충돌이 발생하기독 한다.

 

 

3. 소스코드의 번역과 실행

언어 번역 프로그램의 종류

 

1. 컴파일러 : 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행

2. 인터프리터: 소스 코드를 한 행씩 번역하고 실행 ex) 파이썬

 

 

4. 메모리 관리자의 역할

 

메모리 관리는 메모리 관리자라는 하드웨어가 관리한다.

메모리 관리자의 작업은 크게 아래와 같이 설명할 수 있다.

1. 가져오기 : 프로세스와 데이터를 메모리로 가져옴
2. 배치 : 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려 놓을지 결정함
3. 재배치 : 꽉 차 있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업을 함.

 

 

 

출처 : https://www.dataversity.net/what-is-data-strategy/

 

위처럼 메모리 관리자의 작업은 크게

프로세스와 데이터를 메모리로 가져오는 작업이다.

이때 프로세스와 데이터를 가져오기 위해서는 전략이 기반이 되어야 하며,

우리는 이것을 메모리 관리자의 정책 이라고 한다.

 

 

1. 가져오기 정책 : 프로세그 필요하는 데이터를 언제 메모리로 가져올지 결정하는 정책

2. 배치 정책 : 가져온 프로세스를 어떤 위치에 올려놓을지 결정하는 정책

3. 재배치 정책 : 메모리가 꽉 차 있을 때 어던 프로세스를 내보낼지 결정하는 정책

 

 

 

메모리 주소

 

1 CPU 비트란?

한 번에 다룰 수 있는 데이터의 최대 크기를 의미하며 34bit CPU가 한 번에 다룰 수 있는 데이터의 최대 크기는 32bit 이다.

32bit는 약 4GB의 메모리 주소를 가지며 64bit는 약 16,777,126TB으로 거의 무한대에 가까운 메모리를 사용 가능하다.

 

 

 

2 물리 주소 공간과 논리 주소 공간

 

 시스템 정보에 있는 메모리 정보

위 사진은 필자의 컴퓨터 메모리 정보이다.

빨간색 박스에 보이는 것 처럼 총 실제 메모리는 15.9GB (약 16GB) 이지만

실제로 필자가 사용 가능한 실제 메모리는 8.56GB이다.

 

이처럼 메모리는 하드웨어에서 바라본 주소 공간과

사용자 입장에서 바라본 주소 공간이 다르다는 것을 알 수 있다.

 

다시 정리하자면

물리 주소 공간은 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 크기가 다르고

논리 주소 공간은 사용자 입장에서 바라본 주소 공간이라고 할 수 있다.

 

 

3 절대 주소와 상대주소

3.1 메모리 영역의 구분

 

단순 메모리 구조

한 번에 한 가지 일만 처리하는 일괄 처리 스시템에서 볼 수 있으며

메모리를 운영체제 영역과 사용자 영역으로 나누어서 관리한다. 

 

사용자 프로세스는 운영체제 영역을 피하여 메모리에 적재하지만

사용자 프로세스가 운영체제의 크기에 따라 매번 적재되는 주소가 달리즈는 것이 번거럽기 때문에 이를 개선하여 프로세스를 메모리 최상위 부터 사용

 

가장 심플함 구조로 한번에 한가지만 처리할 수 있으며 현재는 이 구조를 사용하지는 않는다.

 

3.2 경계 레지스터

운영체제 영역과 사용자 영역 경계 지점의 주소를 가진 레지스터를 뜻하며 CPU 내에 있는 경계 레지스터가 사용자 영역이 운영체제 영역으로 침범하는 것을 막아준다.

 

3.3 절대주소와 상대주소의 개념

 

절대 주소 :실제 물리 주소를 가리키는 주소를 뜻하며 컴퓨터에 램 메모리의 실제 주소를 뜻한다.

상대 주소 : 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소이며 사용자 입장에서 바라본 주소이다. 절대 주소와 관계없이 항상 0번지 부터 시작한다.

 

절대 주소와 상대 주소의 차이

논리 주소 공간을 상대 주소를 사용하는 주소 공간이고

물리 주소 공간은 절대 주소를 사용하는 주소 공간이다.

 

 

요약 

절대 주소 : 물리주소

상대 주소 : os가 관리하는 주소, 운영체제가 어디서 끝나고 자신의 데이터가 어디서 존재하느니 알 필요 없이 주소 공간이 항상 0번지 부터 시작함 (물리 주소 체계를 구별한다는 뜻)

 

 

3.4 상재 주소를 절대 주소로 변환하는 과정

 

메모리 접근 시 상대 주소를 사용하면 절대 주소로 변환해야 한다.

메모리 관리자는 사용자가 프로세스가 상대 주소를 사용하여 메모리에 접근할 때 마다 상대 주소값에 재비치 레지스터 값을 더하여 절대 주소를 구한다.

 

상대주소를 사용하면

절대 주소로 변환해야된다.

즉 메모리 관리자가 변환하는 과정도 거치게 한다는 뜻이다.

 

*핵심
직접 관리보다는 간접 관리가 효율적 

 

 

4 단일 프로그래밍 환경에서의 메모리 할당

4.1 메모리 오버레이

메모리 오버레인란, 프로그램의 크기가 피지컬 메모리 보다 클 때 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 방법이다.

 

오늘날 이미 용량이 큰 메모리를 많이 사용하고 있기 때문에 오버레이 기법은 잘 사용하지 않는다.

 

 

프로그램이 실행되면 필요한 모듈만 메모리에 올라와 실행하는 작동 방식을 기반하고 있으며 프로그램 전체가 아니라 일부만 메모리에 올라와도 실행이 가능하다는 특징 있다.

(필요한 모듈만 올려서 중복해서 사용하겠다라는 개념)

 

 

 

4.3 스왑

오늘날 오버레이가 의미가 있는 이유는 스왑 때문이다.

스왑이란 메모리가 모자라서 쫒겨난 프로세스를 저장장치의 특별한 공간에 모아두는 영역으로 쫒겨났다가 다시 돌아가는 데이터가 머무는 곳이기 때문에 저장장치는 장소만 빌려주고 메모리는 관리자가 관리한다.

 

앞에 필자 컴퓨터 정보에서 실제 사용한 메모리와 현재 메모리의 차이가 다른 이유도

사용자는 실제 메모리 크기와 스왑 영역의 합쳐진 것을 

전체 메모리로 인식 하기 때문이다.

 

스왑인과 스왑아웃

스왑인 : 스왑 영역에서 메모리로 데이터를 가져오는 작업

스왑아웃 : 메모리에서 스왑 영역으로 데이터를 내보내는 작업

 

 

 

5 다중 프로그래밍 환경에서의 메모리 할당

이전 앞에서는 단일 프로그래밍 환경에서는 메모리를 어떻게 관리하는지 알아봤고 이 번 챕터에서는

한 번에 여러 프로세스를 동시에 실행하는 경우 메모리가 관리가 더 복잡해지는데, 프로세스들의 크기가 달라 메모리를 어떻게 사용할지 알아보도록 한다.

 

 

5.1 메모리 분할 방식

메모리에 여러 개의 프로세스를 배치하는 방법은 아래와 같이 2가지 방식 있다.

가변 분할 방식 : 프로세스의 크기에 따라 메모리를 나누는 것
고정 분할 방식 : 프로세스의 크기와 상관업이 메모리를 같은 크기로 나누는 것.

출처 : https://news.joins.com/article/23522828

 

위 분할 방식을 식당 의자에 비유해볼 수 있겠다.

가변 분할 방식은 손님의 신체 크기에 맞게 의자를 준비하는것이고

고정 분할 방식은 손님으 신체 크기와 상관없이 같은 크기의 의자를 준비하는 것으로 이해할 수 있다.

 

손님 자리 배치로도 비유할 수 있다.

가변 분할 방식은 어디에 앉든 제약이 없기 때문에 손님들이 알아서 편한 자리에 앉는 것이고

고정 분할 방식은 의자를 특정 파티션으로 나누고 손님들의 자리를 파티션 단위로 배정하는 것이다. 

 

 

 

5.1 메모리 분할 방식의 구현

 

가변 분할 방식

프로세스 크기에 맞게 메모리를 분할하는것이다. 

즉 가변이라는 단어의 핵심은 프로세스 크기에 따라 변동한다는 것.

 

고정분할 방식

프로세스의 크기와 상관없이 특정 메모리가 고정되어 있는 것으로

남아 있는 메모리는 스왑 시키는 것이다.

  가변 분할 방식 고정 분할 방식
장점 프로세스를 한 덩어리로 처리하여 연속된 공간에 배치. 메모리를 일정한 크기로 나누어 효율적으로 처리 가능.
단점 비어 있는 공간도 하나로 합치고 이 과정에서 다른 프로세스의 자리도 옮겨야 하므로 메모리 관리가 복잡. 쓸모 없는 공간이 발생하여 메모리 낭비가 발생할 수 있음. 

* 오늘날은 이 두 가지 방식의 장점을 결합한 방법을 사용 *

 

'단편화'란?

가변 분할 방식에서 적당한 공간이 없어 메모리를 배정하지 못하는 특성 상 발생하는 빈 공간을 뜻한디.

 

 

외부 단편화 해결 방법

출처 : https://mainia.tistory.com/2418

작은 공간이(조각)이 발생하지 않도록 프로세스를 배치하는 것이며

조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 동아리는 만드는 작업으로 단편화를 해결할 수 있다.

 

* 이미 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 맏느는 작업 *

 

 

5.1 메모리 배치 방식

최초 배치 : 무조건 처음 나오는 것에 배치

최저 배치 : 배치하려는 프로세스 사이즈와 가장 유사한 곳에 배치

최악 배치 : 제일 큰 곳에 배치 ( 단편화를 막는 방법이 될 수 있음)

 

[요약] 가변 분할 방식과 고정 분할 방식의 비교

구분 가변 분할 방식 고정 분할방식
메모리 단위 세그멘테이션 페이징
특징 연속 메모리 할당 비연속 메모리 할당
장점 프로세스를 한 덩이리로 관리가능 메모리 관리가 편리
단점 빈 공간의 관리가 어려움 프로세스가 분할되어 처리됨
단편화 외부 단편화 내부 단편화

 

5 버디 시스템

가변 분할 방식과 고정 분할 방식의 장점을 합쳐논 것으로,

간단하게 절반을 쪼개서 고정을 시키는 것이라고 이해할 수 있다.

 

즉 하나의 구역을 만들어 고정을 반씩 하는것으로

이 방법도 내부 단편화가 생기지만 그 크기가 생대적으로 적다.

비슷한 크기의 조각이 서로 모여 작은 조각들을 통합하여 큰 조직을 만들기 쉽다는 특징이 있다.

 

 

 

연습문제

 

1. 인터프리터

2. obj 코드

3. 동적 라이브러리

4. 재배치 정책

5. 4GB

6. 상대 주소

7. 재배치 레지스터

8. 메모리 오버레이

9. 스왑 영역

10. 외부 단편화

11. 내부 단편화

12. 최적 배치

13. 최소 배치

14. 최악 배치

15. 조각 모음

16. 버디 시스템

 

 

 

[별첨] C언어에서 발목을 잡는 '포인터'와 메모리와의 관계

 

C를 배우는 학생이라면

포인터를 배우는 CHAPTER 부터 막막함을 느꼈을 것이다.

필자도 C언어를 공부하면서 포인터 부분에서 포기를 했던 기억이 난다.

 

그럼 왜 C에서 강조하는 포인터가 뭔지 전체적인 그림을 얇게 그려봤다.

 

프로그래밍의 개발 환경에 좋아지면서 

오늘날 개발자는 내부에서 돌아가는 일을 알지 못해도 소프트웨어를 무난히 만들 수 있게 되었다.

 

프로그래밍에 사용하는 언어도 기계어로 점점 멀어져서 간결한 언어로 손 쉽게 프로그래밍을 할 수 있는 시대가 되었다.

 

하지만 이렇게 간결한 언어일수록, 기계에서 세부적으로 돌아가는 일들을 언어를 작성하는 개발자로부터 감춰놓게 된다.

 

그 대표적인 예가 메모리가 어떻게 운영에 관한 내용이다.

 

포인터란

 

개발자가 컴퓨터의 메모리에 보다 직접적으로 접근해서 이를 제어할 수 있도록 해주는 도구라고 이해할 수 있다면.

기다란 집게 같은 것으로 이해할 수 있다.

 

우리가 프로그램을 지정한 값으로 여러 곳에서 써야될 경우가 있을 것이다.

이때 이 값을 다른 곳에 하나하나 보낸다면 그 만큼

메모리를 차지하게 될 것이고

효울적이지 않다.

 

하지만 대신 지정 값의 페이지를 보내주게 된다면 

굳이 메모리를 할당하지 않고 

특정 페이지 주소 값을 보내주면 되기 때문에

메모리를 절약할 수 있다.

 

이처럼 C언어 GOLANG RUST 같은 언어들로 사용자가 직접 관리 할 수 있는

포인터 기능으로 메모리를 직접 관리한다면

좀 더 최적화된 메모리 구조를 개발할 수 있게 된다.

 

 

 

 

 

 

참고문헌

조성호.쉽게배우는 운영체제.2019발행.한빛아카데미