일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- aws s3
- ip
- kubeadm
- EC2
- Packet
- java
- Operating System
- Spring
- log
- zookeeper
- grafana
- Python
- Network
- CSV
- docker
- helm
- Kafka
- jvm
- kubectl
- tcp
- PostgreSQL
- Trino
- OS
- airflow
- kubernetes
- CVAT
- Vision
- JavaScript
- AWS
- MAC address
- Today
- Total
JUST WRITE
Main Memory Management 본문
이 글은 KOCW 강좌 중 경성대학교 양희재 교수님의 '운영체제' 강의를 정리한 글입니다.
Main Memory Management
Memory 할당
Memory는 Address와 Data로 구성되어 있다.
CPU는 Address를 가지고 Memory에 요청을 한다.
CPU와 Memory는 쌍방향으로 Data를 주고받는다.
Program을 만들 때 아래의 과정으로 만들어지게 된다.
- Source file -> 고수준언어 또는 어셈블리어로 작성
- Object file -> Source file를 Compile, Assemble 한 결과
- Excutable file -> Object file에 Library(다른 Object file)을 Link 한 결과
Source file은 Compiler에 의해 Compile되서 Object file이 된다.
(어셈블리어로 작성된 Source file은 Assembler에 의해 Assemble 돼서 Object file로 변환)
Object file에서는 다른 Object file의 코드를 사용해야 될 경우도 있다.
Linker를 통해서 Object file과 Library(다른 Object file)를 Link해주면서 Excutable file이 생성된다.
이 Program을 실행하게 되면 Loader에 의해 Memory에 할당되 Process가 생성된다.
Program이 실행되면 code, data, stack 세가지 영역이 존재한다.
MMU
Memory Management Unit
Program이 Load되면 Memory에 배치될 Address는 상황에 따라 항상 다르다.
배치될 수 있는 Address는 항상 다르기 때문이다.
프로그래머가 모든 Memory의 상황에 대비해 코드를 작성할 수 없다.
이러한 문제를 MMU가 처리해 준다.
앞서 MMU는 CPU와 Memory 사이에 위치해 있으면서 Process를 보호해주는 역할을 하였다.
Base, Limit Register가 있어 Process의 Address 범위를 벗어나는 Address를 침범하지 못하게 했다.
추가적으로 Relocation Register가 있어 위 문제를 해결해준다.
예를 들어, 1개 Process가 위치할 Memory Address가 50인데 자리가 없어 100에 있다.
CPU에서는 50 Address를 Memory를 요청한다.
중간에서 MMU Relocation Register가 이를 가로채 요청 Address 정보를 100으로 변경해서 Memory에 보낸다.
상황에 따른 바뀌는 Process의 Memory Address를 MMU를 통해 해결한다.
위 예제에서 CPU가 인식한 Address를 Logical Address라 한다.
실질적으로 Process가 위치한 Address를 Physical Address라 한다.
Memory 낭비 방지
Memory 낭비를 방지하기 위해 Dyanamic Loading, Dyanmic Linking, Swapping 3가지 기법이 있다.
Dynamic Loading
Dynamic Loading은 반드시 필요한 Routine이나 Data만 Memory에 Load 하는 것을 말한다.
오류가 일어났을때만 처리하는 오류처리 부분처럼 항상 모든 Routine이 필요한 것은 아니다.
Data 역시, Array를 필요 이상으로 크게 만들었을 경우 필요 없는 Data가 생긴다.
예전에는 모든 Routine, Data를 Memory에 Load 한 Static Loading을 사용하였다.
지금은 최소한의 것만 Memory에 Load했다가 필요시 해당 부분을 Load 하는 Dynamic Loading을 사용한다.
Dynamic Linking
Process들 중에 공통으로 사용되는 Library Routine이 존재한다.
공통으로 사용되는 부분을 Memory에 중복으로 Load 되는 것은 비효율적이다.
대표적으로 Network 관련 부분이 해당된다.
이러한 문제를 해결하기 위해 Dynamic Linking을 사용한다.
예전에는 실행되기전에 Linker를 통해서 Library와 Link를 하였다.(Static Linking)
Dynamic Linking은 실행 후 Libary와 Link 하는 과정으로 중복으로 Memory에 Load되지 않는다.
이러한 공통 Libary를 shared library(Linux), Dynamic Linking Library(Window)라 한다.
Swapping
Swapping은 장시간 사용하지 않는 Process를 처리하는 방법이다.
장시간 사용하지 않는 Process를 Swap Device(Backing Store)에 Process Image를 옮긴다.(Swap out)
Swap Out했던 Process를 다시 사용하려 하면 다시 Main Memory로 옮긴다.(Swap in)
MMU의 Relocation Register덕분에 Swapping으로 인한 Memory Address 문제를 해결할 수 있다.
Swap Device(Backing Store)는 보통 Hard Disk이다.
대신 Process의 크기가 크면 Swap Device 입/출력에 부담이 될 수 있다.
[참고사이트]
'OS' 카테고리의 다른 글
Segmentation (0) | 2022.01.21 |
---|---|
Paging (0) | 2022.01.20 |
Monitor (0) | 2022.01.16 |
Deadlock (0) | 2022.01.15 |
Process 동기화 (0) | 2022.01.14 |