CS

CPU , 메모리

Game Client Lee Hwanguk 2023. 6. 28. 01:30

# 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);
        }
    }
}

  

  - 페이징 기법 : 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당. 홀의 크기가 균일하지                            않은 문제는 없어지나 주소 변환이 복잡해짐.

  - 세그멘테이션 : 페이지 단위가 아닌 "의미단위" 인 "세그먼트"로 나누는 방식. 공유와 보안 측면에서 좋고 홀 크기가 균                             일  하지 않은 문제가 발생.

  - 페이지드 세그멘테이션 : 공유나 보안을 의미 단위인 "세그먼트"로 나누고 물리적인 메모리는 페이지로 나누는것.