지금까지의 포스팅들은 OS의 개요와 OS의 Process Management에 대한 내용들을 공부했습니다.
이번 포스팅 부터 OS의 또 다른 기능인 Main Memory Management에 대해서 알아보도록 하겠습니다.
Main Memory Management
- 컴퓨터를 사용하는데 있어서 메모리는 항상 부족하다
- 시간이 흐르면서 메모리의 용량은 많이 증가하였으나, 그만큼 프로그램들의 크기도 함께 증가하였다.
- 그럼 어떻게 메모리를 효과적으로 사용해야 하는가?
- 메모리 낭비 없애기
- 가상 메모리 사용 (Virtual Memory)
메모리 낭비 방지
-
Dynamic Loading
- 동적 적재
- 프로그램 실행에 반드시 필요한 루틴 / 데이터만 적재
- 모든 루틴을 미리 다 적재하는것은 아니다.
- 여기서 말하는 루틴은 코드의 일부분 (함수, 프로시저)를 이야기 한다.
- 예를 들어서 파일을 읽었을 때 예외가 발생했을때 실행되는 루틴에 대해서는 굳이 미리 적재할 필요가 없기 때문에 실행 시 해당 부분이 필요하다면 적재하는 방식을 사용한다.
- 모든 데이터가 다 사용되는 것은 아니다
- 배열의 크기를 int[80000] 이렇게 잡아놔도, 그렇게 많은 크기를 다 적재하지는 않는다.
- 모든 클래스가 다 사용되는 것은 아니다 (Java)
- 정리 : 프로그램 실행에 있어서 필요로 하는 부분에 대해서만 메모리에 올려놓고 사용한다.
-
Dynamic Linking
-
동적 연결
-
A 프로그램과 B 프로그램이 있을 때, 공통으로 사용되는 라이브러리를 둘 다 메모리에 중복으로 올리는 것은 낭비를 발생한다.
-
해결방법!! -> 라이브러리 루틴 연결을 실행 시까지 미루기
- 오직 하나의 라이브러리 루틴만 메모리에 적재시킨 후, 다른 프로그램에서 실행 시 미리 올려둔 루틴과 연결을 시켜서 사용한다.
- 그럼 라이브러리 루틴이 미리 메모리에 없으면?
-
Swapping
- 메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스 이미지를 swap-device로 이동
- 메모리 활용도를 높이기 위해 swap device 사용
- swap-out : swap-device로 보내는것
- swap-in : swap-device에서 가져오기
- Relocation Register 사용으로 메모리 적재 위치는 무관하다
- 프로세스 크기가 크면 swap device 입출력에 따른 비용이 크다.