CPU , 메모리
# CPU
- 프로그램의 명령어를 해석하고 실행하는 역할 수행.
- 프로그램의 명령어를 해석하고 실행하는 역할 수행.
- 제어 유닛(Control Unit) : 명령어의 해석과 실행 조정. 프로그램 카운터를 통해 다음에 실행할 명령어의 주소를 추적하고, 명렁어 레지스터에서 명령어를 읽어와 해석. 명령어에 따라 다른 하드웨어 구성 요소를 제어하고 실행 순서 관리
- 산술 논리 장치(ALU) : 레지스터에서 데이터를 가져와 연산 수행. 그 결과를 다시 레지스터에 저장
- 레지스터(Register) : 데이터를 "일시적" 으로 저장하는 역할. 매우 빠른 데이터 접근 가능
- 버스(Bus) : 데이터 버스(데이터의 입출력 담당), 주소 버스(메모리 주소 전송), 제어 버스(제어 신호 전송) 로 구성
#메모리
-메모리 계층
1. 레지스터 : CPU안에 작은 메모리, 휘발성, 속도가 가장 빠름, 용량 작음
2. 캐시 : 휘발성, 속도 빠름, 용량 작음
3. 주기억장치(RAM) : 휘발성, 속도 보통, 용량 보통
4. 보조기억장치(HDD,SSD) : 비휘발성, 속도낮음, 용량이 큼
# 캐시
-> 데이터를 미리 복사해 놓는 임시 저장소이자, 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말함. 메모리와 CPU사이의 속도 차이가 너무 크기 때문에 그 중간에 레지스터 계층을 둬서 속도 차이를 해결.
계층과 계층 사이에 있는 계층을 캐시계층이라함. (ex 캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱계층이라고 할 수 있음)
- 지역성의 원리
1. 시간지역성 : 최근 사용한 데이터에 다시 접근하려는 특성. (ex for 문에서 변수 i 에 접근하는)
2. 공간지역성 : 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성.
- 메모리 할당
1. 연속 할당 : 메모리에 "연속적" 으로 공간을 할당
- 고정 분할 방식 : 메모리를 "미리" 나누어 관리하는 방식. 미리 나누어져 있기 때문에 융퉁성은 없고 내부 단편화(메모리 를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상)가 발생
- 가변 분할 방식 : 매 시점 프로그램의 크기에 맞춰 "동적" 으로 메모리를 나눠 사용. 외부단편화(메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상)가 발생.
*최초적합 : 위나 아래쪽부터 시작해서 홀(비어있는 메모리 공간) 을 찾으면 바로 할당.
*최적적합 : 프로세스의 크기 이상인 공간 중 가작 작은 홀부터 할당.
*최악적합 : 프로세스의 크기와 가장 많이 차이가 나는 홀에 할당.
2. 불연속 할당 : 메모리를 연속적으로 할당하지 않음. 불연속 할당은 동적으로 메모리를 할당하는 경우 주로 사용. 힙영역에서 할당 되고 메모리 공간은 포인터를 통해 접근. 동적으로 메모리를 할당하고 해제할 수 있다는 장점이 있음. 하지만 연속 할당에 비해 추가적인 오버헤드가 발생할 수 있음. C#에서는 가비지컬렉션(더 이상 사용되지 않는 메모리를 자동으로 해제하여 메모리 누수 방지) 메커니즘을 통해 메모리 누수 문제 방지.
만약 직접 메모리 할당이 필요하다면?System.Memory<T> 나 System.Span<T> 구조체를 사용하여 메모리를 관리.(스택이나 힙 메모리를 효율적으로 사용할 수 있도록 도와줌)
ex)
using System;
public class MemoryExample
{
public static void Main()
{
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
//Memory<T>를 사용하여 메모리에 접근
Memory<int> memory = new Memory<int>(numbers);
//Span<T>을 사용하여 메모리 조작
Span<int> span = memory.Span;
Console.WriteLine("Original array:");
foreach (int num in span)
{
Console.WriteLine(num);
}
//메모리 수정
span[2] = 99;
//수정된 메모리 값 출력
Console.WriteLine("Modified array:");
foreach (int num in span)
{
Console.WriteLine(num);
}
}
}
- 페이징 기법 : 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당. 홀의 크기가 균일하지 않은 문제는 없어지나 주소 변환이 복잡해짐.
- 세그멘테이션 : 페이지 단위가 아닌 "의미단위" 인 "세그먼트"로 나누는 방식. 공유와 보안 측면에서 좋고 홀 크기가 균 일 하지 않은 문제가 발생.
- 페이지드 세그멘테이션 : 공유나 보안을 의미 단위인 "세그먼트"로 나누고 물리적인 메모리는 페이지로 나누는것.