메모리 주소 변환
물리적 메모리 관리는 운영체제가 아니라 전부 하드웨어에 의해 이루어진다.
논리적 주소 vs 물리적 주소
물리적 메모리는 2가지 주소를 통해 접근할 수 있다.
논리적 주소(Logical Address)
: 프로세스마다 독립적으로 가지는 논리적 주소를 의미한다.각 프로세스마다 0번지부터 시작
CPU가 보는 주소는 Physical이 아니라 Logical Address이다. → CPU가 논리적 주소에 위치한 데이터에 접근할 때마다 Logical Address를 Physical Address로 변환해야 한다.
물리적 주소(Physical Address)
: 물리적 메모리의 실제 주소를 의미한다.
주소 바인딩
소스코드에서 Symbolic Address로 주소가 표현된다. (변수명, 함수명)
프로그램이 컴파일되면 Symbolic Address가 Logical Address로 변환된다. (변수명, 함수명 → 숫자 주소)
프로그램이 실행되면 Logical Address가 Physical Address로 변환된다. 이를
주소 바인딩
이라고 한다.
주소 바인딩의 3가지 종류
주소 바인딩이 이뤄지는 시점에 따라 3가지로 나뉜다.
Compile Time Binding
: 프로그램 컴파일 시점에 Physical Address가 결정됨컴파일러가
절대 코드(Absolute Code)
를 생성할 경우의 주소 바인딩 방식이다.물리적 메모리 주소의 시작 위치가 변경되면 recompile이 필요함
비효율적 → 현대 컴퓨터 시스템에서 사용하지 않음
Load Time Binding
: 프로그램이 메모리에 올라와 실행될 시점에 Physical Address가 결정됨컴파일러가
재배치 가능한 코드(Relocatable Code)
를 생성할 경우의 주소 바인딩 방식이다.
Run Time Binding(=Execution Time Binding)
: 프로그램이 실행 도중에 Physical Address가 결정됨프로그램 실행 이후에 데이터의 물리적 메모리 위치가 변경될 수 있다.
Address Mapping Table을 통해 주소 바인딩이 이뤄진다.
하드웨어적인 지원이 필요하다. → MMU
MMU(Memory-Management Unit)
Logical Address를 Physical Address로 매핑해주는 하드웨어 디바이스이다.
MMU는 2개의 레지스터를 통해 주소를 변환한다
Base(=Relocation) Register
: 물리적 메모리에서 프로세스의 시작 위치 주소를 담고 있는 레지스터 (접근 가능한 물리적 메모리 주소의 최솟값을 나타냄)Limit Register
: 프로세스의 크기를 담고 있는 레지스터(논리적 주소의 범위를 나타냄)
MMU의 주소 바인딩 과정
CPU가 346(Logical Address) 주소의 데이터를 참조하려 한다.
MMU는 Base Register, Limit Register를 통해 논리적 주소 346을 물리적 주소 14346으로 변환한다.
프로그램이 할당 받은 주소 공간의 크기(Limit Register값)를 벗어난 주소를 참조하려 한다면 → Trap이 발생하여 CPU 제어권이 프로세스에서 운영체제로 넘어간다.
메모리와 관련된 용어
Dynamic Loading(동적 로딩)
Dynamic Loading(동적 로딩)
프로세스 전체를 메모리에 적재하는게 아니라 사용되는 부분만 메모리에 적재하는 기법이다.
Loading
: 프로그램을 메모리에 적재하는 것프로그램에서 자주 사용되지 않는 오류 처리 루틴에 관련된 부분까지 메모리에 적재하는 것은 매우 비효율적이다.
동적 로딩 기법은 OS가 제공하는 라이브러리로 프로그램 자체에서 구현할 수 있다
목적
→ 다중 프로세스 환경에서 메모리에 더 많은 프로세스를 동시에 적재하고 실행하기 위함.
Overlays
Overlays
메모리에 프로세스의 부분 중 실제 필요한 정보만 적재하는 기법이다
프로세스의 크기가 실제 물리적 메모리의 크기보다 클 경우 사용한다.
OS의 지원없이 개발자가 직접 구현한다.
목적
→ 단일 프로세스만 메모리에 올려놓는 환경에서 실제 메모리 용량보다 큰 프로세스를 올리 위해 어쩔수 없는 선택.
Swapping
Swapping
메모리에 적재된 프로세스를 일시적으로 Backing Store에 쫓아내거나 Backing Store에서 메모리로 적재하는 과정이다.
Backing Store(=Swap Area)
: 디스크와 같이 많은 사용자 프로세스 이미지를 담는 공간Swapping 작업은 중기 스케쥴러에 의해 이뤄진다.
Swap In
: backing store에서 메모리로 적재하는 작업Swap Out
: 메모리에서 backing store로 내리는 작업
주소 바인딩 기법에 따라 Swapping 작업이 다르다.
Compile Time Binding, Load Time Binding
→ 프로세스가 Swap out되었다가 Swap in될 때 원래 존재했던 메모리 위치로 reloading되어야 한다Run Time Binding
→ 프로세스를 빈 메모리 영역 아무 곳에 적재해도 된다. (Runtime Binding이 Swapping에 적합)
Swap Time
: Swapping이 일어날 때 걸리는 시간디스크
탐색 시간
,회전 지연 시간
보다전송 시간
이 Swap Time의 대부분을 차지한다.
Linking
Linking
Linker로 소스 코드를 컴파일하여 생성된 object file
과 이미 컴파일된 라이브러리 파일
들을 묶어 하나의 실행 파일
을 생성하는 과정이다.
Static Linking
: 라이브러리가 실행 파일 코드에 포함시켜 실행 파일을 생성하는 과정프로그램의 실행 파일 크기가 커짐 → 저장 공간 낭비
각각의 프로세스마다 동일한 라이브러리가 메모리에 적재됨 → 메모리 낭비
Dynamic Linking
:object file
과라이브러리 파일
사이의 Linking을 프로그램 실행 시간까지 지연하는 기법프로그램의 실행 파일에는 라이브러리 파일이 별도로 존재하고,
stub
이라는 작은 코드를 두어 라이브러리의 위치를 찾는다.라이브러리 코드를 호출하는 시점에 stub으로 디스크속 라이브러리 파일을 찾아 메모리에 loading한다. 라이브러리가 메모리에 이미 load되어있으면 그 주소로 가서 실행한다.
Last updated