본문 바로가기
Lecture/OS

메모리 관리의 개요

by YUNZEE 2023. 11. 7.
728x90

폰 노이만 구조에서 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 올라와야 실행할 수 있다.  모든 프로그램은 하드디스크나 SSD와 같은 보조 저장장치에 보관되어 있다.

 

메모리 이해하기

메모리 구조는 1바이트(B) 크기로 나뉜다. 1B로 나뉜 각 영역은 주소 address로 구분되는데 0번지부터 시작한다. CPU는 메모리에 있는 데이터를 가져오거나 작업 결과를 메모리에 저장하기 위해 주소를 사용한다.

예를 들어 메모리 24번지의 데이터를 CPU로 가져오거나 CPU안에서 생성된 데이터를 메모리의 39번지에 저장한다. 주소는 CPU와 메모리 간 작업의 기준이 된다.

메모리 관리의 이중성

메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 관한 문제다. 이처럼 복잡한 메모리 관리는 메모리 관리 시스템이 담당한다.

일괄 처리 시스템에서는 한 번에 한 가지 작업만 처리했기 때문에 메모리 관리가 어렵지 않았다. 그러나 시분할 시스템에서는 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와 실행되기 때문에 메모리 관리가 복잡하다. 이는 한 도마를 여러 구역으로 나누어 여러 재료를 올려놓고 요리하는 것에 비유할 수 있다. 그런데 여러 재료가 섞이지 않으면서 충분한 작업 공간을 확보하는 것이 간단한 문제는 아니다.

 

메모리 공간 관리는 매우 복잡하다. 프로세스가 작업하는 도중에 할당된 공간이 부족하면 메모리 관리자는 새로운 공간을 확보하기 위해 옆 프로세스를 밀어내거나 더 큰 공간으로 해당 프로세스를 옮겨준다. 빈 공간이 생기면 다음 작업을 위해 합쳐서 하나의 큰 공간을 만든다. 이때 현재 작업 중인 공간을 옆으로 밀고 작은 공간을 합친다. 매번 작업 공간을 키웠다 줄였다 하는 것은 매우 복잡한 일이다.

 

프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어 하는데 이를 메모리 관리의 이중성이라 한다. 메모리 관리의 이중성을 달리 표현하면 프로세스 입장에서 작업의 편리함과 관리자 입장에서 관리의 편리함이 충돌하는 것이다. 운영체제에서 어떻게 작업의 편리함과 관리의 편리함을 타협해 나가는지 살펴볼 것이다.

컴파일러 방식

- 오류 발견

컴파일러 방식의 첫 번째 목적은 소스코드에서 오류를 발견해서 실행 시 문제가 없도록 하는 것이다. 컴파일러는 오류를 착기 위해 심벌 테이블을 사용한다. 심벌 테이블은 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓은 테이블로, 선언하지 않은 변수를 사용하지는 않았는지, 변수에 다른 종류의 데이터를 저장하지는 않았는지 알 수 있다.

 

- 소스코드 최적화

컴파일 방식을 사용하는 두 번째 목적은 최적화다. 마찬가지로 소스코드에서도 군더더기와 사용하지 않는 변수를 삭제하면 더욱 간결해진 실행 속도가 빨라진다.

 

컴파일러의 컴파일 과정

컴파일러가 어떤 과정을 거쳐서 실행 파일을 만드는지 단계별로 살펴보자. 컴파일러는 오류가 있는지 점검하고 최적화를 통해 필요 없는 변수와 코드를 삭제한다. 이렇게 해서 만들어진 기계어 코드가 목적 코드object code로 확장자는 obj다. 

 

컴파일러는 라이브러리 연결(링크) 단계에서 printf() 문에 해당하는 기계어 코드를 <stdio.h> 라이브러리는 입출력 함수를 미리 만들어 놓는 것으로, 사용자가 printf() 함수를 따로 정의하지 않고 소스코드 맨 앞에 #include <studio.h>라고 명시하면 자동으로 라이브러리가 연결된다.

 

윈도우는 동적 라이브러리 파일을 DLL dynamic link loader이라고 한다.

윈도우에서 함수의 변경이 일어나면 DLL파일을 특정 폴더에 삽입하여 새로운 기능을 사용할 수 있다.

메모리 관리 작업

- 메모리 가져오기

실행할 프로세스와 데이터를 메모리로 가져오는 작업이다. 그런데 어떤 상황에서는 데이터의 일부만 가져와 실행하기도 한다. 

- 메모리 배치

가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다. 배치 작업 전에 메모리를 어떤 크기로 자를 것인지가 매우 중요하다. 같은 크기로 자르느냐, 실행되는 프로세스의 크기에 맞게 자르느냐에 따라 메모리 관리의 복잡성이 달라지기 때문이다. 이렇게 나뉜 메모리의 구역에 따라 프로세스와 데이터를 어떤 위치에 놓을지 결정하는 것이 바로 배치 작업이다.

- 메모리 재배치

새로운 프로세스를 가져와야 하는데 메모리가 꽉 찼다면 메모리에 있는 프로세스를 하드디스크로 옮겨놓아야 새로운 프로세스를 메모리에 가져올 수 있다. 이처럼 꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업을 재배치 작업이라고 한다. 

논리 주소와 물리 주소

컴퓨터에는 메모리가 설치되고 각 메모리에는 주소 공간이 있다. 메모리의 주소 공간을 물리 주소 공간 physical address space이라고 하는데 이는 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 그 크기가 다르다. 반대로 사용자 입장에서 바라본 주소 공간을 논리 주소 공간 logical address space이라고 한다.

 

논리 주소를 물리 주소로 변환하는 과정

1. 사용자 프로세스가 논리 주소 40번지에 있는 데이터를 요청한다.

2. CPU는 메모리 관리 유닛에 40번지에 있는 내용을 가져오라고 명령한다.

3. 메모리 관리 유닛은 재배치 레지스터를 사용하여 메모리 400번지에 저장된 데이터를 가져온다.

 

재배치 레지스터는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 자유

 

재배치 레지스터는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 조사 값이 저장된다. 논리주소를 물리 주소로 변환하기 때문에 메모리가 항상 0번지부터 시작하는 연속된 작업 공간으로 보인다.

만약 운영체제 영역이 바뀌어 사용자 영역이 500번지부터 시작된다면 재배치 레지스터에 500을 넣으면 된다

 

퀴즈

1. 메모리의 구조는 몇 바이트 크기로 나뉘나?

2. 1바이트로 나뉜 각 영역을 무엇이라고 부르는가?

3. 나뉜 각 영역은 보통 몇 번지부터 시작하는가?

4. 메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 관한 문제다. 이처럼 복잡한 메모리 관리 하는 것을 무엇이라 하는가?

5. 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어 하는데 이를 무엇이라 하는가?

6. 컴파일러는 오류가 있는지 점검하고 최적화를 통해 필요 없는 변수와 코드를 삭제한다. 이렇게 해서 만들어진 기계어 코드를 무엇이라고 하는가?

7. 윈도우는 동적 라이브러리 파일을 무엇이라고 하는가?

8. 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업을 무엇이라 하는가?

9. 새로운 프로세스를 가져와야 하는데 메모리가 꽉 찼다면 메모리에 있는 프로세스를 하드디스크로 옮겨놓아야 새로운 프로세스를 메모리에 가져올 수 있다. 그걸 무엇이라 하는가?

10.메모리의 주소 공간을 무엇이라 하는가?

11. 사용자의 입장에서 바라본 주소 공간을 무엇이라 하는가?

728x90

'Lecture > OS' 카테고리의 다른 글

가상 메모리  (2) 2023.11.09
단일 프로그래밍 환경의 메모리 할당  (0) 2023.11.08
교착 상태 해결 방법  (0) 2023.11.06
교착 상태의 개요  (2) 2023.10.31
공유 자원과 임계구역  (2) 2023.10.21