════════════════
Ch.04 중앙처리장치(CPU)
════════════════
■ 4.1 프로세서 구성과 동작
컴퓨터 기본구조와 버스
• 3대 핵심장치: 프로세서(CPU)-메모리-입출력장치, 버스(Bus)로 연결
• 폰노이만 구조: CPU(제어장치+ALU+레지스터세트) ↔ 내부버스 ↔ 메모리/입출력장치
• 시스템버스 3종
주소버스: CPU→메모리, 단방향
데이터버스: CPU↔메모리, 양방향
제어버스: 읽기/쓰기 등 제어신호, 주로 단방향
• 메모리버스: CPU↔RAM 전용 고속버스
• I/O버스: CPU↔주변장치
프로세서 3대 구성요소
• ALU(산술논리연산장치): 덧셈·뺄셈·곱셈·나눗셈 등 산술연산 + AND/OR/XOR 등 논리연산, 결과는 누산기(AC)에 저장
• CU(제어장치): 명령어 인출(Fetch)→해독(Decode)→실행(Execute), 각 장치에 제어신호 발생
• 레지스터세트: CPU 내부 초고속·소용량 메모리, PC/IR/AC/SP/MAR/MBR 등 특수레지스터+범용레지스터
명령실행 사이클(Fetch-Decode-Execute) 7단계
① 인출(Fetch): 메모리에서 명령어 읽어 IR 저장
② PC증가: PC=PC+1
③ 해독(Decode): CU가 IR 해독, 명령유형 결정
④ 주소결정: 메모리 데이터 사용 시 위치 결정
⑤ 데이터인출: 필요 시 메모리→레지스터로 오퍼랜드 가져옴
⑥ 실행(Execute): ALU연산 또는 I/O동작
⑦ 반복: 1단계로 복귀
• 시험포인트: PC는 Fetch 후 자동 증가
■ 4.2 산술논리연산장치(ALU)
• ALU: 산술+논리 연산 담당, 결과는 AC에, 연산상태는 플래그레지스터(C/Z/N/V/P)에 저장
• 구조: 오퍼랜드A, 오퍼랜드B, Carry-in, ALU제어신호 입력 → AC(결과)/상태레지스터 출력
산술연산
• ADD: X←A+B
• SUB: X←A+(~B+1), 2의보수 이용한 뺄셈
• MUL/DIV: 곱셈/나눗셈
• INC/DEC: A+1/A-1
• NEG: X←~A+1 (부호반전, 2의보수)
논리연산과 시프트
• AND: 비트단위 AND, 특정비트 추출(마스킹)에 사용 → 원하는 비트만 남기기
• OR: 비트단위 OR, 특정비트 삽입(설정)에 사용 → 원하는 비트를 1로
• NOT: 모든 비트 반전(1의보수)
• XOR: 비트단위 XOR, 대칭연산, 의사난수 생성에 활용
• ASL: 산술왼쪽시프트 → ×2ⁿ 효과
• ASR: 산술오른쪽시프트, 부호비트(MSB) 보존 → ÷2ⁿ 효과, 음수부호 유지
• LSL/LSR: 논리시프트, 부호무관, 빈자리 0 채움
• ROL/ROR: 회전시프트, 밀린 비트가 반대편에 다시 나타남(비트손실 없음)
• ROLC/RORC: 캐리비트 포함 회전
핵심 포인트
• AND=비트 지우기(0삽입) / OR=비트 켜기(1삽입) / XOR=비트 뒤집기
• 왼쪽 k비트 시프트=×2ᵏ / 오른쪽 k비트 시프트=÷2ᵏ (ASR은 음수부호 유지)
부스(Booth) 알고리즘 — 부호있는 정수 곱셈
• 승수 Q의 비트를 오른쪽부터 2비트씩(q1,q0) 검사, 판별기준따라 덧셈/뺄셈/없음 후 오른쪽 산술시프트
• q1q0=01: A=A+M(덧셈)→오른쪽 산술시프트
• q1q0=10: A=A-M(뺄셈)→오른쪽 산술시프트
• q1q0=00 or 11: 연산없이 오른쪽 산술시프트만
• 결과: AQ 레지스터에 최종 곱셈 결과 저장
• 예) (-7)×(+3): Q=0011, M=1001, -M=0111 → AQ=11101011₂ = -21
• 예) 5×4: Q=0100, M=0101, -M=1011 → AQ=00010100₂ = 20
• 시험포인트: q1q0 판별기준(01/10/00·11) 반드시 암기
■ 4.3 레지스터
• 레지스터: CPU 내부 가장 빠른 메모리, 연산데이터·주소·제어정보 일시 저장
주요 레지스터 종류와 역할
• MAR(메모리주소레지스터): CPU가 읽거나 쓸 메모리 주소 저장, 주소버스로 전송
• MBR/MDR(메모리버퍼/데이터): 메모리에서 읽거나 쓸 데이터 임시저장, 데이터버스와 연결
• PC(프로그램카운터): 다음 실행할 명령어 주소 저장, 인출 후 자동 증가(=명령포인터)
• IR(명령레지스터): 인출한 명령어 저장, CU가 읽어 해독
• AC(누산기): ALU 연산의 입력·중간결과·최종결과 저장
• SP(스택포인터): 메모리스택 TOP주소 저장, LIFO구조 관리(크기 2 또는 4바이트)
• FR/PSW(플래그/상태레지스터): C(Carry)Z(Zero)N(Negative)V(Overflow)P(Parity) 비트 저장
• IX(인덱스레지스터): 배열 접근 시 기준주소에 더할 인덱스값 저장
• 범용레지스터: 일반 데이터 임시저장, x86의 EAX/EBX/ECX/EDX 등, 보통 8~32개
• 세그먼트레지스터(x86전용): CS(코드)/DS(데이터)/SS(스택)/ES,FS,GS(추가데이터)
• 시험포인트: PC/IR/MAR/MBR/AC/SP 6개 역할 필수 암기
레지스터 전송 명령
• LOAD: 주기억장치→레지스터 (읽기)
• STORE: 레지스터→주기억장치 (저장)
• MOVE: 레지스터→레지스터 (이동, 인텔x86은 LOAD/STORE/MOVE 모두 MOV 하나로 처리)
• 핵심: 데이터형 변환(8bit→16bit 등) 시 부호확장 자동 처리
■ 4.4 컴퓨터 명령어
명령어 형식(주소 수에 따른 분류)
• 명령어=opcode(연산코드)+operand(오퍼랜드), 오퍼랜드 개수따라 0~3주소로 분류
• 0-주소: opcode만 존재, 스택 이용(PUSH B/PUSH C/ADD/PUSH A/MUL/POP Z) — 명령어 짧음, 스택 필요, 명령 수 많음
• 1-주소: opcode+addr1, 나머지는 누산기(AC)에 묵시적(LOAD B→ADD C→MUL A→STOR Z) — 넓은 주소영역, 누산기가 중간결과 덮어씀
• 2-주소: opcode+addr1+addr2, addr1에 결과 저장(ADD R1,R2→R1←R1+R2) — 직관적, addr1 원래값 소멸
• 3-주소: opcode+addr1+addr2+addr3, 입력2개+결과1개 완전분리(ADD R1,R2,R3→R1←R2+R3) — 입력보존/프로그램 짧음, 명령어 길고 해독 복잡
• 명령어형식 설계기준: ①길이 ②공간 ③주소필드 비트수
확장 opcode
• 고정된 명령어 길이 안에서 opcode 비트수를 가변적으로 늘려 더 많은 명령어 표현
• 원리: 자주 쓰는 명령어=짧은 opcode / 드물게 쓰는 명령어=긴 opcode
• 16비트 예: 3주소(4비트opcode→16개) / 2주소(8비트→30개 추가) / 1주소(12비트→31개 추가) / 0주소(16비트→16개 추가)
• 장점: 제한 비트로 더 많은 명령어 표현, 평균 명령어 길이 최소화
• 단점: 다양한 크기 명령어→신속한 해독 어려움
ISA 6대 명령어 그룹
• 데이터이동명령: LOAD/STORE/MOVE, 메모리↔레지스터·레지스터↔레지스터 데이터 복사
• 2항연산명령: 산술(덧셈·뺄셈·곱셈·나눗셈), 논리(AND-추출/OR-삽입/XOR-뒤집기/NOR/NAND)
• 단항연산명령: 오퍼랜드 1개, 시프트/회전/INC/DEC/NEG(2의보수)/NOT(1의보수). 시프트=비트손실, 회전=손실없이 순환
• 비교·조건분기명령: 두 값 비교 후 조건 충족 시 특정주소로 점프, 상태코드비트(C/Z/V/N) 활용
• 프로시저 호출명령: 서브루틴/함수 호출, 복귀주소는 스택에 저장, 재귀호출도 스택 덕분에 정상 동작
• 루프제어명령: 카운터초기화→루프코드실행→카운터업데이트→종료조건검사→미충족시 처음으로 분기
입출력(I/O) 방식 3종
• 프로그래밍 I/O(폴링): CPU가 I/O장치 상태 계속 직접 확인, 대기(busy waiting)로 CPU시간 낭비, 임베디드·저사양 시스템에 주로 사용
• 인터럽트 구동 I/O: I/O완료 시 하드웨어가 CPU에 인터럽트 신호 발생, CPU는 그 전까지 다른 작업 가능, 단점은 문자마다 인터럽트 발생 시 처리비용 증가
• DMA(Direct Memory Access): DMA제어기가 CPU 없이 메모리↔I/O장치 간 데이터 직접 전송, 사이클스틸링(Cycle Stealing)으로 CPU 버스 점유 최소화, 고속장치(HDD,SSD)에 적합
DMA 내부 레지스터 4개: ①메모리주소 ②전송바이트수 ③장치번호 ④읽기/쓰기
• 성능순서: 폴링(낮음) < 인터럽트 < DMA(높음) ← CPU 부담은 반대순
• 시험포인트: DMA 사이클스틸링 개념+4가지 내부레지스터 암기
■ 4.5 주소 지정 방식(Addressing Mode)
정의: 명령어에서 오퍼랜드(피연산자)의 실제 위치를 찾는 방법
① 즉시(Immediate)
• 명령어 자체에 오퍼랜드 값 직접 포함, 예) MOVE R1,4 → R1←4
• 장점: 메모리 접근 불필요, 빠름 / 단점: 상수만 가능, 크기 제한
② 직접(Direct)
• 명령어에 오퍼랜드의 메모리주소 직접 포함, 예) LOAD 0x8C30→AC←M[0x8C30]
• 장점: 단순 / 단점: 항상 같은 위치만 접근
③ 레지스터(Register)
• 오퍼랜드가 레지스터에 있음, 가장 일반적, 예) ADD R1,R2→R1←R1+R2
• 장점: 가장 빠름, 주소 짧음 / 단점: 레지스터 수 제한
④ 레지스터 간접(Reg. Indirect)
• 레지스터가 메모리주소(포인터) 보유, 예) ADD R1,(R7)→R1←M[R7]
• 장점: 포인터·배열 처리에 최적, 명령어 길이 짧아짐
⑤ 변위(Displacement) — 레지스터값+오프셋으로 실제주소 계산, 여러 하위방식의 기반
• 인덱스(Indexed): 인덱스레지스터+변위, 배열 순회에 최적, 예) ADD R1,A(R2)→R1=R1+M[A+R2]
• 상대(Relative): PC+변위, 분기명령에 주로 사용, 위치독립코드(PIC) 생성
• 베이스(Base): 세그먼트레지스터(DS/CS/SS등)+변위, 예) DS=25400,offset=200→M[25600], x86 세그먼트 구조 지원
⑥ 간접(Indirect)
• 명령어 안의 주소→메모리에서 실제주소 읽기→데이터 접근, 메모리를 두 번 이상 접근
• 단점: 느림, 현재 거의 미사용
⑦ 묵시적(Implied)
• 오퍼랜드 위치가 명령어에 없고 암묵적으로 결정, 예) RET(스택TOP→PC), PUSH R1, POP
• 장점: 명령어 짧음
• 시험포인트: 7가지 방식의 이름·동작·장단점 구분 단골, 특히 간접 vs 레지스터간접 차이 주의
프로세서별 주소 지정 방식 지원 현황 (x86/ARM/AVR)
• 즉시주소지정: O/O/O
• 직접주소지정: O/X/O
• 레지스터주소지정: O/O/O
• 레지스터간접주소지정: O/O/O
• 인덱스주소지정: O/O/X
• 베이스-인덱스주소지정: X/O/X
■ 4.6 CISC와 RISC 프로세서
① CISC(Complex Instruction Set Computer)
• 정의: 복잡하고 다양한 명령어 세트를 가진 프로세서 구조
• 역사: 1950 모리스 윌크스 제안 → 1964 IBM 시스템/360 → 인텔 계열 발전
• 구현방식: 마이크로프로그래밍(하드웨어를 소프트웨어로 대체, 제어기억장치ROM에 마이크로명령 저장)
• 특징: 하드웨어 강조, 명령어 크기·형식 가변적·다양, 주소지정방식 복잡·다양, 레지스터 수 적음(8~16개), 명령어 1개가 여러 클록사이클, 파이프라인 구성 어려움
• 대표: Intel x86 계열, IBM 메인프레임, VAX
② RISC(Reduced Instruction Set Computer)
• 정의: 단순하고 빠른 명령어 세트를 강조하는 구조
• 역사: 1980 UC버클리(Patterson&Sequin) + 1981 스탠포드(Hennessy, MIPS) → SPARC, MIPS로 발전
• 핵심철학: 명령어 1개를 복잡하게 하기보다, 단순 명령어를 초당 더 많이 실행하는 것이 성능에 유리
• 특징: 소프트웨어(컴파일러) 강조, 명령어 크기 고정·형식 제한적, 주소지정방식 단순·제한, 레지스터 수 많음(32~250개), 대부분 명령어 1클록사이클, LOAD/STORE만 메모리 접근(연산은 레지스터 간), 파이프라인 구성 쉬움
• 대표: SPARC, MIPS, ARM, PowerPC
CISC vs RISC 비교표
• 하드웨어강조(마이크로프로그래밍) vs 소프트웨어강조(컴파일러)
• 명령어 크기·형식 가변적 vs 고정
• 주소지정방식 복잡 vs 단순
• 레지스터 8~16개 vs 32~250개
• 프로그램 길이 짧고 사이클 긺 vs 모든명령어 1사이클, 프로그램길이 긺
• 파이프라인 어려움 vs 쉬움
• 제어메모리 필요(수백KB) vs 불필요
현대 프로세서 설계 5원칙(RISC 철학)
① 하드웨어 직접 실행: 마이크로코드 없이 모든 명령어를 하드웨어가 직접 실행
② 최대 효율: 명령어 시작 시 최대 효율 내는 명령어 우선 설계
③ 쉬운 해석: 단순·고정 형식으로 빠른 해독
④ LOAD/STORE만 메모리 접근, 연산은 레지스터 간 수행
⑤ 많은 레지스터: 메모리 접근 최소화를 위해 충분한 레지스터 제공
• 핵심포인트: Intel 486부터 CISC CPU 내부에 RISC코어 탑재 → 하이브리드 구조, 일반명령어는 1클록에 처리하면서 x86 호환 유지
★ 시험 직전 핵심 요약 Cheat Sheet
• Fetch-Decode-Execute: ①메모리→IR ②PC증가 ③CU해독 ④주소결정 ⑤데이터인출 ⑥실행 ⑦반복
• ALU 플래그: C=캐리 Z=제로 N=음수 V=오버플로 P=패리티
• AND/OR/XOR: AND=비트지우기(마스킹) / OR=비트켜기(삽입) / XOR=비트뒤집기
• 시프트=곱/나눗셈: 왼쪽k시프트=×2ᵏ / 오른쪽k시프트=÷2ᵏ(ASR:음수부호유지)
• 부스알고리즘: q1q0=01→A+M / 10→A-M / 00·11→그냥시프트, 결과=AQ레지스터
• PC: 다음 실행 명령어 주소, 인출 후 자동증가(=명령포인터)
• IR: 현재 실행중인 명령어 보관, CU가 읽어 해독
• MAR/MBR: MAR=메모리주소보관 / MBR=메모리데이터(읽거나쓸내용) 임시보관
• SP(스택포인터): 스택TOP주소, LIFO, 프로시저호출시 복귀주소 자동저장
• 0~3주소 명령어: 0=스택묵시 / 1=AC묵시+addr / 2=addr1이 결과저장 / 3=입력2+결과1 분리
• 확장opcode: 가변길이 opcode로 제한된 비트에서 더 많은 명령어 표현
• 즉시/직접/레지스터: 즉시=명령어 안의 값 / 직접=명령어 안의 메모리주소 / 레지스터=레지스터 이름
• 레지스터간접: 레지스터에 메모리주소(포인터) 저장, 배열·포인터 처리에 활용
• 변위/인덱스/상대/베이스: 레지스터+오프셋=실제주소, 인덱스reg/PC/세그먼트reg 각각 사용
• 간접주소지정: 메모리 2번 접근(느림), 현재 거의 미사용
• 묵시적주소지정: RET/PUSH/POP처럼 오퍼랜드 위치가 명령어에 없이 암묵적 결정
• CISC: 복잡명령어·가변길이·마이크로프로그래밍·레지스터적음·파이프라인어려움
• RISC: 단순명령어·고정길이·컴파일러복잡·레지스터많음·파이프라인쉬움
• DMA: CPU없이 메모리↔I/O 직접전송, 사이클스틸링, 4레지스터(주소/카운터/장치/방향)
• I/O 방식 성능순서: 폴링(낮음) < 인터럽트 < DMA(높음), CPU부담은 반대순