Mano의 컴퓨터시스템구조

[mano의 컴퓨터시스템 구조] 8장 중앙 처리 장치

studyingalone 2025. 1. 18. 22:07
728x90

8.1 개요

 

  1. 중앙처리 장치(CPU) 구성 요소:
    CPU는 주로 데이터 처리를 담당하며, 세 가지 주요 부분으로 구성된다.
    • 레지스터 세트: 명령 실행 중 사용되는 중간 데이터를 저장
    • 제어 장치(Control Unit): 레지스터 간 정보 전송을 감독하고 ALU가 수행할 작업을 지시.
    • 산술 논리 장치(ALU): 명령 실행에 필요한 미소 연산(microoperation)을 수행
      CPU 주요요소

8.2 범용 레지스터 구조

레지스터 사용 이유

  • 메모리 접근은 시간이 많이 걸리는 작업이므로, 포인터, 카운터, 반환 주소, 임시 결과 등 중간 데이터를 CPU 레지스터에 저장하는 것이 더 효율적

공용 ALU를 가진 레지스터 집합

 

버스 시스템을 통한 레지스터 연결

  • 많은 레지스터를 포함하는 CPU에서는 공통 버스 시스템으로 레지스터를 연결하는 것이 가장 효율적
  • 위 그림의 버스 구성: 7개의 CPU 레지스터를 가진 버스 구조
    • 레지스터의 출력은 두 개의 멀티플렉서(MUX)에 연결되어 A 및 B 버스를 형성
    • 각 멀티플렉서의 선택 라인은 7개 중 1개의 레지스터나 입력 데이터를 고른다.
    • A와 B 버스는 산술 논리 장치(ALU)의 입력으로 사용
    • ALU는 산술 및 논리 연산을 수행하며, 결과는 출력 버스를 통해 레지스터에 전달

 

제어 장치의 역할

  • 제어 장치는 레지스터와 ALU 간 데이터 흐름을 지시하며, 선택 변수(selection variables)를 통해 작업을 조정
  • 예: R1←R2+R3 작업 수행 단계:
    1. MUX A 선택자(SELA): R2를 A 버스로 전달.
    2. MUX B 선택자(SELB): R3를 B 버스로 전달.
    3. ALU 작업 선택자(OPR): A와 B의 덧셈 실행.
    4. 디코더 선택자(SELD): 출력 버스의 결과를 R1에 저장.

제어 워드(위 그림 참고)

 

  • 제어 워드는 CPU 내 14개의 이진 선택 입력 값을 조합한 것으로, 특정 마이크로 연산을 지정합니다.
  • 14비트 제어 워드는 네 개의 필드로 구성됩니다:
    • SELA (3비트): ALU의 A 입력에 사용될 소스 레지스터를 선택.
    • SELB (3비트): ALU의 B 입력에 사용될 소스 레지스터를 선택.
    • SELD (3비트): 출력 데이터를 저장할 목적지 레지스터를 디코더를 통해 선택.
    • OPR (5비트): ALU에서 수행할 연산을 선택.

 


8.3 스택 구조

 

  • 스택은 후입선출(LIFO) 구조를 가지며, 가장 마지막에 저장된 데이터가 먼저 처리
  • CPU에서 스택은 메모리와 주소 레지스터로 구성되며, 스택 포인터(SP)가 스택의 최상단 항목을 가리킨다.

스택 연산

 

 

  • Push: 데이터 삽입
    1. SP를 증가(또는 감소)시켜 다음 위치를 지정.
    2. 데이터 레지스터(DR)에서 스택 최상단으로 데이터 쓰기.
    3. 스택이 가득 찬 경우 FULL 플래그를 1로 설정.
  • Pop: 데이터 제거
    1. 스택 최상단 데이터를 DR로 읽기.
    2. SP를 감소(또는 증가)시켜 다음 항목을 지정.
    3. 스택이 비어 있는 경우 EMTY 플래그를 1로 설정.

 


레지스터 스택

  • 고정된 수의 메모리 단어로 구성된 독립적인 스택.
  • 아래 그림의 64개의 워드로 구성된 스택의 SP는 6비트 이진수로 표현.
  • 스택이 가득 차거나 비어있을 때를 나타내는 FULLEMTY 플래그가 존재.
    • push 연산: SP를 증가시키고 데이터를 저장. SP가 0에 도달하면 FULL 플래그가 설정.
    • pop 연산: SP 위치의 데이터를 읽고 SP를 감소. SP가 0으로 감소하면 EMTY 플래그가 설정.

메모리 스택의 블럭도

 


메모리 스택

  • 메모리의 일부를 스택 용도로 사용하며, SP를 통해 주소를 관리
  • CPU는 프로그램 카운터(PC), 주소 레지스터(AR), 스택 포인터(SP)를 사용해 메모리에 접근
  • 메모리 스택의 SP는 초기 값으로 스택의 하단 주소를 갖고, 푸시 시 감소하거나 팝 시 증가하여 동작(위의 레지스터 스택과 반대로 동작)

 

프로그램, 데이터, 스택 세그먼트를 가진 컴퓨터 메모리

 


역 Polish 표기(후위 표기법)

 

  • 중위 표기법(Infix Notation): 연산자가 피연산자 사이에 위치. 예: A + B
  • 전위 표기법(Prefix Notation): 연산자가 피연산자 앞에 위치. 예: + AB
  • 후위 표기법(Postfix Notation, Reverse Polish Notation): 연산자가 피연산자 뒤에 위치. 예: AB +

 


8.4 명령어 형식

주요 구성 요소

  1. Operation Code (Opcode): 실행할 연산 지정(예: ADD, SUB, MUL 등).
  2. Address Field: 메모리 주소나 레지스터 주소를 지정.
  3. Mode Field: 피연산자나 유효 주소를 계산하는 방식 지정.

 

명령어 형식의 종류 및 CPU 조직

  1. 단일 누산기 조직(Single Accumulator Organization):
    • 명령은 암시적으로 누산기(AC)를 사용.
    • 예: ADD X → AC <- AC + M[X]
    • 한 개의 주소 필드 사용.
  2. 범용 레지스터 조직(General Register Organization):
    • 여러 프로세서 레지스터를 사용.
    • 예: ADD R1, R2, R3 → R1 <- R2 + R3
      • 3개의 주소 필드 사용.
    • 레지스터 수가 많을수록 효율적인 데이터 처리 가능.
  3. 스택 조직(Stack Organization):
    • 연산은 스택의 최상단 두 항목에 대해 수행.
    • 예: PUSH X → 메모리 X의 값을 스택에 푸시.
    • 명령은 주소 필드 없이 연산(예: ADD → 스택 상단 두 값 더하기).

3주소 명령어

 

  • 형식: ADD R1, A, B → R1 <- M[A] + M[B]
  • 예: X = (A + B) * (C + D)
ADD R1, A, B    // R1 = M[A] + M[B]
ADD R2, C, D    // R2 = M[C] + M[D]
MUL X, R1, R2   // M[X] = R1 * R2

 

 

  • 장점: 짧고 간결한 프로그램 작성 가능.
  • 단점: 3주소를 지정하려면 많은 비트가 필요

 

 

2주소 명령어

  • 형식: ADD R1, B → R1 <- R1 + M[B]
MOV R1, A       // R1 = M[A]
ADD R1, B       // R1 = R1 + M[B]
MOV R2, C       // R2 = M[C]
ADD R2, D       // R2 = R2 + M[D]
MUL R1, R2      // R1 = R1 * R2
MOV X, R1       // M[X] = R1
  • 특징: 일반적으로 사용되는 형식.
  • MOV 명령어는 피연산자를 메모리로부터 레지스터로 가져오거나, 레지스터에서 메모리로 전송하는 역할을 한다.

 

1주소 명령어

  • 형식: 누산기(AC)를 사용. ADD B → AC <- AC + M[B]
LOAD A          // AC = M[A]
ADD B           // AC = AC + M[B]
STORE T         // M[T] = AC
LOAD C          // AC = M[C]
ADD D           // AC = AC + M[D]
MUL T           // AC = AC * M[T]
STORE X         // M[X] = AC
  • 특징: AC를 이용한 간단한 계산. 중간 결과 저장을 위해 메모리 필요

 

0주소 명령어

  • 형식: 스택을 사용. 예: ADD → 스택 상단 두 항목 더하기.
PUSH A          // 스택에 M[A] 푸시
PUSH B          // 스택에 M[B] 푸시
ADD             // 스택: (A + B)
PUSH C          // 스택에 M[C] 푸시
PUSH D          // 스택에 M[D] 푸시
ADD             // 스택: (C + D)
MUL             // 스택: (A + B) * (C + D)
POP X           // M[X] = 스택 최상단
  • 특징: Reverse Polish Notation(RPN) 사용.

 

RISC (Reduced Instruction Set Computer) 명령어

  • 특징: 메모리와 CPU 간에는 LOAD와 STORE만 사용. 모든 계산은 레지스터에서 수행.
LOAD R1, A      // R1 = M[A]
LOAD R2, B      // R2 = M[B]
ADD R1, R1, R2  // R1 = R1 + R2
LOAD R3, C      // R3 = M[C]
LOAD R4, D      // R4 = M[D]
ADD R3, R3, R4  // R3 = R3 + R4
MUL R1, R1, R3  // R1 = R1 * R3
STORE X, R1     // M[X] = R1
  • 특징: 연산은 모두 레지스터 간에 수행되어 속도가 빠름.

8.5 어드레싱 모드(주소 지정 방식)

어드레싱 모드 기법 사용 목적

  1. 프로그래밍의 유연성 제공 (포인터, 루프 제어, 데이터 인덱싱 등).
  2. 명령어의 주소 필드 크기 축소.

 

기본 컴퓨터 동작 주기

  1. Fetch (명령어 가져오기): 메모리에서 명령어를 가져옴.
  2. Decode (명령어 해석): 연산, 주소 지정 방식, 오퍼랜드 위치를 해석.
  3. Execute (명령어 실행): 명령어 실행 후 다음 명령어로 이동.

모드 필드를 가진 명령어 형식

 

 

주요 주소 지정 방식

 

1. Implied Mode (암시적 모드)

  • 오퍼랜드가 명령어 정의 내에 암시됨.
  • 예: Complement Accumulator 명령은 누산기(AC)가 오퍼랜드로 암시됨.
  • 특징: 레지스터 참조나 스택 컴퓨터의 0주소 명령어에 사용.

 

2. Immediate Mode (즉시 모드)

  • 오퍼랜드가 명령어 내에 직접 포함.
  • 예: 상수를 레지스터에 초기값으로 줄 때 유용

즉시 모드

 

3. Register Mode (레지스터 모드)

  • 오퍼랜드가 CPU의 레지스터에 저장.
  • 특징: 빠른 접근 가능, k비트로 2^k개의 레지스터 지정 가능.
  • 단점: 레지스터 개수가 한정되있음

레지스터 모드

 

4. Register Indirect Mode (레지스터 간접 모드)

  • 레지스터가 메모리 내 오퍼랜드 주소를 포함.
  • 특징: 주소 필드 크기 절약 가능.

레지스터 간접 모드

 

5. Autoincrement/Autodecrement Mode(자동증가/ 자동감소 모드)

  • 레지스터 간접 모드의 변형. 데이터 접근 후 레지스터 자동 증가/감소.
  • 용도: 테이블 데이터 접근 자동화.

 

6. Direct Address Mode (직접 주소 모드)

  • 주소 필드가 오퍼랜드의 실제 메모리 주소를 제공.
  • 특징: 단순하지만 주소 필드 크기가 커질 수 있음.
  • 단점: 주소 공간이 제한적이다.

직접 주소 모드

 

7. Indirect Address Mode (간접 주소 모드)

  • 주소 필드가 오퍼랜드 주소가 저장된 메모리 위치를 제공.
  • 특징: 다단계 메모리 접근 가능.
  • 단점: 두번의 메모리 접근이 필요함

간접 주소 모드

 

8. Relative Address Mode (상대 주소 모드)

  • 명령어 주소 필드와 프로그램 카운터(PC) 값을 더해 유효 주소 계산.
  • 용도: 분기(branch) 명령에서 주변 주소를 참조할 때 유용.

 

9. Indexed Addressing Mode (인덱스 주소 지정 모드)

  • 주소 필드와 인덱스 레지스터 값을 더해 유효 주소 계산.
  • 용도: 배열 내 데이터 접근.

 

10. Base Register Addressing Mode (기준 레지스터 주소 지정 모드)

  • 주소 필드와 기준 레지스터 값을 더해 유효 주소 계산.
  • 용도: 프로그램 재배치 시 유용 (기준 레지스터 값만 변경).

 

주소 지정 방식 비교

어드레싱 모드 주소 계산
Immediate operand AR
Register R1
Register Indirect M[R1]
Autoincrement/Autodecrement R1++/--R1
Direct address AR
Indirect address M[AR]
Relative address M[AR+PC]
Indexed address M[AR+XR]

 


8.7 프로그램 제어

무조건 분기: 항상 지정된 주소로 제어권을 전송합니다.
조건부 분기: 지정된 조건이 충족되는 경우에만 제어를 전송합니다(예: 0 또는 양수인 경우 분기).

 

상태 비트 조건

  • 상태 비트(status bit)는 조건 코드(condition code)나 플래그(flag) 등으로 불린다.
  • 주요 상태 비트
    1. 캐리(C): ALU의 출력 캐리가 1이면 1, 0이면 0이 된다.
    2. 부호(S): ALU의 연산 결과에서 가장 높은 자리의 비트가 1이면 1, 0이면 0이 된다.
    3. 제로(Z): ALU의 연산 결과를 나타내는 워드의 비트가 0이면 1, 그렇지 않으면 0이다.
    4. 오버플로(V): C8, C9 캐리의 exclusive-OR 결과가 1이면 1, 그렇지 않으면 0이다. 부호와된 2의 보수로 표시된 숫자의 계산에서 오버플로가 발생하면 1이 된다.

상태 레지스터 비트

 

서브루틴 Call과 Return

  • 특정 작업을 수행하는 재사용 가능한 코드 블록이다.
  • 메커니즘:
    • 호출: 제어를 서브루틴으로 전환하고 반환 주소를 저장합니다.
    • 반환: 저장된 주소를 PC에 복원합니다.

 

프로그램 인터럽트

  • 정상적인 프로그램의 진행을 벗어나게 하는 여러 가지 문제들을 다룬다.
  • 절차:
    • 인터럽트는 CPU 상태(예: PC 및 PSW)를 저장
    • 이벤트를 처리하기 위해 제어가 서비스 루틴으로 이전
    • 실행 후 CPU 상태가 복구되어 중단된 프로그램을 재개

인터럽트의 형태

  1. 외부 인터럽트: 하드웨어 관련(예: I/O 장치)
  2. 내부 인터럽트: 소프트웨어 또는 시스템 오류(예: 0으로 나누기).
  3. 소프트웨어 인터럽트: 특정 지침을 사용하여 프로그래밍 방식으로 트리거

8.8 간소화된 명령어 집합 컴퓨터

CISC 아키텍처의 특징

  1. 명령어 집합: 100~250개의 명령어로 구성되며, 일부는 특수 작업에 사용.
  2. 주소 지정 모드: 5~20개의 다양한 주소 지정 모드 제공.
  3. 가변 길이 명령어 형식: 명령어 길이가 고정되어 있지 않음.
  4. 메모리 접근: 메모리에 있는 피연산자를 직접 조작 가능.
  5. 목적: 고급 언어의 컴파일을 단순화하고 성능 향상.

CISC는 고급 언어의 각 문장을 하나의 기계어 명령으로 처리하려는 목표로 설계되었다. 하지만 명령어 복잡성 증가로 인해 하드웨어 구현 비용과 처리 속도 문제가 발생할 수 있다.

 

 

RISC 아키텍처의 특징

  1. 명령어 집합: 비교적 적은 수의 명령어 제공.
  2. 주소 지정 모드: 소수의 단순한 주소 지정 모드만 사용.
  3. 메모리 접근: 메모리 접근은 로드 및 저장 명령으로 제한.
  4. 연산 방식: 모든 연산은 CPU 레지스터 내에서 수행.
  5. 고정 길이 명령어 형식: 명령어가 고정된 길이를 가지며 디코딩이 간단.
  6. 단일 사이클 실행: 명령어 하나를 한 클록 사이클 내에 실행.
  7. 하드웨어 제어: 마이크로프로그램 방식이 아닌 하드와이어드 방식 사용.

RISC는 단순한 명령어 세트를 통해 실행 시간을 단축하고 효율적인 파이프라이닝과 레지스터 활용을 가능하게 한다.

 

 

중첩 레지스터 윈도우

  • RISC는 중첩 레지스터 윈도우를 활용해 절차 호출 및 반환 시 레지스터 저장/복원의 필요성을 줄이고 매개변수 전달을 효율화합니다.
  • 각 프로시저는 독립적인 레지스터 집합을 할당받으며, 인접 프로시저 간에는 일부 레지스터를 공유하여 데이터 이동을 최소화합니다.
  • 예: A 프로시저에서 B를 호출할 때, B는 A의 상위 레지스터를 사용해 매개변수를 전달받고 결과를 반환.

중첩된 레지스터 윈도우

  • 위 그림의 끝과 끝은 연결되어 있다.
  • 전역 레지스터 수 =G
  • 각 윈도우에서 지역 레지스터의 수 = L
  • 두 윈도우에 공통인 레지스터의 수 = C
  • 윈도우의 수 = W
  • 윈도우 크기 = L + 2C + G
  • 레지스터 파일 = (L + C)*W + G
  • 위 그림에서 G = 10, L = 10, C = 6, W = 4이다.
    따라서 윈도우 크기는 10 + 12 + 10 = 32, 레지스터 파일은 (10 + 6) * 4 + 10 = 74 

 

 

728x90
반응형