CPU의 Memory Access (MEM) 단계는 실행 중인 명령어가 메모리와 상호작용하는 단계로, 주로 데이터의 읽기(Load)와 쓰기(Store) 작업이 이루어집니다. 이 단계는 메모리 시스템과의 연결을 통해 데이터를 처리하며, 프로그램의 데이터 흐름에 중요한 역할을 합니다.

Memory Access (MEM) 단계의 주요 기능

  1. 데이터 읽기 (Load)
    • LW(Load Word) 명령어와 같은 메모리 읽기 작업을 처리합니다. 이 과정에서 계산된 주소를 사용하여 메모리에서 데이터를 읽어와 레지스터에 저장합니다.
    • 예를 들어, 특정 레지스터에서 베이스 주소를 가져오고, 오프셋을 더해 최종 메모리 주소를 계산한 후, 해당 주소에서 데이터를 읽습니다.
  2. 데이터 쓰기 (Store)
    • SW(Store Word) 명령어와 같은 메모리 쓰기 작업을 처리합니다. 이 과정에서는 데이터를 메모리에 저장하기 위해 주소를 계산하고, 해당 메모리 주소에 데이터를 기록합니다.
    • 메모리 주소는 일반적으로 레지스터 값에 오프셋을 더하여 결정됩니다.
  3. 메모리 접근 지연
    • 메모리 접근은 CPU와 메모리 간의 대기 시간(latency) 때문에 시간이 걸릴 수 있습니다. 이로 인해, CPU 파이프라인에서의 성능 저하를 방지하기 위해 데이터 포워딩, 캐시 메모리, 버퍼 등의 기술이 활용됩니다.
  4. 메모리 일관성 유지
    • 다중 프로세서 시스템에서는 메모리 일관성을 유지하는 것이 중요합니다. 메모리 접근 단계에서 이와 관련된 프로토콜이나 메커니즘이 필요할 수 있습니다.
  5. 캐시 메모리 활용
    • 메모리 접근 단계에서 캐시 메모리를 활용하여 메모리 접근 속도를 개선할 수 있습니다. CPU는 캐시를 먼저 검사하고, 캐시에서 데이터를 찾지 못한 경우에만 메인 메모리에 접근합니다.

MEM 단계의 흐름

  1. EX 단계에서 계산된 주소가 MEM 단계로 전달됩니다.
  2. 이 주소를 기반으로 메모리에서 데이터 읽기 또는 쓰기가 수행됩니다.
  3. 읽기 작업의 경우, 읽은 데이터는 레지스터에 저장됩니다. 쓰기 작업의 경우, 데이터를 메모리로 전송합니다.
  4. 작업이 완료된 후, 다음 단계인 Write Back (WB) 단계로 결과가 전달됩니다.

관련 설계 고려 사항

  • 데이터 위험 (Data Hazard): MEM 단계에서의 데이터 위험은 주로 Load-Use 위험과 관련이 있습니다. 즉, Load 명령어로 읽어온 데이터가 다음 명령어에서 사용될 경우, 이를 해결하기 위한 포워딩 또는 스톨을 적용해야 합니다.
  • 메모리 대역폭: MEM 단계의 성능은 메모리 대역폭에 의존하므로, 설계 시 메모리 접근 속도를 최적화하는 것이 중요합니다.
  • 동기식 및 비동기식 메모리: 메모리 접근이 동기식인지 비동기식인지에 따라 설계가 달라질 수 있습니다. 비동기식 메모리는 대기 시간이 더 길 수 있지만, CPU의 파이프라인을 보다 원활하게 운영할 수 있습니다.

 

* https://cs.middlesexcc.edu/~schatz/csc264/handouts/mips.datapath.html

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

06. CPU DATA PATH - R-Type (Register Write)  (0) 2024.09.30
05-5. Write Back(WB)  (0) 2024.09.30
05-3. Execute(EX)  (0) 2024.09.30
05-2. Instruction Decode (ID)  (0) 2024.09.30
05-1. Instruction Fetch(IF)  (0) 2024.09.30

CPU의 Execute (EX) 과정은 명령어를 실제로 처리하고 결과를 생성하는 단계입니다. 이 단계는 CPU 파이프라인에서 중요한 역할을 하며, 연산 유닛(ALU), 멀티플라이어(Multiplier), 분기 유닛 등이 동작하는 곳입니다. Execute 단계의 주요 역할은 연산, 논리 연산, 메모리 액세스, 분기 처리 등을 수행하는 것입니다.

Execute (EX) 단계의 주요 기능

  1. ALU 연산 (산술 및 논리 연산)
    • ALU는 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 논리 연산(AND, OR, XOR 등)을 처리합니다. 명령어가 연산 명령일 경우, 이 연산은 EX 단계에서 수행됩니다.
  2. 주소 계산
    • 메모리 액세스 명령어(LW, SW 등)에서 주소 계산을 수행합니다. 예를 들어, LW 명령어에서는 베이스 레지스터에 오프셋을 더해 실제 메모리 주소를 결정합니다.
  3. 분기 처리
    • 조건부 및 무조건 분기 명령어가 EX 단계에서 처리됩니다. 이 과정에서 분기가 일어나는지를 판단하고, 분기가 발생할 경우 다음에 실행할 명령어의 주소를 계산합니다.
  4. 포워딩 (Data Forwarding)
    • 이전 명령어에서 계산된 값을 이후 명령어가 필요로 할 때, **데이터 위험(Data Hazard)**을 해결하기 위해 포워딩을 사용합니다. 포워딩은 EX 단계에서 필요로 하는 데이터를 바로 전달하여, 명령어 파이프라인에서 대기 상태가 발생하는 것을 최소화합니다.
  5. 연산 결과 생성
    • EX 단계에서 발생한 연산 결과는 다음 단계인 메모리 액세스(Memory) 단계나 레지스터에 쓰기(WB) 단계로 전달됩니다.

EX 단계의 흐름

  1. **명령어 디코딩 단계(ID)**에서 받은 입력 신호와 레지스터 값이 ALU나 다른 연산 유닛으로 전달됩니다.
  2. ALU는 해당 연산을 처리하고, 결과를 계산합니다.
  3. 연산 결과는 다음 단계인 메모리 액세스 단계나 최종적으로 레지스터에 쓰이게 됩니다.
  4. 포워딩과 데이터 위험 해결이 필요할 경우, EX 단계에서 적절한 조정이 이루어집니다.

관련 설계 고려 사항

  • 파이프라인 위험(Hazard): EX 단계에서는 데이터 및 제어 위험이 발생할 수 있습니다. 이를 해결하기 위해 포워딩, 스톨(Stalling), 브랜치 예측 등이 적용됩니다.
  • 레지스터 파일 및 ALU와의 상호작용: 연산 유닛과 레지스터 파일 간의 데이터 흐름을 최적화하는 것이 EX 단계의 성능을 결정짓는 중요한 요소입니다.

 

* https://cs.middlesexcc.edu/~schatz/csc264/handouts/mips.datapath.html

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-5. Write Back(WB)  (0) 2024.09.30
05-4. Memory Access(MEM)  (0) 2024.09.30
05-2. Instruction Decode (ID)  (0) 2024.09.30
05-1. Instruction Fetch(IF)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30

1. Instruction Decode (ID) 과정

명령어 디코딩은 CPU에서 실행할 명령어를 해석하는 과정입니다. 이 과정은 CPU의 파이프라인에서 두 번째 단계로, 첫 번째 단계인 **Instruction Fetch (IF)**에서 가져온 명령어를 해석하는 역할을 합니다. 주요 작업은 다음과 같습니다:

  • 명령어 필드 분석: 명령어는 여러 필드로 나뉩니다(예: opcode, source/destination 레지스터 번호, immediate 값 등). 이 필드들을 분석하여 명령어의 종류와 작업을 식별합니다.
    • Opcode: 명령어의 종류(예: 덧셈, 뺄셈, 분기 등)를 결정하는 필드.
    • Source/Destination 레지스터: 연산에 사용될 레지스터의 번호.
    • Immediate 값: 일부 명령어는 즉시 값을 사용합니다.
  • 레지스터 파일에서 값 읽기: 디코딩된 명령어에 따라 레지스터 파일에서 필요한 값을 읽어옵니다. 예를 들어, 덧셈 명령어가 주어지면, 두 소스 레지스터의 값을 읽습니다.
  • 제어 신호 생성: 명령어를 해석한 결과에 따라 제어 신호를 생성하여 다음 단계(Execution, EX)로 전달합니다. 여기에는 ALU 제어 신호, 메모리 액세스 신호 등이 포함됩니다.

2. R-Type 명령어 (Register Type)

R형 명령어는 레지스터 간의 연산을 수행합니다. 이는 레지스터에서 데이터를 읽어 와서 연산한 후, 그 결과를 다시 레지스터에 저장하는 명령어들입니다. 주로 산술 및 논리 연산, 이동 연산이 여기에 포함됩니다.

  • 구조:
    • opcode (6비트) | rs (5비트) | rt (5비트) | rd (5비트) | shamt (5비트) | funct (6비트)
    • opcode: 명령어 코드(일반적으로 000000).
    • rs: 첫 번째 소스 레지스터.
    • rt: 두 번째 소스 레지스터.
    • rd: 결과가 저장될 목적 레지스터.
    • shamt: 쉬프트 연산에 필요한 쉬프트 양.
    • funct: 연산의 종류를 결정하는 기능 필드.
  • 예시:
    • add $t1, $t2, $t3: $t1 = $t2 + $t3
    • sub $t1, $t2, $t3: $t1 = $t2 - $t3

3. J-Type 명령어 (Jump Type)

J형 명령어는 프로그램의 실행 흐름을 특정 주소로 변경하는 분기 명령어입니다. 프로그램 카운터(PC)를 업데이트하여 실행 중인 명령어의 흐름을 제어합니다.

  • 구조:
    • opcode (6비트) | address (26비트)
    • opcode: 명령어 코드.
    • address: 분기할 대상 주소 (26비트로 표현됨).
  • 예시:
    • j target: 프로그램의 실행을 지정된 주소로 점프.
    • jal target: 점프 후 현재 PC 값을 $ra(return address 레지스터)에 저장하여, 나중에 복귀할 수 있도록 함.

4. I-Type 명령어 (Immediate Type)

I형 명령어는 레지스터와 즉시 값(상수)을 함께 사용하여 연산을 수행합니다. 주로 메모리에서 데이터를 로드하거나 저장하는 명령어와 산술 연산에 사용됩니다.

  • 구조:
    • opcode (6비트) | rs (5비트) | rt (5비트) | immediate (16비트)
    • opcode: 명령어 코드.
    • rs: 소스 레지스터.
    • rt: 목적 레지스터 또는 대상 레지스터.
    • immediate: 16비트 즉시 값(상수).
  • 예시:
    • addi $t1, $t2, 10: $t1 = $t2 + 10
    • lw $t1, 4($t2): $t1 = 메모리[$t2 + 4] (메모리에서 데이터를 로드)
    • sw $t1, 4($t2): 메모리[$t2 + 4] = $t1 (메모리에 데이터를 저장)

세 가지 명령어 유형 비교

  • R-Type: 레지스터 간 연산을 수행하며, 명령어가 3개의 레지스터(rs, rt, rd)를 참조합니다.
  • J-Type: 점프 명령어로, 특정 주소로의 분기를 수행합니다.
  • I-Type: 레지스터와 즉시 값을 사용한 연산이나 메모리 접근을 수행합니다.

 

* https://lifelectronics.tistory.com/182

 

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-4. Memory Access(MEM)  (0) 2024.09.30
05-3. Execute(EX)  (0) 2024.09.30
05-1. Instruction Fetch(IF)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30
04. SPR(Special Purpose Register)  (0) 2024.09.29
 

Instruction fetch는 CPU가 프로그램의 명령어를 메모리에서 읽어오는 과정으로, 명령어 사이클의 첫 번째 단계입니다. 이 과정에서 CPU는 명령어를 가져와 실행 준비를 합니다. 주요 단계는 다음과 같습니다:

  1. Program Counter (PC) 확인:
    CPU는 현재 실행할 명령어의 주소를 저장하는 **프로그램 카운터(PC)**를 참조합니다. PC는 다음 명령어의 주소를 가리키고 있습니다.
  2. 명령어 메모리 접근:
    CPU는 메모리에서 PC가 가리키는 주소에 있는 명령어를 읽습니다. 이 메모리는 일반적으로 명령어 캐시나 **메인 메모리(RAM)**가 될 수 있습니다. 명령어 캐시는 메모리보다 접근 속도가 빠르므로, 캐시에 명령어가 있을 경우 CPU는 더 빠르게 명령어를 가져올 수 있습니다.
  3. 명령어 가져오기:
    CPU는 PC가 가리키는 메모리 위치로부터 명령어를 읽어 **명령어 레지스터(IR)**에 저장합니다. 이때, 명령어는 일반적으로 고정된 길이(예: 32비트)의 이진 코드로 구성됩니다.
  4. Program Counter 증가:
    CPU는 다음 명령어를 가리키도록 PC를 증가(Increment) 시킵니다. 대부분의 CPU에서 명령어 길이는 고정되어 있기 때문에 PC는 일정한 크기(예: 4바이트)만큼 증가합니다.
  5. 명령어 디코딩 준비:
    명령어를 가져온 후, CPU는 해당 명령어를 해석하기 위한 디코딩 단계로 넘어가게 됩니다. 디코딩 과정에서는 명령어의 형식을 해석하고, 수행할 연산을 결정합니다.

Instruction Fetch 과정은 CPU의 파이프라인 구조에서도 중요한 역할을 합니다. 파이프라인 CPU에서는 여러 명령어가 동시에 처리되므로, 명령어를 효율적으로 가져오는 것이 중요합니다.
이 과정에서 발생할 수 있는 주요 문제로는 캐시 미스, 파이프라인 버블분기 예측 실패 등이 있습니다. 예를 들어, 분기 예측이 실패하면 잘못된 명령어를 가져오게 되어 성능 저하가 발생할 수 있습니다.

 

 

* https://cs.middlesexcc.edu/~schatz/csc264/handouts/mips.datapath.html

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-3. Execute(EX)  (0) 2024.09.30
05-2. Instruction Decode (ID)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30
04. SPR(Special Purpose Register)  (0) 2024.09.29
03. CPU main components  (1) 2024.09.29
  1. Instruction Fetch (IF):
    • CPU는 프로그램 카운터(PC)에 있는 주소를 참조하여 메모리에서 명령어를 가져옵니다. 이 명령어는 다음 단계에서 해석될 것입니다.
    • 이 단계에서 PC는 다음 명령어를 가리키도록 증가됩니다.
  2. Instruction Decode (ID):
    • 메모리에서 가져온 명령어를 해석합니다.
    • 명령어가 어떤 동작을 수행해야 하는지 파악하고, 필요한 레지스터 값을 레지스터 파일에서 읽어옵니다.
    • 만약 명령어가 브랜치(분기)나 점프 명령어일 경우, 브랜치 조건을 계산하고 다음에 실행할 명령어의 주소를 결정할 수도 있습니다.
  3. Execute (EX):
    • 해석된 명령어에 따라 연산을 수행합니다. 여기서는 ALU(Arithmetic Logic Unit)를 사용하여 산술 연산, 논리 연산, 주소 계산, 분기 조건 평가 등의 작업이 이루어집니다.
    • 또한, 메모리 주소 계산이나 레지스터에 저장될 값을 준비하는 과정도 포함됩니다.
  4. Memory Access (MEM):
    • 명령어가 메모리 액세스를 필요로 하는 경우(예: Load/Store 명령어), 이 단계에서 메모리로부터 데이터를 읽거나 메모리에 데이터를 씁니다.
    • 만약 메모리 액세스가 필요하지 않으면 이 단계는 건너뛰기도 합니다.
  5. Write Back (WB):
    • 연산 결과나 메모리에서 읽어온 데이터를 레지스터 파일에 저장합니다.
    • 이를 통해 프로그램이 다음 명령어를 실행하는 데 필요한 값을 준비합니다.

파이프라인의 이점:

  • 동시성: 각 단계가 동시에 진행될 수 있기 때문에 한 사이클에 여러 명령어를 동시에 처리할 수 있습니다.
  • 성능 향상: 모든 명령어가 동시에 수행되므로, 명령어 처리 속도가 빨라집니다. 이론적으로는 클럭당 한 명령어가 완료될 수 있습니다.

* https://cs.middlesexcc.edu/~schatz/csc264/handouts/mips.datapath.html

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-2. Instruction Decode (ID)  (0) 2024.09.30
05-1. Instruction Fetch(IF)  (0) 2024.09.30
04. SPR(Special Purpose Register)  (0) 2024.09.29
03. CPU main components  (1) 2024.09.29
02. Computer Architecture  (0) 2024.09.29

1. Program Counter (PC, 프로그램 카운터)

  • 역할: 다음에 실행할 명령어의 주소를 저장하는 레지스터입니다. 명령어를 실행할 때마다 자동으로 증가하며, 프로그램의 흐름을 제어합니다.
  • 설명: 점프(Jump)나 함수 호출 시 프로그램 카운터는 해당 명령어의 주소로 업데이트되어 프로그램의 실행 순서를 변경할 수 있습니다.

2. Stack Pointer (SP, 스택 포인터)

  • 역할: 스택의 최상단 주소를 저장하는 레지스터입니다. 함수 호출, 반환 시 데이터를 스택에 저장하거나 복원하는 데 사용됩니다.
  • 설명: 호출된 함수가 종료되면 스택 포인터를 이용해 원래의 호출 상태로 복원합니다. 스택 포인터는 주로 함수 호출 시 지역 변수와 복귀 주소를 관리하는 데 중요합니다.

3. Status Register (또는 Flags Register, 상태 레지스터)

  • 역할: ALU 연산 결과에 대한 상태 정보를 저장합니다. 플래그 비트는 조건부 명령어의 실행을 결정하는 데 중요한 역할을 합니다.
  • 주요 플래그 비트:
    • Zero Flag (Z): 연산 결과가 0일 때 설정됩니다.
    • Carry Flag (C): 연산 결과에서 자리올림(Carry) 또는 자리내림(Borrow)이 발생할 때 설정됩니다.
    • Overflow Flag (V): 부호 있는 수의 연산에서 오버플로가 발생했을 때 설정됩니다.
    • Negative Flag (N): 연산 결과가 음수일 때 설정됩니다.
    • Interrupt Flag (I): 인터럽트 활성화 상태를 나타냅니다.

4. Instruction Register (IR, 명령어 레지스터)

  • 역할: 현재 실행 중인 명령어를 저장하는 레지스터입니다.
  • 설명: 메모리에서 명령어를 가져오면 해당 명령어는 IR에 저장되고, 디코딩 및 실행 단계에서 사용됩니다.

5. Link Register (LR, 링크 레지스터)

  • 역할: 함수 호출 시 반환 주소를 저장하는 레지스터입니다.
  • 설명: 함수 호출 후 리턴할 때 PC가 이 레지스터의 값을 읽어 원래 함수 호출 지점으로 복귀합니다. ARM 프로세서 등에서 사용됩니다.

6. Base Pointer (BP, 베이스 포인터)

  • 역할: 스택 프레임에서 함수 호출 시 기준이 되는 포인터입니다.
  • 설명: 함수의 지역 변수와 매개변수에 접근할 때 베이스 포인터를 기준으로 상대적인 주소를 사용합니다.

7. Frame Pointer (FP, 프레임 포인터)

  • 역할: 함수 호출 시 스택 프레임의 시작 주소를 가리킵니다. 베이스 포인터와 유사한 기능을 하며, 함수의 호출 및 복귀 과정에서 스택의 프레임을 관리합니다.

8. Machine Status Register (MSR, 머신 상태 레지스터)

  • 역할: CPU의 운영 모드와 인터럽트 상태를 저장합니다.
  • 설명: 이 레지스터는 CPU의 운영 모드(예: 사용자 모드, 시스템 모드)를 설정하거나 인터럽트 활성화/비활성화를 제어하는 데 사용됩니다.

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-1. Instruction Fetch(IF)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30
03. CPU main components  (1) 2024.09.29
02. Computer Architecture  (0) 2024.09.29
01. Overall Architecture(Memory Hierarchy)  (0) 2024.09.29

1. Register (레지스터)

레지스터는 CPU 내에서 데이터와 주소를 임시로 저장하는 매우 빠른 메모리입니다. 주로 두 가지 유형으로 나뉩니다:

  • GPR (General Purpose Registers, 범용 레지스터): GPR은 데이터 처리를 위해 CPU가 자유롭게 사용할 수 있는 레지스터입니다. 산술 연산, 논리 연산, 데이터 이동 등 다양한 작업에서 사용됩니다. 대표적으로 32-bit 시스템에서는 32개의 범용 레지스터가 있을 수 있습니다. 이 레지스터들은 특정 기능에 얽매이지 않으며, 데이터나 주소 값을 임시로 저장할 수 있습니다.
  • SPR (Special Purpose Registers, 특수 레지스터): CPU의 제어와 상태 관리에 필요한 레지스터들로, 특정한 기능을 담당합니다. SPR은 보통 상태 레지스터(Status Register), 프로그램 카운터(Program Counter), 스택 포인터(Stack Pointer) 등으로 구성됩니다.
    • 상태 레지스터는 연산 결과에 대한 플래그 비트(Carry, Zero, Negative, Overflow 등)를 저장합니다.
    • **프로그램 카운터(PC)**는 다음에 실행할 명령어의 주소를 저장합니다.
    • **스택 포인터(SP)**는 스택 메모리의 최상단 주소를 가리키며 함수 호출 시 중요한 역할을 합니다.

2. ALU (Arithmetic Logic Unit, 산술 논리 연산 장치)

ALU는 산술 연산(덧셈, 뺄셈 등)과 논리 연산(AND, OR, NOT 등)을 수행하는 장치입니다. ALU는 CPU의 연산 핵심이며, 두 개의 입력을 받아 연산을 수행한 후 결과를 출력합니다. 또한, 플래그 비트(Carry, Zero, Overflow 등)를 통해 연산 결과에 대한 상태 정보를 제공합니다.

3. Control Logic (제어 논리)

제어 논리는 CPU의 모든 작동을 조정하고 동기화하는 역할을 합니다. 명령어 디코딩, 실행 순서 결정, 레지스터와 메모리 접근 제어 등 중요한 작업을 수행합니다. 제어 논리는 명령어 인코딩을 해석하여 ALU, 레지스터, 메모리 등 각 컴포넌트에 어떤 작업을 해야 할지 신호를 전달합니다.

  • FSM(유한 상태 기계, Finite State Machine) 기반으로 동작하는 경우가 많습니다. FSM은 각 상태에서 특정 명령어를 수행하고, 다음 상태로 넘어가는 방식으로 CPU의 전체 동작 흐름을 제어합니다.

4. Instruction Memory (명령어 메모리)

CPU가 실행할 명령어들이 저장된 메모리입니다. 일반적으로 실행할 프로그램의 바이너리 코드가 로드되며, CPU는 프로그램 카운터(PC)를 사용해 명령어 메모리에서 다음에 실행할 명령어를 가져옵니다.

  • ROM(Read-Only Memory) 형태로 구현되는 경우도 있으며, 일부 임베디드 시스템에서는 프로그램이 ROM에 저장된 상태로 실행됩니다.

5. Data Memory (데이터 메모리)

명령어 실행 중에 사용되는 데이터들이 저장되는 메모리입니다. 명령어가 데이터를 읽거나 쓰는 작업을 수행할 때 사용됩니다. 이 메모리는 CPU가 연산 중 필요로 하는 변수를 저장하거나, 연산 결과를 임시로 보관하는 용도로 사용됩니다.

  • RAM (Random Access Memory) 형태로 구현되며, 데이터 메모리 접근은 주로 로드(Load)와 스토어(Store) 명령어에 의해 이루어집니다. 이때 GPR을 사용하여 메모리 주소와 데이터를 주고받습니다.

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-1. Instruction Fetch(IF)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30
04. SPR(Special Purpose Register)  (0) 2024.09.29
02. Computer Architecture  (0) 2024.09.29
01. Overall Architecture(Memory Hierarchy)  (0) 2024.09.29

1. Instruction Memory (명령어 메모리)

  • 역할: CPU가 실행할 명령어를 저장합니다. 즉, 프로그램 코드가 저장된 메모리 공간입니다.
  • 특징: 프로그램이 실행되는 동안 CPU는 명령어 메모리에서 명령어를 가져와 해석하고, 해당 명령어에 맞는 작업을 수행합니다. 이 메모리는 읽기 전용인 경우가 많으며, 특히 Harvard architecture에서는 명령어 메모리와 데이터 메모리가 물리적으로 분리됩니다.
  • 예시:
    • 마이크로컨트롤러의 플래시 메모리(Flash Memory)는 프로그램 코드를 저장하는 용도로 사용됩니다.
    • 일반적인 컴퓨터에서 CPU가 실행하는 프로그램은 메인 메모리(RAM)에 적재된 후 instruction memory로 읽혀 실행됩니다.

2. Data Memory (데이터 메모리)

  • 역할: CPU가 처리할 데이터를 저장합니다. 프로그램이 실행되는 동안 임시로 데이터를 저장하고 읽고 쓰는 작업을 수행하는 메모리입니다.
  • 특징: 데이터 메모리는 주로 읽기와 쓰기 작업이 가능하며, 임시 저장소로 사용됩니다. Stack, heap, global, local 변수 등이 모두 데이터 메모리의 공간을 차지합니다. Von Neumann architecture에서는 명령어와 데이터가 동일한 메모리 공간을 공유합니다.
  • 예시:
    • CPU가 연산할 값을 저장하는 일반적인 RAM이 데이터 메모리 역할을 합니다.
    • 예를 들어, 두 숫자의 합을 계산할 때, 이 숫자들은 데이터 메모리에 저장되고, CPU는 이 값을 읽어서 연산 후 결과를 다시 데이터 메모리에 저장합니다.

폰 노이만 구조의 병목 현상 (Von Neumann Bottleneck)

폰 노이만 구조는 명령어와 데이터를 같은 메모리 공간에서 처리하는 방식입니다. 이 구조에서는 CPU가 명령어를 인출(Fetch)하고 데이터를 읽고 쓰는 작업을 같은 버스를 통해 수행하기 때문에, 명령어와 데이터가 충돌하여 메모리 액세스 병목이 발생할 수 있습니다. 즉, CPU가 명령어를 가져오는 동안 데이터에 접근하지 못하고, 반대로 데이터를 읽거나 쓰는 동안 명령어를 가져올 수 없는 문제가 생깁니다.

이로 인해 메모리 대역폭이 제한되고, CPU 성능을 최대한 활용하지 못하게 됩니다. 특히, CPU 속도가 빨라지면 이 병목 현상은 더욱 두드러지게 나타납니다.

Harvard 구조의 등장

Harvard 구조는 이러한 병목 현상을 해결하기 위해 명령어와 데이터를 별도의 메모리 공간과 버스로 분리하여 처리하는 방식을 채택합니다.

  • Instruction memory: 명령어를 저장하고 CPU가 인출하는 메모리
  • Data memory: 데이터를 저장하고 읽고 쓰는 메모리

이렇게 두 메모리를 분리하면, CPU는 동시에 명령어를 인출하면서 데이터에 접근할 수 있게 되어 병목 현상을 줄일 수 있습니다. 즉, 명령어 처리와 데이터 처리 작업을 병렬로 수행할 수 있는 구조를 제공하므로 더 빠른 성능을 구현할 수 있습니다.

하버드 구조의 장점

  1. 동시 메모리 액세스: 명령어 인출과 데이터 읽기/쓰기가 동시에 이루어지기 때문에, CPU가 더 효율적으로 작동하고 메모리 대역폭이 늘어납니다.
  2. 메모리 성능 최적화: 명령어와 데이터 메모리를 각각의 특성에 맞게 최적화할 수 있습니다. 예를 들어, 명령어 메모리는 읽기 전용으로 빠른 접근 속도를 제공할 수 있고, 데이터 메모리는 읽기와 쓰기 속도를 균형 있게 고려할 수 있습니다.

 

 

* https://m.blog.naver.com/with_msip/221981730449

'CPU ARCHITECTURE1 > CPU' 카테고리의 다른 글

05-1. Instruction Fetch(IF)  (0) 2024.09.30
05. CPU 5-Stage Pipeline  (0) 2024.09.30
04. SPR(Special Purpose Register)  (0) 2024.09.29
03. CPU main components  (1) 2024.09.29
01. Overall Architecture(Memory Hierarchy)  (0) 2024.09.29

+ Recent posts