컴퓨터에서 메모리는 CPU 만큼 중요하다.
하드디스크에 파일들이 들어있다. 파워를키면 OS가 메인메모리에 올라가고 특정 프로그램을 실행시키면 그 프로그램이 메인메모리로 올라간다. 이 메모리를 어떻게 잘 관리할것인가가 메모리 매니지먼트
실행파일을 메모리에 올리기
src-obj-exe
메모리 몇 번지에?
다중 프로그래밍 환경에서는?
항상 똑같은 곳에 올리는것을 보장하지 못함. 그래서 MMU를 활용. CPU가 메모리에 몇번째 주소를 읽겠다 하면 메모리는 CPU로 데이터를 전송해준다. MMU는 특정프로그램이 다른 프로그램으로 접근하지 못하게 해준다. CPU가 메모리에 주소를 전달할 때 MMU를 거치는데 자기영역에 맞는 주소를요청하는지 파악한다.(base, limit 레지스터 활용)
MMU는 이뿐만 아니라 Relocation register을 둔다. 가령 A라는 프로그램이 있다고 하자. 개발자는 해당 프로그램이 0번지부터 시작한다고 생각하고 코딩을 했다. 하지만 이는 보장되지 않기 때문에 예측할 수 없다. 실제로는 프로그램이 1000번지에 로드되면 MMU 안에 Relocation register에 1000을 넣는다. 그러면 CPU는 0번지를 요청하지만 MMU를 거치면서 1000이 더해져 실제로 저장되어 있는 1000번지로 접근하게 된다. 즉 CPU를 속이게 된다.
그 다음날 A라는 프로그램이 실행되었을 때 5000번지에 실행될 경우 이때는 Relocation register에 5000이 들어가고 CPU는 5000번지에 접근하여 데이터를 읽어올 수 있다.
여기서 CPU가 보내는 주소를 논리주소(logical address) 라 하고 실제로 메인메모리로 들어가는 주소를 물리주소 (physical address)라 한다.
메모리 낭비 방지
운영체제는 컴퓨터 사용을 쉽게, 효율을 높게 하는것이 목표다.
이를 위해 어떤노력을 하는지 알아보자,
1.Dynamic Loading
2.Dynamic Linking
3.Swapping
Loading
: 프로그램(실행파일)을 메모리로 올리는것.Booting
: OS를 메모리로 올리는것.
메모리 낭비 방지 기법 : Dynamic Loading
프로그램을 메모리에 올릴때 오류처리 혹은 크게 생성한 배열 같은것들을 안올리고 오류가 일어나면 올린다.
나오게 된 배경
:
모든 루틴(routine)이 다 사용되는 것은 아니다 (예: 오류처리)
모든 데이터(data)가 다 사용되는 것은 아니다 (예: 배열)
자바: 모든 클래스가 다 사용되는 것은 아니다
즉 프로그램 실행에 반드시 필요한 루틴/데이터만 적재
현대의 운영체제는 이를 활용. 이전에는 모든것을 올리는 정적 적재(Static loading)를 활용했다.
메모리 낭비 방지 기법 : Dynamic Linking
프로그램을 메인메모리에 올리는데 공통 라이브러리 루틴(library routine)를 메모리에 중복으로 올
리는 것은 낭비
이메일전송, 파일전송 둘다 네트워크를 사용한다. 즉 둘이 같은 라이브러리를 쓸것이다. 하나로 통 칠수있는경우이다. 이 기법은 오직 하나의 라이브러리 루틴만 메모리에 적재한다. 또한 exe파일을 만들때 link를 하지 않고 프로그램 실행 때 link하여 갖다 쓴게 한다. 그리고 다른 애플리케이션 실행 시 이 루틴과 연결(link)된다.
원래는 link를 exe파일이 만들어지기 전에 한다(정적 연결,Static Linking)
리눅스에서는 공유 라이브러리 (shared library)라 부른다 – Linux
윈도우에서는 동적 연결 라이브러리 (Dynamic Linking Library)라 부른다. - Windows
윈도우에서 .DLL파일을 본적이 있을것이다. 리눅스에는 .SO 파일.
C:\Windows\System32 에 많다.
메모리 낭비 방지 기법 : Swapping
메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스 이미지를 몰아낸다
프로그램을 사용하다 화장실에 갈경우 해당 프로그램은 아무것도 하지 않으면서 메모리를 잡아먹게 된다.
이 경우 해당 프로세스를 쫒아낸다. 즉 프로세스 이미지를 하드디스크 일부에 몰아낸다. 이는 메모리 활용도 높이기 위해 Backing store (= swap device라고도 함) 로 몰아낸다 한다.
Backing store (= swap device라고도 함)의 크기는 대략 메인메모리의 크기 정도면 충분하다.(메인메모리의 내용만 쫒아내는 구역이기 때문에.)
몰아내는것을 Swap-out라 하고 화장실에서 다시 돌아와 메모리로 다시 올리는것을 Swap-in이라고 한다. 서버는 Backing store 를위한 디스크를 따로 두기도 하며 슈퍼컴퓨터의 경우 Backing store를 하나의 메모리로 두기도 한다.(디스크 접근이 느리기 때문에)