on
운영체제 - 18
KOCW 운영체제 18강
양희재 교수님 강의를 듣고 쓴 글입니다.
Main Memory Management
OS에서 CPU자원은 process management
에서 관리한다. 그리고 주기억장치 관리는 Main Memory Management
에서 관리한다.
[지난 시간 마지막 내용] 프로그램을 메모리에 load하기
-
실행 파일(executable file)을 memory에 올리기
-
메모리 몇 번지에?
→ OS의
loader
가 알아서 고민해준다. -
다중 프로그래밍 환경에서는?
-
-
MMU(Memory Management Unit) 사용
-
Relocation register
예시) CPU입장에서는
test.c
가 0번지에서 시작하는 것으로 인지. 그러나 실제 main memory에서는 500번지에서 시작.MMU가 주소를 다시 결정해준다. 따라서 relocation register값을 바꿔줌으로써 실제로 main memory에 어디에 있는지는 상관없이 똑같이 실행시켜 준다는 것.
-
-
주소 구분
물리주소 vs 논리주소
MMU(Memory Management Unit)
CPU가 address 보낼 때 MMU의 limit, base 사이의 주소가 아니면 CPU로 interrupt 신호가 발생하여 CPU는 현재 하는 일을 중단하고 OS의 interrupt routine으로 점프하게 된다.
이번 포스팅에서 말할 기능은 relocation register
에 관한 것이다.
- 논리 주소 : CPU가 보는 주소
- 물리 주소 : 실제 main memory의 주소
따라서 context switching
이 일어나면 relocation register
의 값만 바꿔주면 우리가 실행하는 프로그램으로 CPU가 접근할 수 있는 것이다.
메모리 낭비 방지
- Dynamic Loading
- Dynamic Linking
- Swapping
Dynamic Loading
load : 만들어진 실행 파일을 main memory에 올리는 것.
프로그램 실행에 반드시 필요한 루틴/데이터만 load. 실행 시 필요하면 그 때 해당 부분을 메모리에 올린다.
- 모든 루틴(함수, procedure)이 다 사용되는 것은 아니다. Ex) 예외처리
- 모든 데이터가 다 사용되는 것은 아니다. Ex) 배열
- Java : 모든 class가 다 사용되는 것은 아니다.
Dynamic Linking
예전에는 메모리가 부족해서 라이브러리 전체를 load하는건 부담이 컸다+항상 사용되는 것도 아니다. → 사용될 때만 load시키는 것으로 해결. 프로그램 실행 시 필요하면 그 때 해당 부분을 메모리에 load하는 것이다.
-
공통 라이브러리 루틴을 메모리에 중복으로 올리는 것은 낭비.
→ 2개의 프로그램이
printf
를 사용한다고 해보자. 2번 load하는 것은 중복! 따라서 낭비이기에 하나만 load한다.원래 실행 파일을 만들기 전에 link한다(
static linking
). 그러나Dynamic linking
은 실행파일이 돼서 load된 다음에 link를 하는 것이다. 결국 하나의 라이브러리만 main memory에 load되게 된다. -
라이브러리 루틴 연결을 실행 시까지 미룬다.
-
오직 하나의 라이브러리 루틴만 메모리에 load되고, 다른 application 실행 시 이 루틴과 link(연결)된다.
→ 메모리를 절약하는 방법
Swapping
메모리에 load되어 있으나 현재 사용되지 않고 있는 프로세스 이미지.
- 메모리의 활용도를 높이기 위해 backing store(==swap device)로 쫓아냄.
swap out
: main memory → swap device로swap in
: swap device → main memory로- relocation register의 사용으로 load위치는 무관.
- 프로세스의 크기가 크면 backing store 입출력에 따른 부담이 크다. 이렇게 되면 느려질 수 있지만 메모리의 활용도가 올라가는 장점이 있다.