메모리의 구조는 1B 크기로 나뉨
CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 메모리 주소 레지스터(MAR)를 사용
메모리는 유일한 작업 공간이며 운영체제를 포함한 모든 프로그램은 메모리에 올라와야 실행이 가능하기 때문에 메모리 관리가 복잡
메모리 관리 이중성 : 프로세스는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 메모리 관리를 효율적으로 하고 싶어 하는 것
소스코드의 번역과 실행
언어 번역 프로그램은 고급 언어(C, 자바 등)으로 작성한 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역하는 프로그램
- 컴파일러 : 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행, C/자바 등
- 인터프리터 : 소스코드를 한 행씩 번역하여 실행, 자바스크립트/베이직 등
컴파일 과정
- 컴파일 : 컴파일러가 소스 코드를 오류 점검, 최적화 등을 수행하여 object 코드(기계어)로 번역됨
- 링크 : object 코드에 라이브러리 코드를 삽입하여 최종 실행 파일을 만듦
- 라이브러리의 내부 구현을 동적 라이브러리에서 가져와 실행하여 라이브러리가 변경돼도 컴파일하지 않고 라이브러리를 공유하여 메모리 절약
메모리 관리자(MMU, Memory Manage Unit)의 역할
프로세스와 데이터를 메모리로 가져오는 작업(fetch)
가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업(placement)
꽉 차 있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업(replacement)
CPU의 비트는 한 번에 다룰 수 있는 데이터의 최대 크기를 의미하여, 내부 부품이 모두 이 비트를 기준으로 제작됨
메모리의 주소를 지정하는 메모리 주소 레지스터(MAR)의 크기가 CPU의 비트와 같으므로 32비트 CPU의 경우 2^32개(4GB), 64비트 CPU의 경우 2^64개(1천 6백만TB)
설치된 메모리의 주소 공간을 물리 주소 공간(절대 주소)이라고 하며, 프로세스마다 부여되는 0번지부터 시작하는 주소 공간은 논리 주소 공간(상대 주소)
CPU와 프로세스가 사용하는 주소 체계는 논리 주소이므로 중복 물리 주소는 없지만 중복 논리 주소는 가능
운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록 메모리 관리자는 분리하여 관리
상위 메모리부터 운영체제 메모리 방향으로 사용자 영역을 할당하는 방법은 운영체제의 크기에 상관없이 사용자 영역의 시작점을 결정할 수 있으나 메모리를 거꾸로 사용하기 위해 주소를 변경하는 것이 복잡하여 잘 쓰이지 않음
경계 레지스터는 운영체제 영역과 사용자 영역 경계 지점의 주소를 가진 레지스터로, 사용자 영역이 운영체제 영역으로 침범하는 것을 막을 때 사용
상대 주소는 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소 지정 방식으로, 운영체제가 업그레이드되거나 운영체제 영역의 주소가 사용자에게 노출될 가능성을 방지
MMU가 상대 주소를 절대 주소로 매우 빠르게 변환하여 메모리에 접근
상대 주소를 절대 주소로 변환하는 과정
- 사용자 프로세스가 상대 주소 40번지에 있는 데이터 요청
- CPU는 메모리 관리자에게 40번지에 있는 내용을 가져오라고 명령
- 메모리 관리자는 재배치 레지스터를 사용하여 상대 주소 40번지를 절대 주소 400번지로 변환하고 메모리 400번지에 저장된 데이터를 가져옴
재배치 레지스터는 메모리에서 사용자 영역의 시작 주소값을 저장
메모리 오버레이
메모리 오버레이는 프로그램의 크기가 메모리보다 클 때 전체 프로그램을 적당한 크기로 잘라서 가져오는 기법
프로그램을 몇 개의 모듈로 나누고 중요한 모듈만 메모리에 적재하고, 나머지는 필요할 때마다 모듈을 메모리에 가져와 사용
어떤 모듈을 가져오거나 내보낼지는 프로그램 카운터가 결정
메모리보다 큰 프로그램의 실행이 가능
프로그램 전체가 아니라 일부만 메모리에 올라와도 실행이 가능
스왑
모듈을 메모리에서 제거할 때 다시 사용할 지도 모르고 작업이 끝나지 않았기 때문에 저장장치의 특별한 공간인 스왑 영역에 저장
메모리에 적재된 프로세스 중 실행되고 있지 않는 프로세스를 스왑 영역으로 보내고 다른 프로세스를 적재하여 실행하는 메모리 관리 방식
스왑 영역에서 메모리로 데이터를 가져오는 작업인 swap in, 메모리에서 스왑 영억으로 데이터를 내보내는 swap out
스왑 영역은 메모리 관리자가 관리
다시 swap in될 때는 swap-out되기 전의 물리 주소와 다를 수 있음
사용자는 메모리의 크기와 스왑 영역의 크기를 합쳐서 전체 메모리로 인식하고 사용할 수 있음
메모리 분할 방식
메모리에 여러 개의 프로세스를 배치하는 방법은 가변 분할 방식과 고정 분할 방식으로 나뉨
- 가변 분할 방식(세그멘테이션 기법) : 프로세스의 크기에 따라 메모리를 나눔
프로세스의 크기에 따라 메모리를 나누므로 메모리의 영역이 각각 다름
한 프로세스가 연속된 공간에 배치되기 때문에 연속 메모리 할당이라고 함
프로세스를 한 덩어리로 처리하여 하나의 프로세스가 연속된 공간에 배치됨
프로세스 작업을 마쳤을 때 빈 공간이 떨어져 있기 때문에 통합하는 작업 등이 필요하므로 메모리 관리가 복잡
외부 단편화(fragmentation) 발생 가능 : 빈 영역이 있어도 서로 떨어져 있으면 연속된 크기의 메모리가 없어 프로세스를 할당하지 못하는 상태
외부 단편화를 해결하기 위해 작은 조각이 발생하지 않도록 프로세스를 배치하거나, 단편화가 발생했을 때 작은 메모리를 합쳐 큰 메모리로 만드는 조각 모음을 하는 방법이 있음
- 최초 배치(first fit) : 단편화를 고려하지 않는 것으로, 프로세스를 메모리에 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법
빈 공간을 찾을 필요가 없음 - 최적 배치(best fit) : 메모리의 빈 공간을 모두 확인한 후 가장 작은 공간에 프로세스를 배치하는 방법
딱 맞는 공간이 있을 때는 단편화가 일어나지 않지만 딱 맞는 공간이 없을 때는 아주 작은 조각을 만드는 단점이 있음 - 최악 배치(worst fit) : 메모리의 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스를 배치하는 방법
빈 공간의 크기가 클 때는 효과적이지만 빈 공간의 크기가 점점 줄어들면 최적 배치처럼 작은 조각을 만드는 단점이 있음 - 조각 모음 : 조각 모음을 하기 위해 프로세스의 동작을 멈추고 프로세스를 이동한 후 프로세스의 상대 주소값을 변경하고 프로세스를 다시 시작
위와 같은 작업을 하기 때문에 많은 시간이 걸리고, 부가적인 작업이 필요하므로 메모리 관리가 복잡 - 버디 시스템 : 외부 단편화를 완화하는 방법
프로세스의 크기에 맞게 메모리를 반으로 자르면서 프로세스를 메모리에 배치
나뉜 메모리의 각 구역에는 프로세스가 1개만 들어감
프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 메모리를 만듦
가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉘며, 고정 분할 방식처럼 내부 단편화가 발생
가변 분할 방식보다 효과적으로 공간을 관리할 수 있는 이유는 비슷한 크기의 메모리가 서로 모여 있어 통합하기가 쉽기 때문
공간 관리 측면에서는 고정 분할 방식과 비슷하지만 공간을 반으로 나누고 통합하는 과정보다 똑같은 크기로 나누는 고정 분할 방식이 더 단순 - 메모리 풀 : 사전에 큰 메모리 블록을 할당하고 이를 필요한 크기로 나누어 사용하는 방법
- 최초 배치(first fit) : 단편화를 고려하지 않는 것으로, 프로세스를 메모리에 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법
- 고정 분할 방식(페이징) : 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것
한 프로세스가 분산되어 배치되기 때문에 비연속 메모리 할당이라고 함
일정한 크기로 나누어 관리하기 때문에 부가적인 작업을 할 필요가 없어 메모리 관리가 수월
일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우 메모리 낭비 발생
프로세스가 메모리의 여러 조각에 저장되는 것이 문제
가변 분할 방식보다 공간을 효율적으로 관리
조각 모음을 할 필요가 없어 관리가 수월하므로 기본으로 사용되고 있음
내부 단편화 발생 가능 : 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상
분할되는 공간의 크기를 조절하여 내부 단편화를 최소화할 수 있음
분할되는 공간의 크기를 줄이면 내부 단편화가 줄어들지만 프로세스가 여러 개로 분할되어 관리하기 어려움
분할되는 공간의 크기를 늘리면 내부 단편화가 늘어나 메모리가 낭비됨
'CS > 쉽게 배우는 운영체제' 카테고리의 다른 글
[쉽게 배우는 운영체제] 9장 가상 메모리 관리 (0) | 2025.04.03 |
---|---|
[쉽게 배우는 운영체제] 8장 가상 메모리의 기초 (0) | 2025.04.02 |
[쉽게 배우는 운영체제] 6장 교착 상태 (0) | 2025.02.27 |
[쉽게 배우는 운영체제] 5장 프로세스 동기화 (0) | 2025.02.24 |
[쉽게 배우는 운영체제] 4장 CPU 스케줄링 (0) | 2025.02.19 |