🖥️ CPU와 메모리 심화
1. CPU 심화 🧠
1-1. 레지스터 (Register) 🗃️
레지스터는 CPU 내부에 있는 고속 메모리로, 데이터를 저장하고 빠르게 접근할 수 있습니다. CPU가 명령어를 실행하는 데 필수적인 역할을 합니다.
레지스터의 종류
- 범용 레지스터 (General Purpose Register): 연산에 필요한 데이터와 연산 결과를 임시로 저장하는 역할을 합니다.
- 특수 목적 레지스터 (Special Purpose Register): 특정 작업을 위해 설계된 레지스터로, 프로그램 카운터(PC), 명령어 레지스터(IR), 메모리 주소 레지스터(MAR) 등이 있습니다.
주요 레지스터 🔑
- 프로그램 카운터 (PC): 다음에 실행할 명령어의 주소를 저장합니다.
- 명령어 레지스터 (IR): 현재 실행 중인 명령어를 저장합니다.
- 메모리 주소 레지스터 (MAR): 읽거나 쓸 데이터의 메모리 주소를 저장합니다.
- 누산기 (AC, Accumulator): 연산 결과를 임시로 저장합니다.
1-2. 제어 장치 (Control Unit) 🎮
제어 장치 (CU)는 CPU의 명령어 실행을 제어하는 중요한 부분입니다. 명령어를 해독하여 올바른 순서로 처리하고, 다른 구성 요소들이 협력할 수 있도록 조정합니다.
제어 장치의 역할 🛠️
- 명령어의 순차적인 실행을 제어합니다.
- CPU 내부 및 메모리와의 데이터 전송을 관리합니다.
- CPU 내부에서 명령어를 해독하고, 실행할 준비를 합니다.
제어부와 내부버스 🔗
- 제어부: 주 기억 장치에 저장된 명령어를 해독하고, 그에 따라 CPU의 각 장치를 제어합니다.
- 내부버스: CPU 내부의 장치들(연산 장치, 메모리 등) 사이에서 데이터를 전송합니다.
1-3. 연산 장치 (Arithmetic Logic Unit, ALU) ➕➖
연산 장치 (ALU)는 CPU에서 산술 연산(덧셈, 뺄셈)과 논리 연산(AND, OR, NOT 등)을 처리하는 부분입니다.
ALU의 역할 ⚙️
- 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 같은 연산을 수행합니다.
- 논리 연산: AND, OR, NOT 등의 논리적 연산을 수행합니다.
- 비교 연산: 두 값을 비교하여 크기나 값을 판단합니다.
ALU는 CPU의 핵심 구성 요소 중 하나로, 모든 계산 작업을 처리하는 중심적인 역할을 합니다.
2. CPU 스케쥴링 심화 🗓️
2-1. 스케쥴링의 개요 📅
스케쥴링 (Scheduling)은 여러 프로세스가 CPU 자원을 효율적으로 사용하도록 분배하는 작업입니다. 스케쥴링을 통해 CPU의 성능을 극대화하고 각 프로세스가 적절한 자원을 배정받습니다.
스케쥴링의 목적 🎯
- CPU 자원의 효율적 사용: CPU 자원의 낭비를 줄입니다.
- 응답 시간 최소화: 사용자 명령에 대한 응답 시간을 최소화합니다.
- 공평성: 모든 프로세스가 공평하게 자원을 사용할 수 있도록 보장합니다.
2-2. 스케쥴링 종류 ⚖️
CPU 스케쥴링은 선점형과 비선점형으로 나뉩니다.
선점형 스케쥴링 (Preemptive Scheduling) ⏳
- 선점형: OS가 CPU의 사용권을 강제로 회수하여 다른 프로세스에게 분배합니다. 긴급한 프로세스나 빠른 응답이 필요한 시스템에 적합합니다.
비선점형 스케쥴링 (Non-Preemptive Scheduling) 🚶♂️
- 비선점형: 프로세스가 끝나거나 I/O 작업을 요청할 때까지 CPU 사용을 보장합니다. 순차적으로 처리되며, 공정하지만 대기 시간이 길어질 수 있습니다.
2-3. 스케쥴링 알고리즘 🧮
1. FCFS (First Come First Serve) 🏁
- 특징: 먼저 도착한 프로세스가 먼저 CPU를 할당받습니다.
- 단점: 긴 작업이 먼저 실행되면 짧은 작업들이 대기하는 Convoy Effect가 발생할 수 있습니다.
2. SJF (Shortest Job First) ⏩
- 특징: 처리 시간이 짧은 작업을 먼저 처리합니다.
- 장점: 대기 시간이 짧아집니다.
- 선점형과 비선점형: 선점형은 더 짧은 작업이 들어오면 현재 작업을 중단하고 처리합니다.
3. 우선순위 스케쥴링 (Priority Scheduling) 🔝
- 특징: 프로세스마다 우선순위를 부여해 우선순위가 높은 프로세스를 먼저 처리합니다.
- 문제점: 우선순위가 낮은 프로세스는 기아 현상 (Starvation)이 발생할 수 있습니다.
- 해결 방법: Aging으로 오래 대기한 프로세스의 우선순위를 높입니다.
4. 라운드 로빈 (Round Robin) 🔄
- 특징: 모든 프로세스가 일정 시간 동안 CPU를 할당받고, 할당 시간이 끝나면 다시 준비 큐로 돌아가 재할당을 기다립니다.
- 장점: 공평한 자원 분배, 짧은 작업들의 응답 시간 보장
- 단점: Time Quantum이 너무 작으면 문맥 교환으로 인한 오버헤드가 발생하고, 너무 크면 FCFS처럼 동작합니다.
5. HRN (Highest Response-ratio Next) 📊
- 특징: 대기 시간과 실행 시간을 고려해 우선순위를 계산합니다.
우선순위 = (대기 시간 + 실행 시간) / 실행 시간
- 장점: 기아 현상을 방지하고 처리 시간을 효율적으로 관리합니다.
3. 메모리 심화 💾
3-1. 캐시 메모리의 작동 원리 🚀
캐시 메모리는 CPU와 메모리 간의 속도 차이를 줄이는 데 사용되는 임시 저장소입니다. 자주 사용되는 데이터를 캐시 메모리에 저장하여 CPU가 빠르게 접근할 수 있도록 합니다.
캐시의 원리: 지역성 (Locality) 🌍
- 시간 지역성 (Temporal Locality): 최근에 사용된 데이터는 다시 사용될 가능성이 높습니다.
- 공간 지역성 (Spatial Locality): 최근 접근한 데이터 근처의 데이터도 자주 사용됩니다.
캐시 히트와 캐시 미스 🎯
- 캐시 히트: CPU가 캐시에서 데이터를 찾는 경우로, 처리 속도가 빠릅니다.
- 캐시 미스: 캐시에 없는 데이터를 메모리에서 가져오는 경우로, 더 많은 시간이 소요됩니다.
3-2. 메모리 할당 📦
1. 연속 할당 (Contiguous Allocation) 🔗
- 고정 분할 방식: 메모리를 고정된 크기로 나눠 프로그램에 할당. 프로그램이 작을 경우 내부 단편화가 발생할 수 있습니다.
- 가변 분할 방식: 프로그램 크기에 따라 동적으로 메모리를 할당. 그러나 외부 단편화가 발생할 수 있습니다.
2. 불연속 할당 (Non-Contiguous Allocation) ✂️
- 페이징 (Paging): 메모리를 동일한 크기의 페이지로 나누어 프로그램에 할당합니다.
- 세그멘테이션 (Segmentation): 메모리를 논리적인 단위(세그먼트)로 나누어 관리합니다.
3-3. 페이지 교체 알고리즘 🔄
1. FIFO (First In First Out) 🛫
- 특징: 가장 먼저 들어온 페이지를 먼저 교체합니다.
- 단점: 중요한 페이지가 오래된 페이지라면 불필요하게 교체될 수 있습니다.
2. LRU (Least Recently Used) 🧮
**: 가장 오랫동안 사용되지 않은 페이지를 교체합니다.
- 장점: 캐시 히트율을 높일 수 있지만, 추가적인 메모리와 연산 비용이 듭니다.
3. NUR (Not Used Recently) - Clock 알고리즘 ⏰
- 특징: 최근 사용 여부를 기준으로 교체하는 방식입니다. 각 페이지에는 사용 여부를 기록하는 비트가 할당됩니다.
- 장점: 간단한 구현과 저렴한 비용으로 효율적입니다.
4. LFU (Least Frequently Used) 📉
- 특징: 참조 횟수가 적은 페이지를 교체합니다. 자주 사용되지 않은 페이지를 제거하여 캐시 히트율을 높입니다.
5. 오프라인 알고리즘 (Optimal Page Replacement) 🔮
- 특징: 가장 먼 미래에 사용할 페이지를 교체하는 방식입니다. 이론적으로 최적이지만, 미래의 페이지 접근을 알 수 없기 때문에 현실적으로 사용되지 않습니다.
4. 메모리 관리 기법 🧠
4-1. 페이징 기법 (Paging) 📄
페이징 기법은 메모리를 일정한 크기의 페이지로 나누어 관리하는 방식입니다. 논리적 주소 공간을 페이지로 나누고 물리적 메모리에 할당합니다.
페이징의 장점 ✅
- 내부 단편화 해결: 페이지 크기가 일정해 내부 단편화 문제가 줄어듭니다.
- 효율적 메모리 사용: 페이지 단위로 메모리를 효율적으로 사용할 수 있습니다.
페이징의 단점 ❌
- 주소 변환 비용: 논리적 주소를 물리적 주소로 변환하는 과정에서 추가적인 시간과 비용이 발생합니다.
4-2. 세그멘테이션 기법 (Segmentation) 📚
세그멘테이션 기법은 메모리를 논리적인 단위(세그먼트)로 나누어 관리하는 방식입니다.
세그멘테이션의 장점 👍
- 보안과 공유: 세그먼트 단위로 관리하여 보안과 공유가 가능합니다.
- 프로그램 구조 반영: 프로그램 구조에 맞게 메모리를 나눌 수 있습니다.
세그멘테이션의 단점 👎
- 외부 단편화: 가변적인 세그먼트 크기 때문에 외부 단편화가 발생할 수 있습니다.
4-3. 페이지드 세그멘테이션 (Paged Segmentation) 🧩
페이지드 세그멘테이션은 페이징과 세그멘테이션 기법을 결합한 방식으로, 세그먼트를 다시 페이지 단위로 나누어 관리합니다.
5. 메모리 관리 정책 ⚙️
5-1. 가상 메모리 (Virtual Memory) 🌐
가상 메모리는 물리적 메모리를 초과하는 데이터를 보조 기억장치에 저장하여 처리하는 기법입니다.
가상 메모리의 장점 ✅
- 효율적 메모리 사용: 물리적 메모리가 부족해도 더 많은 데이터를 처리할 수 있습니다.
가상 메모리의 단점 ❌
- 페이지 부재 (Page Fault): 필요한 데이터가 물리적 메모리에 없을 때 성능 저하가 발생할 수 있습니다.
5-2. 스와핑 (Swapping) 🔄
스와핑은 물리적 메모리가 부족할 때, 프로세스를 보조 기억장치로 내보내 메모리를 확보하는 기법입니다.
스와핑의 장점 ✅
- 메모리 확보: 물리적 메모리 부족 시 프로세스를 스왑하여 공간을 확보합니다.
스와핑의 단점 ❌
- 오버헤드 발생: 프로세스를 내보내고 불러오는 과정에서 성능 저하가 발생할 수 있습니다.