차곡차곡 성 쌓기
article thumbnail

본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제 (강민철 저)" 책과 강의를 기반으로 작성하였습니다.


🐳 명령어 사이클

CPU는 정해진 흐름대로 명령어를 처리한다. 이러한 흐름을 명령어 사이클이라고 한다. 명령어 사이클은 2가지 동작으로 이루어진다. 인출 사이클과 실행 사이클이다. 

 

▶︎ 인출 사이클

인출 사이클은 메모리로부터 CPU로 명령어를 가져오는 과정이다. 인출 사이클의 자세한 과정은 다음과 같다.

  1. PC안에 있는 주소를 MAR(Memory Ardderss Resister)로 보낸다. CPU는 MAR가 가리키는 주소의 메모리에 접근하여 명령어를 가져온다.
  2. 가져온 명령어는 MBR(Memory Buffer Resister)을 경유해서 IR에 저장된다.
  3. 다음 명령어를 실행하기 위해 PC의 값을 1 증가시킨다.

CPU는 명령어를 가져오고 실행하고, 가져오고 실행하고를 반복한다. 때문에 명렁어를 컴퓨터를 작동시키게 하는 정보라고 하는 것이다.

 

▶︎ 실행 사이클

 실행 사이클은 인출된 IR에 들어있는 명령어를 해독하고, 필요한 연산을 수행하는 과정이다. 자세한 과정은 다음과 같다.

  1. 제어 유닛이 IR에 있는 명령어를 해석하고, op code의 명령어를 수행하기 위해 operand를 MAR로 보내어 메모리에서 데이터를 가져온다.
  2. 데이터를 MBA에 저장하고 op code에 따른 각각의 마이크로 연산을 수행한다.
  • ADD : MBR에 가져온 데이터와 AC에 있는 데이터를 더하고 더한 값을 AC에 저장한다.
  • LOAD : MBR에 있는 값을 AC에 덮어씌운다.
  • STA : 이건 앞에 설명한 버퍼에 먼저 저장이 안되어 있다. 먼저 IR에서 주소부분을 MAR로 가져와서 데이터를 저장 할 위치를 기억한다. 그리고 AC에 있는 값을 버퍼에 가져와 제어버스를 거쳐 기억장치에서 위에서 기억한 위치에 데이터를 덮어 씌운다.
  • JUMP : IR에 있는 주소를 PC에 덮어 씌운다.

 

▶︎ 간접 사이클

하지만 바로 실행하는 것이 불가능할 때가 있다. operand에 처리해야할 데이터가 아닌 유효주소가 있어 메모리 접근이 필요할 때이다. 메모리 접근이 필요하기 때문에 명령을 처리하기 위해 시간이 필요하다. 이때 도입된 개념이 바로 간접 사이클이다. 

 

간접 사이클은 실행 사이클 전에 일어난다. operand에 유효 주소 또는 유효 주소의 주소가 있기 때문에 해당 주소를 MAR로 가져와 메모리에서 명령어나 데이터를 가져와 MBR을 거쳐 IR의 operand에 넣어준다.

 

 

▶︎ 인터럽트

앞선 3가지 사이클로도 평탄하게 컴퓨터가 잘 돌아갈 것이다. 하지만 예기치 못한 순간들은 반드시 찾아온다. 이러한 상황을 처리하기 위해 인터럽트가 있다. 인터럽트는 앞전의 사이클을 중단하고 예외적인 상황을 처리한다. 그러므로 발생시기는 CPU가 급하게 처리해야 될 일이 생겼을 때이다. 인터럽트의 종류로는 동기 인터럽트비동기 인터럽트가 있다.

 

▶︎  동기 인터럽트 (예외)

CPU가 예기치 못한 상황에 접했을 때 발생한다. 예를 들어 디버깅, 0으로 나누기, 실행할 수 없는 메모리 참조 상황 때 발생하며, 소프트웨어적 인텁럽트이다.

 

▶︎  비동기 인터럽트

하드웨어 인터럽트라고도 하며 주로 입출력 장치에 의해 발생한다. 앞선 예외적인 상황을 처리하는 동기 인터럽트와 다르게 문제 상황이 아닌 알림과 같은 역할을 한다. 

 

입출력 장치들의 읽기 쓰기 시간은 CPU가 명령어를 수행하는 시간보다 훨씬 오래 걸린다. 때문에 마냥 기다려 줄 수가 없기 때문에 수행이 완료되면 CPU에게 알림 신호를 보내도록 한 것이다. CPU는 언제 끝나는지 매번 확인할 필요가 없고, 인터럽트(알림)이 오면 처리하면 된다.

 

하드웨어 인터럽트의 자세한 과정에 대해 알아보자.

  1. 입출력 장치가 CPU에게 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그(플래그 레지스터)를 통해 현재 인터럽트를 받아들일 수 있는지 확인한다.
  4. 인터럽트는 받아들일 수 있다면 CPU는 레지스터에 저장되어있는 정보들을 스택 영역에 백업한다.
  5. CPU는 인터럽트 벡터 테이블 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
  6. 인터럽트 서비스 루틴이 끝나면 4에서 백업해둔 작업을 복구하여 실행을 재개한다.

 

인터럽트 서비스 루틴 : 인터럽트가 발생했을 때 해당 인터럽트르 처리하는 프로그램. 디바이스 드라이브나 커널 코드에 들어있다.

인터럽트 벡터 : 인터럽트 서비스 루틴의 식별번호. x86 인텔 CPU들은 256개 재공

인터럽트 벡터 테이블 : 256개의 인터럽트에 대해 인터럽트 서비스 루틴(ISR)의 주소를 저장하고 있는 테이블

 


Reference

https://uzinlab.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F#

 

Tistory

좀 아는 블로거들의 유용한 이야기

www.tistory.com

 

728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!