오래 못 할 짓 하지 않기
[ 운영체제 ] 21. Main memory 본문
이제는 CPU가 하는 일보다는,
메모리에 관련된 작업은 어떻게 이루어지는지 알아보자.
● 배경 지식
Process = 실행되고 있는 Program
= 이 Program은 Instruction의 집합체 이고,
이들은 Main memory 안에 있다.
- Memory는
▶ 많은 양의 Byte로 된 Array로 이루어져 있고,
이는 각각의 address가 있다.
▶ 따라서 CPU는 Memory에서 PC에 따라 이 Instruction들을 Fetch하여 사용한다.
메모리 보호
: Process가 들어갈 수 있는 크기가 있다.
그걸 정해주는 Register 한 쌍 : Base register / Limit register
Process 하나가 메모리에 들어가는 크기 = Limit
Process 하나가 메모리에 들어가는 주소의 시작점 = Base Register
Address Binding
: 데이터를 저장할 주소를 결정하는 것
주로 [ Symbolic Address → Relocatable Address→Logical Address → Physical Address ]
형태로 올라간다.
Address가 정해지는 것에 관해서는 3가지 단계가 있다.
1. Compiler
: 사용자 및 컴파일러 단계
- 숫자로 된 주소를 바로 사용하지 않고 Symbolic한 주소를 사용한다.
- 만약 새로운 주소로 바꾸고 싶다면, Compile을 다시 한다.
ex) int a ; char b 처럼 만든 변수 같은 것들은 그냥 해당 주소가 Symbolic하게 사용될 뿐
사용자가 직접 그 변수나 함수를 몇 번지에 저장하라고 하지 않는다.
= Symbolic Address 사용
2. Compiler에서 / Load time
: Compiler에서 CPU로 넘겨주는 단계
- Compiler가 Symbolic한 주소에서 Logical한 주소로 바꾼다.
→ 이 또한 실제 메모리 주소가 아닌 Logical한 메모리로 가상 메모리이다.
= Logical Address 사용
→ 각 프로세스마다 독립적으로 가지는 주소 공간.
CPU가 데이터들을 처리하기 위한 주소
Relocatable이랑 다른건가?
3. Memory에 Load되었을 때 [ Memory 단계 ]
= Physical Address 사용
실제로 memory에 들어있는 주소.
참고 (설명 잘 되어 있음)▼
주소는 Symbolic → Logical → Physical 로 변환되고
각 주소가 해당 단계별로 변하는 걸 Address Binding이라고 한다.
언제 Physical memory address가 정해지는지에 따라
Address Binding Time을 나눈다.
1. Compile Time에 Binding
: 프로그램이 컴파일 될 때 주소가 매핑
= 주소가 다 정해져 있다는 것이다.
= 해당 주소의 메모리가 비어 있어야 정상적으로 작동한다.
= Logical Address의 존재 이유가 없다.
2. Load Time Binding
: 메모리에 로딩할 때 바꾸는 방법
3. Execution Time에 Binding
: 실행할 때 메모리 주소를 Relocate 시키는 것
= Binding을 실행 직전까지 Delay시키므로, process가 그 사이에 움직일 수 있다.
주로 이 방법을 사용함
Logical address / Physical address
● Logical Address
: CPU에서 만들어지고, Virtual address라고도 불린다.
● Physical Address
: memory unit에서 보이는 address
- Logical / Physical address는 Compile and load time에서는 같다.
하지만 Execution time에서는 다르다.
● Logical Address Space
: 모든 Logical address의 집합
● Physical Address Space
: Logical address에 대응하는 Physical address의 집합
● MMU - Memory-management unit
: run time에 Virtual address를 Physical address로 Mapping해주는 Hardware
● Dynamic Loading
: 어떤 프로그램이 메모리로 Load되면 그걸 Process라고 한다.
근데 만약 프로그램이 있을 때 [ 파일 전체를 Load해야 하는가? ]
→ X , 모든 루틴을 할 필요없이 필요한 부분만!
ex) 보고할 때 안녕하십니까 공병대대 본중 병장 김민혁입니다 오늘 뭐뭐뭐~~ 가 아니라
> 오늘 뭐뭐뭐 끝 하는 것
● Dynamic Linking
: 유저가 사용하려고 하는 Program과 라이브러리를 연결시켜 주는 것
바로 하지 않고, Execution time시작 전까지 기다렸다가 한다.
ex) #Include <stdlib> 만 추가하면 됨
Contiguous Memory Allocation
연속 메모리 할당
https://min-h-study-review.tistory.com/255
우리는 Process들을 여기저기 뿌려놓는 게 아니라
메모리에 차곡차곡 연속적으로 쌓아둔다.
● Variable Partition 가변 분할
: 각기 다른 크기들의 Process들이 메모리 안에서 정해진 자리에 있는 것이 아니라
유동적으로 Partition을 치고 자리를 사용하는 것
ex) KTX 와 지하철의 차이
하지만, 이 가변 분할을 사용할 시에는 , 중간에 생기는 빈틈인 Hole을 어떻게 관리할지도 정해야한다.
● 가변 분할 메모리 할당 방법
- First Fit
: 가장 잘 맞는 거 찾으면 바로 Hole에 들어간다. - Best Fit
: 가장 잘 맞는 것 중에서 가장 작은 Hole에 들어간다.
▶ 전체 List 탐색 후 , 맞는 것 중에 가장 작은 것으로 - Worst Fit
: 가장 큰 곳에 들어간다.
▶ 전체 List 탐색 후 , 맞는 것 중에 가장 큰 것으로
어떤 것이 가장 좋을까?
▶ First 랑 Best가 속도와 메모리 활용도 측면에서는 Worst보다 낫다.
▶ First 랑 Best 중에서 어느 것이 더 나은지는 알 수 없지만, First가 주로 더 빠르다.
Fragmentation
단편화
: Memory에서 남아있는 메모리의 총량은 충분히 많지만,
모두 흩어져있어서 사용할 수 없는 것.
= 메모리가 많은 양의 Hole로 산산조각 나있어서 사용할 수 없는 상황
ex) 7000원 필요한데 산산조각으로 찢어진 10000원 있는 경우
다음과 같이 프로세스들이 끝나고 나왔을 때
총 메모리에 비어있는 공간은 50MB인데
40MB인 프로세스 F가 들어갈 자리가 없는 상황
해결 방법 )
= Compaction
: Memory에 있는 Process들을 재정렬해서 빈 공간들을 합친다.
: Relocation 이 가능할 때, Execution Time에 가능하다.
● 단점 )
: Expensive
+ 또 다른 해결 방법 : Paging / Segmentation
(참고)▼
한동대학교 고윤민교수님 - 운영체제
https://charles098.tistory.com/103
'3학년 1학기 > 운영체제 (OS)' 카테고리의 다른 글
[ 운영체제 ] 23. Page Table / Swapping (0) | 2024.05.24 |
---|---|
[ 운영체제 ] 22. Page / Frame (0) | 2024.05.21 |
[ 운영체제 ] 20. Deadlock 예방/회피/감지 , Recovery (0) | 2024.05.16 |
[ 운영체제 ] 19. DeadLock (0) | 2024.05.10 |
[ 운영체제 ] 18. Synchronization (0) | 2024.05.10 |