운영체제

7.물리 메모리 관리

J개발자 2020. 11. 30. 22:58

01 메모리 관리 개요

1.메모리의 용량을 늘리면 작업 속도가 빨라지지만 어느 수준 이상이 되면 그 차이가 적어진다. cpu의 작업 공간이 메모리이기 때문에 메모리 관리는 성능에 큰 영향을 미친다. 메모리 관리와 메모리에 프로세스를 항당하는 방식을 알아보자.

운영체제도 프로그램이므로 메모리에 올라와야 실행가능하며 메모리에는 사용자 프로세스 뿐 아니라 운영체제 프로세스도 공존한다. 컴퓨터 전원을 키면 부팅이 이루어지며 하드디스크에 저장된 운영체제가 메모리에 올라오고 부팅이 끝나면 메모리에서 작업을 할 수 있게 되는 것이다. 메모리 관리는 메모리 관리 시스템 MMS가 담당한다.

  • MMS 역할(메모리 관리 유닛이라는 하드웨어를 일컫는다.) :가져오기/배치/재배치

가져오기 작업: 프로세스와 데이터를 메모리로 가져오는 작업이다.메모리 관리자는 사용자가 요청하면 가져오고 일부 실행도 가능하다. 요청없이도 앞으로 필요할 것이라 예상되는 데이터를 미리 가져오기도 한다.

배치 작업: 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다.배치 작업 전에 메모리를 어떤 크기로 자를 것인지가 매우 중요하다. (같은 크기?또는 프로세스에 맞게?)이에 따라 메모리 관리의 복잡성이 달라지기 때문이다.

재배치 작업: 새로운 프로세스를 가져와야 하는데 메모리가 꽉 찼다면 메모리에 있는 프로세스를 하드디스크로 옮겨놓아야 한다.교체 알고리즘을 통해 수행된다.

 

2. 메모리 관리의 이중성은 프로세스 입장에서 작업의 편리함과 관리자 입장에서 관리의 편리함이 충돌을 일으키는 것을 의미한다.

 

3. 메모리를 계층 구조로 만들어 작업 속도를 올리고 가격을 낮추는 방법을 계층적 메모리 구조라고 한다.

캐시(빠르고 비싸다)<->메모리<->제2저장장치(느리고 싸다)

 

4. 언어 번역 프로그램은 고급 언어로 작성한 소스코드(C,JAVA)를 컴퓨터가 실행할 수 있는 기계어로 번역하는 프로그램이다. 대표적으로 컴파일러와 인터프리터이다.

  • 컴파일러는 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행한다.(C언어,자바)

주로 대형프로그램에 사용되며 변수를 미리 선언해야 한다. 컴파일 과정에서 최적화된 실행 파일이 만들어진다.

목적-오류발견,코드 최적화

 

소스코드→컴파일러→목적코드→링커→실행

                   ( 컴파일 )

 

  • 인터프리터는 소스코드를 한 행씩 번역하여 실행한다.즉 실행이 편리하다.(자바스크립트,베이직)

변수를 미리 선언할 필요가 없으며 소스코드가 한 줄씩 실행된다.웹 프로그램 같은 간단한 프로그램을 작성하거나 데이터베이스를 다른 응용 프로그램과 연결하는 코드를 작성할때 사용된다.

     


02 메모리 주소

1. 32bit CPU와 64bit CPU의 차이

   CPU의 비트는 한번에 다룰 수 있는 데이터의 최대 크기를 의미한다. 메모리 주소 공간의 크기와도 연관이 있다.

   32비트CPU 경우 메모리 주소를 지정하는 레지스터인 메모리 주소 레지스터(MAR)의 크기도 32비트이므로 표현가능     범위 주소가 2의 32승 개 이다.약 4GB이다.

   64비트 CPU는 레지스터의 크기, 버스의 대역폭, 한 번에 처리되는 데이터의 최대 크기 등이 32비트의 2배 이다.           더 속도가 빠르고 사용가능 메모리도 크다.즉 2의 64승 개 이므로 무한대에 가까운 메모리를 사용할 수 있다.

 

2.절대 주소와 상대 주소

  사용자 영역이 운영체제 영역으로 침범하는 것을 막으려면 하드웨어의 도움이 필요한데, 이는 CPU내에 있는 경계 레지스터가 담당한다.(경계 지점의 주소를 가짐) 메모리 관리자는 사용자가 작업을 요청할 때마다 경계 레지스터 값을 벗어나는지 검사하고 벗어나는 작업 요청시 프로세스를 종료한다.


운영체제 영역

경계 레지스터

사용자 영역

절대 주소: 실제 메모리 주소를 가리키며 메모리 관리자 입장에서 바라본 주소이다. 즉 메모리 주소 레지스터가 사용하는 주소로 램 메모리의 실제 주소이다.

 

상대 주소:  사용자 영역이 시작되는 번지를 0번지로 변경해 사용하는 주소 지정방식으로 사용자 프로세스 입장에서 바라본 주소이다. 이를 논리 주소 공간이라고도 부른다.상대 적인 개념이다.

 

상대 주소를 절대 주소로 변환하는 과정: 메모리 접근시 상대주소는 절대 주소로 변환해야한다. 프로세스가 실행되는 동안 메모리 관리자가 매우 빠르게 이 처리를 한다.

1.사용자 프로세스가 상대주소 40번지에 있는 데이터 요청. 2.CPU는 메모리 관리자에게 40번지 내용 가져오라 명령. 3.메모리 관리자는 재배치 레지스터를 사용하여 상대 주소 40번지를 절대주소 400번지로 변환하고 메모리 400번지에  저장된 데이터를 가져옴.

CPU→(상대주소)→재배치 레지스터(메모리 관리자)→(절대주소)→메모리

             40                       360                            400          400

 


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

1. 메모리 오버레이: 프로그램의 크기가 실제 메모리보다 클때 전체 프로그램을 메모리에 가져오지 않고 적당한 크기로 잘라서 가져오는 기법. (겹겹이 쌓음) 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용한다.   어떤 모듈을 가져오거나 내보낼지는 CPU 레지스터 중 PC(프로그램 카운터)가 결정한다.

 

2. 스왑: 메모리가 모자라서 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두는데 이영역을 스왑 영역이라고 부른다. 스왑인,스왑아웃. 원래 하드디스크 같은 저장장치는 저장장치 관리자가 관리하지만 이 영역은 메모리 관리자가 관리한다. 저장장치가 장소만 빌려주고 관리는 메모리 관리자가 하는 것이다.

실제 메모리의 크기+ 스왑영역의 크기(메모리 크기) = 전체 메모리로 인식하고 사용할 수 있다.(실제 메모리의 모자란 부분을 보충하고 실제 메모리의 크기에 상관없이 큰 프로그램 실행가능)

 

 

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

프로세스들의 크기가 달라 메모리를 어떻게 나누어 사용할 것인지가 가장 큰 관건.

 

1.메모리 분할 방식

가변 분할 방식: 프로세스의 크기에 따라 메모리 나눈다.연속 메모리 할당이라고도 한다.

하나의 프로세스를 연속된 공간에 배치한다는 장점과 메모리 관리가 복잡하다는 단점이 있다.

고정 분할 방식: 프로세스의 크기와 상관없이 메모리를 같은 크기로 나눈다.(관리자 입장에서 관리 용이.) 비연속 메모리 할당이라고도 한다.

메모리 관리가 수월하고 메모리 통합 같은 부가적인 작업이 필요없는 장점과 쓸모 없는 공간으로 인해 메모리 낭비가 발생가능하다는 단점이 있다.

 

현대 운영체제에서는 메모리 관리는 기본적으로 고정 분할 방식을 사용하면서 이부분은 가변분할 방식을 혼합하고 있다.

 

 

1.가상 메모리 시스템에서는 가변 분할 방식세크먼테이션 기법이라고 한다.

 

식당을 예로 들면 여러 테이블중 2명인 팀이 나가고 4명인 팀이 기다리고 있는 상황에서 2인 자리를 차지 할 수 없기 때문에 계속 기다리게 되는 아사현상이 발생할 수 있고 이러한 작은 조각들이 발생하는 단편화(조각화) 현상이 발생한다.

물리 메모리에서 이 빈 공간을 외부 단편화라고 하는데 이 문제를 해결하기 위해 메모리 배치 방식이나 조각 모음을 사용한다.

  • 메모리 배치 방식: 최초 배치/최적배치/최악배치/버디 시스템
최초배치 최적배치 최악배치
단편화 고려하지 않고 프로세스를 메모리의 빈 공간에 배치 할때 적재 가능한 공간 순서대로 찾아 배치. 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스를 배치. 최적배치와 정반대로 가장 큰 공간에 프로세스 배치.
  • 조각 모음: 위와 같은 메모리 배치 방식을 사용해도 단편화가 발생한다. 때문에 이미 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 만드는 것이다. 조각 모음을 할때는 프로세스의 동작이 멈추고 프로세스의 이동으로 인해 상대 주소값이 바뀐다. 이때문에 작업시간이 많이 걸린다.

 

가변 분할 방식은 외부 단편화로 인해 조각 모음 같은 부가적인 작업이 필요하므로 메모리 관리가 복잡하다.

 

 

2.가상 메모리 시스템에서는 고정 분할 방식페이징이라고도 한다.

  

 

 (프로세스가 메모리의 여러 조각에 나뉘어 저장되는 것이 문제이다.)

위에서 든 가변 분할 방식의 예와 비슷하지만 대기자가 나뉘어 자리를 배정 받을 수 있다는 차이가 있다. 가변 분할 방식보다 공간을 효율적으로 관리할 수 있고 조각 모음을 할 필요가 없어 현대 메모리 관리 시스템의 기본 사용으로 하고 있다. 

단점도 있다. 일정하게 나뉜 메모리의 크기보다 작은 프로세스가 배치될 경우 낭비되는 공간이 생기는 것으로 안쪽 공간이 남으므로 내부 단편화가 방생한다. 가변 분할 경우 외부단편화는 조각 모음으로 조정했으나 내부 단편화를 줄이기 위해서는 신중한 메모리 크기 결정이 중요하다. 

 

 

3. 버디 시스템: 가변분할의 단점인 외부 단편화를 완화하는 방법으로 버디 시스템이 있다. 가변 분할 방식이지만 고정 분할 방식과 유사한 점이 있다.

 

가변과 고정 분할 방식의 중간 구조로 프로세스의 크기에 맞게 메모리를 반으로 자르고 프로세스를 메모리에 배치하면 나뉜 메모리의 각 구역에는 프로세스가 1개만 들어가고 프로세스가 종료되면 주변 빈 조각과 합쳐서 하나의 큰 덩어리를 만든다.

 

가변분할 방식보다 효과적으로 공간 관리할 수 있는 이유는 비슷한 크기의 덩어리가 서로 모여 있어 통합하기가 쉽기 때문이다. 효율적인 공간 관리 측면에서 보면 고정분할 방식과 버디 시스템은 비슷한 수준이다. 그러나 버디 시스템이 메모리 관리 측면에서 똑같은 크기로 모든 공간에 배분되는 고정 분할 방식이 더 단순하여 더 많이 사용되고 있긴하다.

'운영체제' 카테고리의 다른 글

9.가상 메모리 관리  (0) 2020.12.02
8.가상 메모리 기초  (0) 2020.12.02
10.저장장치 관리  (0) 2020.11.14
3.프로세스와 스레드  (0) 2020.09.23
4.CPU스케줄링  (0) 2020.09.23