Memory Management From Stone Age to Present
초기 메모리
OS + 프로그램 하나만이 메모리에 들어가있고, 가상화 개념이 없음
OS 또한 그냥 라이브러리 수준
Multiprogramming and Time Sharing
멀티 프로그래밍 - 여러 프로세스가 실행 준비 상태 (메모리에 올라가 있는 상태) - OS는 프로세스를 전환하면서 실행한다. (I/O요청 시 프로세스 교체 등)
Time Sharing - 짧은 시간 동안만 실행 (타임 퀀텀, time slice) - 실행 중에는 메모리 접근 권한 부여 - 프로세스 상태를 디스크 등에 저장 - 레지스터 값, PC 등 → 문맥 교환(context switch) - 다른 프로세스를 선택해서 실행 - 너무 느리긴 하다.
주소 공간
그냥 주소 공간이라 함은 가상 주소 공간을 뜻한다.
모든 프로그램은 운영체제가 제공하는 가상 주소 공간을 사용한다. 이 가상 주소 공간은 OS의 메모리 가상화를 통해 프로그램이 일련의 연속된 공간이라고 인식하고 사용하는 영역이다. 그들이 실제 물리적으로 사용하는 메모리에서는 역시 연속된 공간을 사용하지는 않는다.
주소 공간은 실행 프로그램의 모든 메모리 상태를 포함한다.
- code(text)
- stack : 함수 호출 체인 상의 현재 위치, 지역 변수, 함수 인자와 반환 값 등 저장
- heap : 동적 할당 메모리
메모리 관리의 목표
투명성 (Transparency)
실행 중인 프로그램이 가상 메모리의 존재를 모르게 (투명)
효율성 (Efficiency) 시간과 공간적으로 효율적
너무 느리지 않아야 하고, 메모리도 최소한으로 사용보호 (Protection) OS 커널 자체를 다른 프로세스로부터 보호
프로세스 간 고립
메모리 관리의 이슈
- Placement 배치
- Protection 보호
- Replacement 재배치
- on-demand loading 요구 시 반입 / 요구반입 (O) ↔ 선반입
프로그램은
파일로 존재할 때는 프로그램이고,
메모리에 올라 CPU를 받으면 프로세스가 되며,
OS는 이를 문맥 단위로 관리한다.
메모리 관리 기법
물리 메모리)
- 단일 사용자 전용 시스템 ex) MS-DOS
- 한 번에 하나의 프로그램만 실행
주어진 메모리보다 더 큰 프로세스는 실행이 불가능하다. -> 중첩 overlay 기법 존재. 프로그래머가 직접 프로그램을 여러 조각으로 나누어 필요한 부분만 메모리에 올리는 방법
메모리에 OS와 프로세스가 있고, protection register가 존재해 Kernel 영역 침범을 막았다.
- 다중 사용자 전용 시스템
고정 분할 다중 프로그래밍
- 메인 메모리를 미리 정해진 크기의 여러 구역(partition) 으로 나눔
왼쪽 은 절대 번역으로, 프로그램이 고정된 물리 주소로 작성되어 실행될 특정 분할이 정해져있음. 이때 task4는 task1이 끝나기 전에는 절대 실행될 수 없다. 다른 분할이 비게 되더라도.
오른 쪽은 재배치 가능한 구조로, 여전히 메모리는 고정 분할되어있고, 프로그램들이 빈 곳으로 들어갈 수 있게 된다.
가변 분할 다중 프로그래밍
이제 메모리를 고정으로 분할하지 않는다. 단, 프로그램을 통째로 메모리에 올리는 지금과 같은 경우에는, task1, task3이 빠진다 해도 그 둘보다 큰 프로그램은 메모리에 빈 공간이 연속되어 있지 않으므로 적재를 못 하는 외부 단편화가 발생한다.
이렇게 공간이 남아있다면 새로운 프로그램이 들어올 때는 어떤 공간에 넣어야 할까?
그 방법들로
- First Fit 앞에서부터 훑다가, 처음으로 들어가는 공간에 바로 배치
- Best Fit 들어갈 수 있는 공간 중 남는 공간이 최소가 되는 곳 선택
- Worst Fit 가장 큰 hole에 배치
- Next Fit 이전에 배치했던 위치 다음부터 탐색 시작
이 있다.
모두 새로 배치하고 남는 공간은 새로운 hole로 인식된다.
- 가상 메모리
프로그램이 바라보는 메모리와 물리적인 메모리를 구분한다.
가상 주소, 물리 주소가 다르다.
가상 메모리가 존재하면 각 프로세스는 자기만의 연속된 큰 공간을 가지고,
실제 물리적인 메모리는 여러 프로세스가 나눠 쓸 수 있다.
이때 물리적인 메모리에서는 한 프로세스의 정보가 연속되지 않고 여기저기 흩어져 있게 된다.
페이지 시스템 : 태스크 로딩
task를 하나의 프로세스라 보면 된다. 실행 단위이다.
이 task를 로딩할 때 디스크에 있는 프로그램 파일을 한 번에 모두 메모리에 올리지 않고 필요한 페이지만 로딩한다.