CS/CS

CPU

kiccc 2025. 8. 20. 17:43

CPU


 

CPU

레지스터

레지스터는 CPU안에 있는 작은저장장치

데이터,명령어들이 처리 직전,직후에 레지스터에 저장

레지스터 종류들에 대해 알아보자

 

Program Counter (PC)

메모리에서 다음으로 읽어 들일 명령어의 주소를 저장
프로그램 카운터를 명령어 포인터 IP, Instruction Pointer라고 부르는 CPU도 존재
일반적으로 프로그램 카운터는 1씩 증가, 이는 다음 읽을 메모리 주소가 1씩 증가하는 것을 의미
메모리에 저장된 프로그램이 순차적으로 실행 = 근본적으로 프로그램 카운터 값이 1씩 증가하 며 실행

근데 무조건 1씩 증가는 아님. 조건문 or return문에 따라 PC 값이 임의의 위치로 이동 가능

 

Instruction Register (IR)

해석할 명령어, 즉 메모리에서 방금 읽어 들인 명령어를 저장

Control Unit는 IR의 명령어를 해석한 뒤 ALU(산술논리연산 장치)로 연산하도록 시키거나
다른 부품으로 제어 신호를 보내 해당 부품을 작동

 

General Purpose Registe

범용 레지스터, 다양하고 일반적인 상황에서 자유롭게 사용 가능

데이터와 명령어, 주소 모두를 저장 가능

일반적으로 CPU 안에는 여러 개의 범용 레지스터들 존재

 

Flag Register 

연산의 결과나 CPU 상태를 나타내는 여러 개의 플래그(flag) 비트를 저장
플래그는 보통 1비트 단위로 존재하며, 특정 조건이나 상태를 나타냄
CPU는 명령어를 수행할 플래그를 통해 여 다음 동작을 결정, 분기 명령(jump, branch 등)에서 활용

부호 플래그(Sign Flag, SF)
  • 연산 결과가 음수인지 양수인지 나타냄
  • 결과의 최상위 비트(MSB)를 그대로 저장
  • MSB = 1 → 음수, MSB = 0 → 양수
제로 플래그(Zero Flag, ZF)
  • 연산 결과가 0인지 여부를 나타냄
  • 결과가 0이면 ZF = 1, 0이 아니면 ZF = 0
캐리 플래그(Carry Flag, CF)
  • 덧셈에서 최상위 자리에서 올림(carry)이 발생했는지,
    뺄셈에서 빌림(borrow)이 발생했는지 나타냄
  • 주로 무부호 연산(Unsigned Arithmetic)에서 사용
오버플로우 플래그(Overflow Flag, OF)
  • 연산 결과가 표현할 수 있는 범위를 초과했는지 나타냄
  • 주로 부호 있는 정수 연산(Signed Arithmetic)에서 사용
패리티 플래그(Parity Flag, PF)
  • 결과 값 하위 8비트에 포함된 1의 개수가 짝수인지 홀수인지
  • 짝수 개 → PF = 1, 홀수 개 → PF = 0
보조 캐리 플래그(Auxiliary Carry Flag, AF)

  • 하위 4비트에서 올림(carry)이 발생했는지 
  • 주로 BCD(2진화 10진수) 연산에 사용
인터럽트 플래그(Interrupt Flag, IF)
  • 외부 하드웨어 인터럽트의 허용 여부를 제어
  • IF = 1 → 인터럽트 허용, IF = 0 → 인터럽트 무시
디렉션 플래그(Direction Flag, DF)
  • 문자열 처리 명령어 실행 시 메모리 접근 방향을 결정
  • DF = 0 → 증가 방향 (앞으로 진행)
  • DF = 1 → 감소 방향 (뒤로 진행)

 

 

Stack Pointer

메모리에는 실행 중인 프로그램들이 적재
실행 중인 각 프로그램들은 스택과 같은 형태로 사용 가능한 주소 공간에 있음

스택처럼 사용하는 이 영역을 스택 영역

스택 포인터stack pointer란 메모리 내 스택 영역의 최상단 스택 데이터 위치를 가리키는 특별한 레지스터
스택 포인터는 마지막으로 스택에 저장된 데이터의 위치를 가리키는 레지스터, 스택이 채워진 정도를 나타내는 레지스터

 


인터럽트


CPU가 수행 중인 작업을 방해를 받아 잠시 중단,이렇게 CPU의 작업을 방해하는 신호를 인터럽트interrupt

인터럽트는 동기 인터럽트비동기 인터럽트로 분류


동기 인터럽트 synchronous interrupts는 CPU에 의해 발생하는 인터럽트
CPU가 프로그래밍 오류와 같은 예외적인 상황(예상치 못한 상황)을 마주쳤을 때 발생하는 인터럽트
동기 인터럽트는 예외exception 라고도 한다.


비동기 인터럽트 asynchronous interrupts 는 주로 입출력장치에 의해 발생
ex) CPU가 프린터와 같은 입출력장치에게 입출력 작업을 지시
작업을 끝낸 입출력장치가 CPU에게 완료 알림(인터럽트)을 보냄
키보드, 마우스와 같은 입출력장치가 어떤 입력을 받아들였을 때, 이를 처리하기 위해 CPU에게 입력 알림(인터럽트)을 보낸다.
일반적으로 비동기 인터럽트= 인터럽트

 

하드웨어 인터럽트 ( 비동기 인터럽트 )

 

CPU는 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트를 사용( 무슨 연관성? )

ex) CPU -> 프린트 명령
일반적으로 입출력장치의 속도는 CPU 에 비해 매우 느리다 = 결과를 바로 받을 수 없다.
만약 하드웨어 인터럽트가 없다면 언제 끝날지 모름 -> 주기적으로 프린터의 완료 여부를 확인

 


폴링(polling)  : 작업 완료 여부를 계속해서 확인하는 기법
입출력장치의 상태가 어떤지, 처리할 데이터가 있는지 주기적으로 확인하는 것



하드웨어 인터럽트를 사용하면 CPU는 작업 종료 기다릴 필요 없이 다른 작업 가능
여러 종류의 인터럽트 존재, CPU가 인터럽트를 처리하는 방식은 대부분 비슷

CPU가 하드웨어 인터럽트를 처리하는 순서

  1. IO는 CPU에게 인터럽트 요청 신호 전송
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인
  3. CPU는 인터럽트 요청을 확인하고, 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인
  4. 인터럽트를 받아들일 수 있다면 CPU가 지금까지의 작업을 백업
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
  6. 인터럽트 서비스 루틴 실행이 끝나면, 백업해 둔 작업을 복구하여 실행을 재개

인터럽트 요청 신호 : CPU에게 인터럽트의 가능 여부를 확인해달라는 신호

인터럽트 플래그 : 인터럽트를 받아들일지 말지를 결정하는 플래그

근데 플래그 보다 우선순위가 높은 인터럽트 존재
이를 구분하기 위해 maskable, non maskable 인터럽트로 구분

인터럽트 서비스 루틴(인터럽트 핸들러) : 인터럽트를 처리하기 위한 프로그램
해당 인터럽트를 어떻게 처리하고 작동해야하는지에 대한 정보

 

IO마다 인터럽트 처리 동작이 다르므로 각기 다른 인터럽트 서비스 루틴을 가짐
즉, 메모리에는 여러 개의 인터럽트 서비스 루틴들이 저장,
각각이  '인터럽트가 발생하면 어떻게 행동해야 할지'를 알려 주는 프로그램

 

인터럽트 벡터 : 수많은 인터 럽트 서비스 루틴들을 구분하기 위해 를 이용
인터럽트 서비스 루틴을 식별하기 위한 정보
CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 버스를 통해 인터럽트 벡터를 전달받음
인터럽트 벡터에 인터럽트 서비스 루틴의 시작 주소를 포함-> 주소를 통해 특정 인터럽트 서비스 루틴 실행

 

따라서 위의 1~6의 흐름을 요약해보자면

인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아옴

인터럽트 서비스 루틴 또한 데이터와 명령어로 이루어져 있기 때문에 인터럽트 서비스 루틴도
프로그램 카운터를 비롯한 레지스터들을 사용하면서 실행
그러면 그 전에 하고 있던 일에 대한 정보는? 
ISR을 실행하기 전 PC 값 등 필요한 모든 내용을 메모리 내 스택에 백업
그리고 나서 ISR 의 시작 주소가 위치한 곳으로 프로그램 카운터 값을 갱신, ISR 을 실행
인터럽트 처리 다 끝나면 스택에 저장해 둔 프로그램 카운터 등을 다시 불러온 뒤 이전까지 수행하던 작업을 재개

 

 

 

 

'CS > CS' 카테고리의 다른 글

트리 Tree  (3) 2025.08.29
동기화 , 교착 상태(DeadLock)  (3) 2025.08.24
컴퓨터가 이해하는 데이터  (0) 2025.08.20
컴퓨터 구조 개요  (1) 2025.08.20
운영체제 Operating System 정리 1  (0) 2023.03.22