Memory
메모리는 주소를 통해 접근하는 체계
주소의 종류
1) Logical address
- 논리적인 주소
- 가상 주소(Virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지 부터 시작
- CPU가 바라보는 주소는 logical address
2) Physical address
- 실제 물리적인 메모리 주소
- 메모리에 실제로 올라가는 위치
- 물리적인 메모리는 하나
- 실행되려면 물리 메모리에 올라가 있어야 함
주소 바인딩
- 물리 주소를 결정하는 것
- 물리적인 메모리 어디로 올라갈지
- Symbolic Address: 변수와 같은 프로그래머가 사용하는 형태
Symbolic Address --> Logical address --✔️--> Physical address
주소 바인딩 시점에 따른 방법
1) Compile time binding
- 컴파일 시에 주소 변환
- 메모리의 시작 위치를 변경하고 싶으면 재컴파일 해야 함
- 컴파일러는 절대 코드(absolute code) 생성
- 다른 주소가 비어있어도 컴파일 시 항상 0번부터 정해지기 때문에 비효율적 -> 현재는 거의 사용되지 않음
2) Load time binding
- 실행이 시작될 때 주소 변환
- Loader의 책임하에 물리적 메모리 주소 부여
- 컴파일러가 재배치 가능 코드(relocatable code)를 생성한 경우에 가능
- 비어있는 메모리에 할당
3) Execution time binding
- Run time binding
- 프로그램 시작 후에도 주소 변환이 가능한 경우
- 실행이 시작되면 할당이 되고 이후에도 변환 가능
- CPU가 주소를 참조할 때마다 binding 점검
- 하드웨어적인 지원이 필요 (base and linit registers, MMU 등)
- 현재 컴퓨터 시스템은 이 방식을 사용
MMU
- Mermory-Management Unit
- 메모리 주소변환을 도와주는 하드웨어
- Logical address를 Physical address로 매핑
- relocation register와 limit register를 이용
Relocation register
- base register
- 시작 주소를 알고 있음
Limit register
- 프로그램의 최대 크기를 알고 있음
- 다른 프로그램의 메모리를 보려는 시도를 방지
ex) 3000까지인 프로그램이 4000을 요구
방법
예시) 0~3000인 논리 주소에서 345번째 있는 주소 ---> 14000부터 시작하는 물리 주소 = 14000 + 345
- limit register(최대 메모리)를 벗어났는지 확인
- relocation register 값을 더해서 주소 변환
메모리 관련 4가지 용어
1. Dynamic Loading
- 프로그램을 메모리에 동적으로 올린다
- 프로세스 전체를 메모리에 올리지 않고 해당 루틴이 불려질 때 메모리에 로드
- 메모리 utilization 🆙
- 가끔만 사용되는 코드가 많은 경우 유용 (ex 오류 처리)
- 운영체제의 지원 없이 프로그램 자체에서 구현 가능(OS 라이브러리에서 지원)
- 지금의 프로세스가 올라왔다 쫓겨났다 하는 것은 OS에서 지원하는 페이징으로 다른 것
2. Overlays
- 프로세스 중 실제 필요한 정보만을 메모리에 올림
- 프로세스 크기가 메모리보다 큰 경우에 유용
- 다 올리고 싶어도 올리지 못할 만큼 작은 공간의 메모리를 사용하던 시절에 나온 방법
- 운영체제 지원 없이 사용자에 의해 구현
3. Swapping
- 프로세스 전체를 일시적으로 메모리에서 backing store로 쫓아내는 것
- 현재는 프로세스 전체가 아닌 페이지를 스와핑하는 방식이라 다른 개념
Backing Store
- Swap Area
- 디스크: 많은 프로세스를 담을 만큼 충분히 빠르고 큰 저장 공간
Swap out/Swap in
swap out - 메모리에서 쫓아내기
swap in - 메모리에 다시 넣기
- 중기 스케줄러에 의해 swap out 시킬 프로세스 선정
- CPU 우선순위가 낮은 프로세스를 swap out
컴파일 바인딩
또는 로드 바인딩
시에는 swap in 시 다시 이전에 받은 물리 메모리를 받아야 해서 비효율적
런타임 바인딩
에서는 빈 메모리 영역 아무 곳에나 올릴 수 있음
- swap out의 대부분의 시간은 transfer time
-> swap out되는 데이터 양에 비례
4. Dynamic Linking
Linking
여러 곳에 존재하던 코드를 모아 하나의 실행 파일을 만드는 작업
1) Static Linking
- 라이브러리가 프로그램의 실행 파일 코드에 포함됨
- 실행 파일의 크기가 커짐
- 동일한 라이브러리라도 여러 프로세스에 포함되어 올라갈 수 있어 메모리 낭비
2) Dynamic Linking
- Linking을 실행 시간까지 미루는 기법
- 라이브러리가 실행 시 link됨
- 라이브러리를 실행 파일에 포함하지 않다가 라이브러리를 호출하는 코드가 나오면 라이브러리를 찾아감
- 라이브러리 호출 부분에 루틴 위치를 찾기 위한 stub이라는 작은 코드를 둠
- 라이브러리를 루틴 주소를 찾아가거나 없으면 디스크에서 읽어 메모리에 올림
- 운영체제의 도움이 필요
참고 링크
반효경 교수님 강의