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 입출력에 따른 부담이 크다. 이렇게 되면 느려질 수 있지만 메모리의 활용도가 올라가는 장점이 있다.