floatFirstTOC: right
🖥️ 목표🔍 Single/Batch Programming🔍 Multiprogramming💡 1. Fixed Partitions📌 물리 메모리를 일정한 크기의 파티션으로 분할📌 1-1. Advantages📌 1-2. Problems📌 1-3. Improvement💡 2. Variable Partitions📌 파티션의 크기를 고정하지 않고 요청 때마다 할당📌 2-1. Advantages📌 2-2. Problems📌 2-3. Improvement💡 3. Overlays📌 당장 필요한 코드를 적재, 다음 필요한 코드를 적재📌 3-1. Advantages📌 3-2. Problems💡 4. Swapping (요즘 Swap과는 다름)📌 메모리에서 백업 저장소(HDD)로 임시 스왑📌 4-1. Problems🔍 Virtual Memory📌 메모리 참조를 위해 가상의 주소를 사용함📌 Virtual Address📌 Memory access 순서📌 Advantages
운영체제가 어떻게 잘 메모리를 나눠줄 것이냐에 대한 탐구
🖥️ 목표
- 프로그래밍을 위한 편리한 추상화 제공
- 부족한 메모리 자원을 경쟁 프로세스간 할당 → 최소한의 오버헤드
- 프로세스 간 고립된 환경 제공
🔍 Single/Batch Programming
간단하게, 하나의 프로세스를 위한 것이므로 메모리를 다 쓰면 된다.
🔍 Multiprogramming
- 한 번에 여러 프로세스를 돌려야 함
- 여러 작업의 I/O 및 CPU가 오버랩
- 각 프로세스는 연속적인 공간과 요구하는 메모리 사이즈가 다름
- 요구사항
- 보호 : 각 프로세스가 사용하는 주소 공간을 제한해야 함
- 빠른 변환 : 가상 메모리에서 물리 메모리로의 변환이 빨라야 함
- 빠른 context switch : (보호 및 변환을 위해) 메모리 하드웨어 업데이트가 빨라야 함
💡 1. Fixed Partitions
📌 물리 메모리를 일정한 크기의 파티션으로 분할
- 각 파티션은 고정되어 있고, 같은 크기를 가진다.
- 파티션의 수가 동시에 돌아갈 수 있는 프로세스의 수이다.
- 하드웨어로는
base register
하나만 필요하다. - 물리 메모리 주소 = 가상 메모리 주소 +
base register
context switch
가 일어날 때마다base register
도 바뀜
📌 1-1. Advantages
구현하기 쉽고, 레지스터 하나만 바뀌므로
context switch
가 저비용임!📌 1-2. Problems
- 내부 단편화
파티션 내부가 낭비된다. 아래 사진에서 빨간색 부분만 사용해도 되는데, 크기가 고정되어 있어 남는 공간이 생기게 된다.
- 파티션 사이즈 문제
파티션의 사이즈를 얼마로 지정해야 할 지에 대한 고민이 생긴다.
📌 1-3. Improvement
파티션의 크기가 항상 같을 필요는 없다! 큰 메모리 공간을 쓰는 프로세스는 큰 파티션에, 작은 메모리 공간을 쓰는 프로세스는 작은 파티션에 넣을 수 있다.
이러한 식으로 파티션을 구성한다면,
First fit allocatio
: 제일 처음 비어있는 파티션에 할당
→ 상대적으로 단순하지만, 내부 파편화가 일어날 가능성이 커짐
Best fit allocation
: 프로세스에 적합한 파티션에 할당
→ 메모리를 얼마나 쓸 것인지 미리 알기가 힘들고, 적합한 파티션을 찾아야 하므로 오버헤드가 발생
💡 2. Variable Partitions
📌 파티션의 크기를 고정하지 않고 요청 때마다 할당
- 가용 가능한 사이즈의 파티션으로 나눈다.
- 하드웨어로는
base register
와limit register
가 필요하다. limit register
는 파티션의 크기Offset
이limit register
보다 작으면 통과
이해한 바
base : 1000
limit : 400
메모리 주소 1200에 쓰려고 함 → offset : 200
200 < 400 이므로 yes
- 할당하는 방식
First fit
: 가장 첫 번째 공간에 삽입Best fit
: 가장 작은 공간을 찾아 삽입 (오버헤드 증가)Worst fit
: 가장 큰 공간에 삽입 (내부 단편화 증가)
📌 2-1. Advantages
내부 단편화가 존재하지 않는다. 필요한 만큼 할당하기 때문!
📌 2-2. Problems
- 외부 단편화
파티션의 외부가 낭비된다. 파티션이 계속 생성되고, 해제된 파티션이 생겼을 시 그 공간이 충분하지 않다면 다시 파티션을 할당할 수 없다.
📌 2-3. Improvement
외부 단편화를 해결하는 법
- Compaction : 압축
메모리를 전부 연속적으로 적재되도록 옮긴 후 새로운 파티션 삽입 → 굉장히 오버헤드가 커진다!
- Paging and Segmentation
페이징 기법과 세그멘테이션 기법 활용, 추후 나옴
💡 3. Overlays
프로그램의 전체 코드를 메모리에 적재할 수 없을 때 사용
📌 당장 필요한 코드를 적재, 다음 필요한 코드를 적재
과거에 매우 제한된 메모리 공간을 가졌을 때 사용되었던 기술이다.
메모리에 당장 필요한
instructions
과 data
만을 적재한 후, 코드 실행 중에 다른 기능이 필요할 때 다음 필요한 코드가 적재되는 형식이다.📌 3-1. Advantages
- 실제 메모리 크기보다 프로세스가 요구하는 메모리의 크기가 더 클 때 유용
- 운영체제의 도움이 필요하지 않음
📌 3-2. Problems
프로그래머가 구현해야 하므로 코드가 매우 복잡해진다.
💡 4. Swapping (요즘 Swap과는 다름)
📌 메모리에서 백업 저장소(HDD)로 임시 스왑
연속적인 실행을 위해 다시 메모리로 불러옴
- 저장소의 종류
- 빠른 디스크
- 모든 메모리 이미지의 사본을 수용할 수 있을 만큼 충분히 큰 디스크
- 이러한 메모리 이미지에 반드시 이러한 직접 접속할 수 있어야 함
📌 4-1. Problems
- I/O 장치를 읽고 쓰는 시간이 생김
- 보류 중인 I/O 명령이 있는 프로세스를 스왑하면 안됨
- 현대의 OS들은 향상된 Swapping 기법을 사용 (demand paging)
🔍 Virtual Memory
가상 메모리 주소는 컴파일 시 결정되므로 프로그램을 종료한 후 다시 실행해도 한 변수의 가상 메모리 주소는 같다! → 물론 현대의 OS에서는 해킹 방지 등을 위해 달라질 수 있다.
📌 메모리 참조를 위해 가상의 주소를 사용함
- 크고 연속적이어서 사용하기 편함
runtime
시간에 CPU와 OS가 주소 변환을 수행함
- 물리 메모리가 필요에 따라 동적으로 할당, 또는 해제됨
- 전체 주소 공간이 물리적 메모리에 상주할 필요가 없음!
- 지연 로딩
- 가상 주소는 각 프로세스에게 비공개!
- 각 프로세스에는 격리된 가상 공간이 있고, 다른 프로세스가 볼 수 없음
📌 Virtual Address
- 결국 궁극적으로 멀티프로그래밍을 편하게 하기 위해 가상 메모리를 만듦
- 가상 주소는 참조되는 데이터의 실제 물리적 위치와 무관함
- OS가 물리 메모리 안의 데이터의 위치를 결정함
📌 Memory access 순서
- CPU가 실행하는 명령어는 가상 주소를 생성
- 가상 주소는 OS가 도와주는 하드웨어에 의해 물리적 주소로 변환
- 하나의 프로세스는 하나의 가상 주소 공간을 가지게 됨
📌 Advantages
- 프로그래머에게 크고 연속적인 가상 공간을 보여줄 수 있음!
- 프로그래머가 물리 메모리보다 큰
VAS
를 사용할 수 있음!
→ 메모리에 완전히 들어가지 않는 큰 프로세스를 실행할 수 있음
- 더 많은 프로그램을 동시 실행 가능
- 더 적은 I/O 필요 (페이지 스왑 등)
→ why? 메모리를 통째로 내리거나 올리는 것 보다는 훨씬 저렴함
→ 각 프로그램을 메모리에 로드하거나 스왑하는 데 필요한 I/O 감소
- 프로세스가 파일과 주소 공간을 쉽게 공유 가능 (Page의 Frame을 대응함으로서)
- 프로세스 생성과 보호가 효율적
댓글