cs기초 지식 정리/컴퓨터구조, 운영체제

ALU, 제어장치, 명령어 사이클, 인터럽트

세용용용용 2024. 3. 18. 19:29
[ "혼자 공부하는 컴퓨터구조 + 운영체제" ] 공부한 후 정리한 내용 입니다

 


1. ALU

  • ALU는 CPU 내부 "계산기" 역할을 담당하는 요소로, 산술 연산과 논리 연산을 수행한다.

 

(1) 받아들이는 정보 / 내보내는 정보

  • ALU가 계산을 수행하기 위해 두 가지 정보가 필요하다.
ALU 아키텍쳐 예시

[ 입력 ]

  • 피연산자(Operand)
  • → 레지스터로부터 전달
  • 제어 신호(Control Signal)
  • → 제어 장치로부터 전달
  • → 어떤 연산을 수행할지 지정

[ 출력 ]

  • 연산 결과
  • → 다시 레지스터에 저장
  • 플래그 정보
  • → 연산 결과에 대한 부가 정보를 플래그 레지스터에 저장

 

(2) 플래그(Flag)란?

플래그는 연산 결과의 상태를 나타내는 정보 → 플래그 레지스터라는 특수한 레지스터에 저장된다.

플래그 레지스터

[ 플래그 종류 ]
부호 플래그 : 연산 결과 부호
제로 플래그 : 연산 결과가 0인지 여부
캐리 플래그 : 연산 결과 올림수나 빌림수가 발생했는지 여부
오버플로우 플래그 : 오버플로우 발생 여부( 연산 결과가 저장할 레지스터에 비해 클 경우 )
인터럽트 플래그 : 인터럽트가 가능한지 여부 ( 비활성화 시 인터럽트 요청을 무시함 )
슈퍼바이저 플래그 : 현재 실행 모드 ( 커널 모드로 실행 중인지, 사용자 모드 실행인지 )


 


2. 제어장치

  • 제어 장치는 CPU에서 지휘자 역할을 하는 요소로 → "명령어"를 해석하고 수행을 제어한다.

 

(1) 받아들이는 정보 / 내보내는 정보

  • 제어 장치는 여러 구성 요소로부터 정보를 받아 제어 신호를 생성하고 전달한다.
제어장치 아키텍쳐 예시

[ 입력 ]

  • 클럭 : 모든 명령어는 클럭 신호에 맞춰 순차적으로 수행
  • 명령어 레지스터 : 현재 실행할 명령어를 저장 →  제어 장치는 해당 명령어를 읽고 해석
  • 플래그 레지스터 : ALU 연산 결과에 대한 상태 정보를 제공
  • 제어 버스 : 컴퓨터 각 부품들과 제어 신호를 주고 받는 통로

[ 출력 ]

  • 제어 신호 ( 제어 장치가 생성하는 신호로 다음과 같은 동작을 지시 )
- ALU가 수행할 연산 종류
- 레지스터에 값 저장 여부
- 메모리 읽기 / 쓰기 제어
- 입출력 장치 동작 제어

 

(2) 동작 흐름 요약

  1. 클럭 신호에 맞춰 명령 수행 시작
  2. 명령어 레지스터에 저장된 명령어 해석
  3. 플래그 레지스터의 상태를 참고
  4. 필요한 제어 신호를 생성
  5. 제어 버스를 통해 각 부품에 전달

 


 


3. 레지스터

  • CPU 내부 작은 임시 저장 장치로 → 명령어 실행 과정에서 "데이터 ·주소·상태 정보"를 임시로 저장한다.
  • CPU 내부에는 역할에 따라 다양한 레지스터가 존재한다.

 

(1) 주요 레지스터 종류

1. 프로그램 카운터 : 다음에 실행할 명령어의 메모리 주소를 저장
2. 명렁어 레지스터 : 방금 메모리에서 읽어온 명령어를 저장 → 제어 장치가 해당 명령어를 해석
3. 메모리 주소 레지스터 : 접근할 메모리 주소를 저장 → 메모리 읽기/쓰기 대상 주소 지정
4. 메모리 버퍼 레지스터 : 메모리와 주고받는 데이터 또는 명령어를 저장 ( 메모리 ↔ CPU 간 데이터 이동 시 사용 )
5. 플래그 레지스터 : ALU 연산 결과에 대한 부가 정보 저
6. 범용 레지스터 : 다양한 상황에서 자유롭게 사용 ( 프로그램 실행 중 가장 빈번하게 사용 )
7. 스택 포인터 : 특별한 주소지정에 사용 → 스택 포인터를 이용한 주소 지정 방식, 맨 꼭데기

스택 주소지정 방식

8. 베이스 레지스터 : 특별한 주소지정에 사용(변이 주소 지정 방식, 오퍼랜드 필드의 값과 레지스터 값을 더하여 유효 주소 얻기)

  • 상대 주소 지정 방식 : 오퍼랜드 값 + 프로그램 카운터의 값을 더하여 유효 주소 얻는 방법
  • 베이스 레지스터 주소 지정 방식 : 오퍼랜드 값 + 베이스 레지스터 값을 더해 유효 주소 얻는 방법

 

(2) 실행 흐름 정리

  • 프로그램 카운터는 기본적으로 자동 증가
  • 순차 실행이 원칙
  • 하지만 다음 경우 흐름이 변경됨
    • 분기 / 점프 명령 실행
    • 인터럽트 발생
    • 함수 호출 및 복귀

 
 


4. 명령어 사이클과 인터럽트

  • cpu는 프로그램에 포함된 명령어들을 사이클에 따라 반복적으로 실행한다. → 이 실행 흐름을 "명령어 사이클" 이라고 함

 

(1) 명령어 사이클 구성

  • 인출 사이클 : 메모리에 있는 명령어를 cpu로 가지고옴 ( 프로그램 카운트 주소의 명령어 읽음 → 명령어 레지스터에 저장 )
  • 실행 사이클 : 메모리로 부터 가지고온 명령어를 수행하는 단계
  • 간접 사이클 : 명령어 실행을 위해 추가적인 메모리 접근이 필요한 경우 ( 사용할 데이터의 주소를 다시 메모리에서 가져옴 )

 

(2) 인터럽트

  • CPU의 정상적인 실행 흐름을 잠시 중단시키고 → 우선 처리해야 할 작업을 수행하게 하는 메커니즘

[ 인터럽트 종류 ]

인터럽트 종류
  • 동기 인터럽트 : CPU가 예기치 못한 상황에 접할 때
  • 비동기 인터럽트 : 주로 입출력장치에 의해 발생 → 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용

[ 인터럽트가 필요한 이유 ]

  • 인터럽트가 없다면 CPU는 하드웨어 완료 여부를 주기적으로 확인해야됨
  • 인터럽트가 존재시 CPU는 하드웨어 작업동안 다른일을 할수있다 → 필요할 떄만 인터럽트를 처리!

[ 비동기 인터럽트 처리 순서 ]

  1. 입출력 장치는 CPU에 인터럽트 요청 신호 보냄
  2. CPU는 실행 사이클 마무리 후 명령어 인출전 항상 인터럽트 여부를 확인
  3. CPU는 인터럽트 요청을 확인 후 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 확인
  4. 인터럽트 받아들일 수 있다면 CPU는 지금 까지 작업을 백업
  5. CPU는 인터럽트 벡터를 참조해 인터럽트 서비스 루틴(프로그램) 실행
  6. 인터럽트 서비스 루틴 종료시 (4)에서 백업한 작업을 복구해 실행 재개

인터럽트 벡터 :  인터럽트를 구분하기 위한 정보( cpu가 해당 인터럽트 주소의 시작점을 알수있음 )
인터럽트 발생 시 → 기존에 실행정보가 저장된 각각의 레지스터 값들을 스택영역에 저장후 인터럽트 서비스 실행

인터럽트 서비스 루틴 종료시 다시 스택에서 백업을 한 후 실행