카테고리 없음

[컴퓨터 구조] CPU의 구조와 기능 3

kyxxn 2023. 11. 12. 18:57
728x90

간접 사이클

  • 명령어에 포함된 주소를 통해, 명령어 실행에 필요한 데이터의 주소를 인출
  • 명령어 인출과 실행 사이클 사이에 위치해있음.
  • 간접 주소 지정방식에서 사용
  • 주로 오퍼랜드가 데이터의 주소의 주소인 경우

ex) OP code : 4bit, 오퍼랜드 : 12bit이면,

2^12로 0~4095번까지 주소지정이 가능하다.

그러나 주소 선이 16개이면 2^16으로 64K만큼 표현이 가능한데 이를 다 표현 못하니 간접 사이클 방식을 이용해서 64K 공간을 이용하는 방식.

→ 인출된 명령어의 주소 필드 내용을 이용하여 기억장치로부터 데이터의 실제 주소를 인출하여 IR의 주소 필드에 저장

간접 사이클에서 수행될 마이크로-연산

  1. T3 = MAR ← IR(addr, ‘데이터 주소’의 주소)
    명령어 인출을 했는데 간접 사이클 방식을 해야할 경우, 그 명령어의 주소를 MAR에 넣어서 다시 사이클을 반복한다.
  2. T4 = MBR ← M[MAR]
    데이터의 주소로 들어가 실제 데이터 주소를 MBR에 저장
  3. T5 = IR(addr, 실제 데이터 주소) ← MBR
    명령어 레지스터에 실제 데이트의 주소를 적재시킨다.

ex) CPU 클록이 2GHz인 경우, ADD 명령어 내에 간접 사이클이 포함된 수행시간

인출, 간접, 실행 사이클 : 0.5ns * (3+3+3) = 4.5ns

명령어 인출(3) + 간접 사이클(데이터 주소의 주소, 3) + 데이터 주소(3)

여러 가지 명령어의 종합적인 실행 과정

클록 주기 = 1/클록 주파수 == 1/(2 * 10^9) = 0.5ns

간접 사이클 (I) 비트가 1로 세트되었는지 판별

LOAD 250 : 인출(3) + 간접(3) + 실행(3) = 9개 클록 주기

ADD 251 : 인출(3) + 간접(3) + 실행(3) = 9개 클록 주기

STORE 251 : 인출(3) + 실행(3) = 6개 클록 주기

JUMP 170 : 인출(3) + 실행(1) = 4개 클록 주기

 

프로그램 실행시간 = 28 * 0.5ns = 14ns

 

인터럽트 사이클

인터럽트

  1. CPU가 프로그램 실행 중, 또 다른 프로그램의 실행 요구로 현재 실행 중인 프로그램을 중단 시키고 요구된 프로그램을 실행
  2. 인터럽트 시스템의 기본요소
    • 인터럽트 서비스 루틴(ISR)
    • : 인터럽트를 처리하기 위해 수행되는 프로그램 루틴
    • 인터럽트 벡터 테이블
    • : 다양한 인터럽트 신호를 처리하는 ISR의 시작 주소를 포함
  3. : 인터럽트 요청 신호, 처리 루틴, 서비스 루틴

인터럽트 처리 과정

  1. 인터럽트 요청 신호가 발생
  2. CPU는 현재 수행중인 명령어까지만 완료한 후, 수행중인 프로그램을 일시중지 (PC를 더이상 MAR로 넘기지 않음)
  3. 현재 프로그램 상태(PC 등)을 안전한 장소(Stack 레지스터)에 보관 - 일반적으로 스택은 주기억장치의 끝 부분을 사용
  4. 인터럽트의 원인을 찾아 해당 인터럽트 서비스 루틴을 실행 → 해당 ISR의 시작 주소를 PC에 적재시킴
  5. 인터럽트 서비스 루틴이 끝나면 보관해둔 레지스터 내용과 PC 내용을 복구하여 인터럽트 당한 프로그램을 중단된 곳부터 다시 수행.

명령어를 실행하다 인터럽트 요청 신호가 발생했다.

CPU 상태 레지스터의 인터럽트 플래그(I)가 0으로 비트 되어 있으면 인터럽트가 가능하니까 Yes로 이동.

인터럽트 사이클 실행 후 끝나면 다시 돌아옴.

인터럽트 사이클의 마이크로 연산

인터럽트 사이클 == 인터럽트 서비스 전

현재 PC를 스택에 저장하는 것이 목표.

  1. T0 = MBR ← PC
    현재 PC에 담긴 중단된 주소를 MAR이 아닌, MBR에 저장시켜줌
  2. T1 = MAR ← SP, PC ← ISR의 시작 주소
    현재 PC의 상태를 저장할 스택 제어 레지스터의 최상위 주소(TOS)를 MAR에 넣어준다.
  3. T2 = M[MAR] ← MBR, SP ← SP - 1
    기억장치 내의 TOS의 주소에 PC의 상태를 저장한다. SP는 스택 방식이므로 1이 줄어듬

PC가 100번지를 MAR에 넘겨주고 101이 된 상황.

그러다가 인터럽트가 들어와서 LOAD 작업만 하고 중지함.

  1. MBR ← 101(PC)을 저장
  2. MAR ← 999(SP의 TOS)를 저장, PC ← ISR 시작주소
  3. M[MAR] ← MBR, SP ← SP - 1

인터럽트 사이클을 마쳤을 때 PC, AC, IR, SP 들어있는 값 구분

다중 인터럽트

: 인터럽트 서비스 루틴을 수행하는 동안에 다른 인터럽트가 발생.

처리방법

  1. CPU가 인터럽트 서비스 루틴을 처리하는 도중, 새 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않는 방법
    1. 인터럽트 플래그가 1로 세트된 경우(인터럽트 불가능 상태)
    2. 시스템 운영상 중요한 프로그램이나 도중에 중단할 수 없는 데이터 입출력 동작 등을 위한 인터럽트를 처리하는데 사용
  2. 인터럽트의 우선순위 기반
    • 인터럽트의 우선순위
    • 외부(전원, 입출력장치) > 내부(코드오류, 0으로나누기, 오버플로우..) > 소프트웨어(SVC 커널모드에서 잠깐 전환을 요청)
    외부(전원, 입출력장치 등) > 내부(문법, 런타임 에러) > 소프트웨어 인터럽트(SVC)
  3. 우선순위가 낮은 인터럽트가 처리되고 있는 동안, 우선순위가 더 높은 인터럽트가 들어오면 현재 인터럽트 서비스 루틴을 중단하고, 새 인터럽트를 먼저 처리함.

서브루틴 호출(Subroutine Call, 함수호출)

한 블록으로 구성된 명령어(함수) 실행 중, 또 다른 블록으로 구성된 명령어(또 다른 함수)를 삽입하여 사용하는 것, 호출(CALL)과 복귀(RET) 명령어가 함께 사용

  1. CALL 명령어 : 현재 PC 내용을 스택에 저장하고, 서브루틴의 시작 주소를 분기하는 명령어
  2. RET 명령어 : CPU가 원래 실행하던 프로그램으로 복귀(return)

CALL X 명령어에 대한 마이크로 연산

  1. T0 = MBR ← PC
  2. 현재 PC 주소를 MBR에 저장
  3. T1 = MAR ← SP, PC ← X
  4. PC에는 Call 할 서브루틴 호출, MAR에는 SP 주소
  5. M[MAR] ← MBR, SP ← SP -1
  6. 기억장치의 SP 주소에 MBR(PC)를 넣고, SP는 -1 해줌.

RET 명령어의 마이크로 연산

  1. T0 = SP ← SP + 1
    스택의 POP 느낌
  2. T1 = MAR ← SP
    MAR에 SP를 넣어주는데, 이는 원래 PC 주소 정보가 담겨있음
  3. T2 = PC ← M[MAR]
    한 동작이 더 있지만 생략하자면, PC에 기존 내용을 넣어줌

단순한 실행 순서 변경 = 분기 사용

종류 / PC의 변화 발생 위치  복귀 여부
인터럽트 외부에서 발생 스택에서 return
함수 호출 프로그램 자체 발생 스택에서 return
분기 프로그램 자체발생 복귀 X