검색
회원가입로그인
AI와 함께 공부하기 : 컴퓨터 구조

MIPS 란?

MIPS 아키텍처: 심층 분석

MIPS(Microprocessor without Interlocked Pipeline Stages)는 1980년대 초 스탠포드 대학교에서 존 헤네시(John Hennessy) 교수가 이끄는 팀에 의해 개발되었으며, 이후 MIPS Technologies에 의해 상용화되었습니다. MIPS는 RISC 철학의 대표적인 예시로, 단순하고 규칙적인 명령어 집합과 효율적인 파이프라이닝을 통해 고성능을 달성하는 데 중점을 둡니다.

1. RISC 철학의 구현

MIPS는 RISC(Reduced Instruction Set Computer)의 핵심 원칙들을 충실히 따릅니다.

  • 축소된 명령어 집합: CISC(Complex Instruction Set Computer)와 달리, MIPS는 소수의 단순하고 고정된 길이의 명령어(32비트)를 사용합니다. 각 명령어는 한 사이클 내에 실행될 수 있도록 설계되어 파이프라인 효율을 극대화합니다.

  • 로드/스토어 아키텍처: 메모리 접근은 오직 load (메모리에서 레지스터로) 및 store (레지스터에서 메모리로) 명령어만을 통해 이루어집니다. ALU 연산은 레지스터 간에만 수행됩니다. 이는 데이터 흐름을 명확하게 하고, 파이프라인에서 메모리 접근 단계를 분리하여 효율성을 높입니다.

  • 대용량 레지스터 파일: 범용 레지스터가 많을수록 메모리 접근 횟수를 줄여 성능을 향상시킬 수 있습니다. MIPS는 32개의 32비트 범용 레지스터($0부터 $31)를 제공하며, $0는 항상 0 값을 가집니다.

  • 하드웨어 제어 장치: CISC의 복잡한 마이크로코드 방식과 달리, MIPS는 대부분의 명령어 제어를 하드웨어 논리로 구현하여 더 빠른 실행 속도를 제공합니다.

  • 컴파일러 친화적: 단순하고 규칙적인 명령어 집합은 컴파일러가 효율적인 기계어 코드를 생성하기 용이하게 합니다.

2. MIPS의 명령어 형식 (Instruction Formats)

MIPS는 주로 세 가지 고정된 길이(32비트)의 명령어 형식을 사용합니다. 이는 명령어 디코딩을 단순화하고 파이프라인 처리를 용이하게 합니다.

  • R-타입 (Register Type): 레지스터 간 연산에 사용됩니다.

    • Opcode (6비트) | Rs (5비트) | Rt (5비트) | Rd (5비트) | Shamt (5비트) | Funct (6비트)

    • Opcode: 명령어의 기본 연산을 나타냅니다.

    • Rs, Rt: 첫 번째/두 번째 소스 레지스터.

    • Rd: 목적지 레지스터.

    • Shamt: 시프트 명령어의 시프트 양.

    • Funct: Opcode가 0일 때, 실제 연산을 지정하는 함수 코드 (예: add, sub, and).

    • 예시: add $rd, $rs, $rt (Rd = Rs + Rt)

  • I-타입 (Immediate Type): 상수(immediate) 값이나 메모리 주소 오프셋을 포함하는 명령어에 사용됩니다.

    • Opcode (6비트) | Rs (5비트) | Rt (5비트) | Immediate (16비트)

    • Immediate: 16비트 부호 확장(sign-extended) 상수 또는 오프셋.

    • 예시: addi $rt, $rs, immediate (Rt = Rs + immediate), lw $rt, offset($rs) (Rt = Memory[Rs + offset])

  • J-타입 (Jump Type): 점프 명령어에 사용됩니다.

    • Opcode (6비트) | Address (26비트)

    • Address: 26비트 점프 대상 주소. 실제 주소는 이 값에 4를 곱하고 PC의 상위 비트와 결합하여 생성됩니다.

    • 예시: j address (PC = address)

이러한 고정된 형식은 명령어 인출(Fetch) 및 디코딩(Decode) 단계를 단순화하여 파이프라인 성능을 향상시키는 데 기여합니다.

3. 파이프라인 (Pipelining)

MIPS는 파이프라인 아키텍처의 교과서적인 예시로, 대부분의 MIPS 구현은 5단계 파이프라인을 사용합니다.

  • IF (Instruction Fetch): 메모리에서 명령어를 가져옵니다.

  • ID (Instruction Decode): 명령어를 디코딩하고 레지스터 값을 읽어옵니다.

  • EX (Execute): ALU 연산을 수행합니다.

  • MEM (Memory Access): 메모리 로드/스토어 연산을 수행합니다.

  • WB (Write Back): 연산 결과를 레지스터 파일에 다시 씁니다.

해저드 (Hazards) 및 해결책:

파이프라인은 명령어들을 동시에 처리하여 처리량을 높이지만, 해저드(hazards)라는 문제에 직면할 수 있습니다.

  • 구조적 해저드 (Structural Hazards): 하드웨어 자원(예: 메모리)이 동시에 두 명령어에 의해 요청될 때 발생합니다. MIPS는 별도의 명령어/데이터 캐시를 사용하여 이 문제를 해결합니다.

  • 데이터 해저드 (Data Hazards): 명령어 실행에 필요한 데이터가 아직 준비되지 않았을 때 발생합니다.

    • 포워딩 (Forwarding/Bypassing): 이전 단계에서 생성된 ALU 결과를 다음 단계로 직접 전달하여 스톨(stall)을 줄입니다.

    • 스톨 (Stalling): 데이터가 준비될 때까지 파이프라인을 잠시 멈춥니다.

  • 제어 해저드 (Control Hazards): 분기 명령어(branch)의 목적지를 결정하기 전에 다음 명령어를 인출하기 시작할 때 발생합니다.

    • 분기 예측 (Branch Prediction): 분기의 다음 경로를 예측하고, 예측이 틀리면 파이프라인을 플러시(flush)합니다.

    • 지연 슬롯 (Delay Slot): MIPS I/II 아키텍처의 특징으로, 분기 명령어 바로 다음의 명령어가 항상 실행됩니다. 이 슬롯에 유용한 명령어를 채워 넣어 파이프라인 스톨을 피합니다 (최신 MIPS 아키텍처에서는 지연 슬롯이 사라지거나 선택 사항이 됨).

4. 메모리 구성

  • 바이트 주소 지정 (Byte-addressable): 메모리의 각 바이트는 고유한 주소를 가집니다.

  • 워드 정렬 (Word alignment): 32비트 워드(4바이트)는 4의 배수 주소에 저장되어야 합니다. 그렇지 않으면 예외(주소 오류)가 발생합니다.

  • 빅 엔디안 (Big-endian) 또는 리틀 엔디안 (Little-endian): MIPS는 두 가지 모두 지원할 수 있도록 설계되었으며, 구현에 따라 선택됩니다. (빅 엔디안: 최상위 바이트가 가장 낮은 주소에, 리틀 엔디안: 최하위 바이트가 가장 낮은 주소에 저장)

5. MIPS의 예외 (Exceptions) 및 인터럽트 (Interrupts)

제가 이전에 상세히 설명드린 내용이지만, MIPS 아키텍처의 중요한 구성 요소이므로 다시 한번 간략하게 강조합니다.

  • 정의: 프로그램 실행을 방해하는 예상치 못한 이벤트.

  • 유형: 산술 오버플로우, 정의되지 않은 명령어, 주소 오류, TLB 미스 (내부 예외) 및 I/O 장치 요청 (인터럽트, 외부 예외) 등이 있습니다.

  • CP0 (System Control Coprocessor): 예외 처리를 위한 특수 레지스터(EPC, Cause, Status, BadVAddr 등)를 포함하여 예외의 발생, 유형 기록, 처리 루틴으로의 점프 및 복귀를 제어합니다.

  • 파이프라인에서의 처리: 예외는 제어 해저드로 간주되며, 예외 발생 시 해당 명령어 이후의 파이프라인은 플러시되고, 정확한 예외 발생 지점까지의 명령어는 완료됩니다. 이후 EPC와 Cause 레지스터가 설정되고 예외 핸들러로 제어가 전달됩니다.

6. MIPS 명령어 집합의 특징

  • 다양한 연산: 산술 (add, sub, mul, div), 논리 (and, or, xor, nor), 시프트 (sll, srl, sra), 로드/스토어 (lw, sw, lb, sb 등), 분기 (beq, bne 등), 점프 (j, jal, jr) 등 다양한 명령어를 제공합니다.

  • 의사 명령어 (Pseudo-instructions): 어셈블리어를 작성할 때 프로그래머의 편의를 위해 제공되는 명령어들입니다. 실제로는 하나 이상의 기본 MIPS 명령어로 변환됩니다 (예: move $t1, $t2add $t1, $t2, $zero로 변환될 수 있음).

7. MIPS 아키텍처의 변형 (Variants)

MIPS 아키텍처는 시간이 지나면서 여러 버전으로 발전했습니다.

  • MIPS I, II, III, IV, V: 초기 32비트 아키텍처부터 64비트, 부동소수점 처리 기능 등을 추가하며 발전했습니다.

  • MIPS32/MIPS64: 현재 주로 사용되는 32비트 및 64비트 아키텍처의 표준입니다.

  • microMIPS: 코드 밀도(code density)를 향상시키기 위해 16비트 명령어와 32비트 명령어를 혼합하여 사용하는 변형입니다.

8. MIPS의 활용 및 중요성

과거에는 MIPS 프로세서가 SGI 워크스테이션, Cisco 라우터, Sony PlayStation (PS1, PS2), Nintendo 64 등 다양한 임베디드 시스템, 네트워크 장비, 게임 콘솔 등에서 널리 사용되었습니다. ARM 아키텍처의 부상으로 인해 시장 점유율은 감소했지만, 컴퓨터 아키텍처 교육 분야에서는 여전히 RISC 원칙을 이해하기 위한 가장 중요한 아키텍처 중 하나로 광범위하게 연구되고 가르쳐지고 있습니다. 단순하고 규칙적인 구조 덕분에 학생들이 파이프라인, 캐시, 메모리 관리, 예외 처리 등 컴퓨터 시스템의 핵심 개념을 학습하기에 매우 적합하기 때문입니다.


MIPS는 컴퓨터 아키텍처의 기본 원리를 이해하는 데 있어 '교과서'와 같은 역할을 하는 중요한 아키텍처입니다. 그 단순하고 효율적인 설계는 현대의 고성능 프로세서에도 많은 영향을 미쳤습니다.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기