CPU에는 ALU와 제어장치 그리고 레지스터가 있다.
ALU는 계산을 담당한다.
제어장치는 명령어를 읽어들이고 해석한다.
레지스터는 임시 저장장치 역할을 한다.
ALU는 레지스터를 통해서 피연산자를 받아들이고 제어장치를 통해 제어 신호를 받아들인다. 그 다음 산순연산이나 논리 연산과 같은 다양한 연산을 수행한다.
ALU는 연산의 추가 정보를 플래그 레지터에 저장시킨다. CPU가 프로그램을 실행시킬때 부가적으로 반드시 필요한 정보이다. 예를 들어 부호 플래그가 플래그 레지스터에 0이 아닌 1로 저장이 된다면 연산결과는 음수임을 알 수 있다.
제어장치는 클럭과, 수행할 명령어, 플래그, 제어 신호를 받아 들인다. 그리고 제어장치는 CPU 내/외부로 신호를 보낼 수 있다.
프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장이 된다.
현재 상용화되고 있는 CPU는 다양한 레지스터를 사용하고 있지만, 필수적으로 알아야할 레지스터는 약 8가지가 있다.
CPU가 명령어를 실행할 때 일정한 주기로 처리한다.
인터럽트는 CPU의 작업을 방해/중단하는 신호이다.
인터럽트에는 크게 동기 인터럽트와 비동기 인터럽트가 있다.
동기 인터럽트는 CPU에 의해 발생하는 인터럽트이다. CPU가 명령어들을 수행하다가 예상하지 못한 상황에 발생시킨다. 그렇기 때문에 동기 인터럽트는 예외exception라고도 부른다.
비동기 인터럽트는 다른 하드웨어 장치가 발생시키는 인터럽트이다. 하드웨어 인터럽트라고도 린다. CPU가 아닌 다른 장치에서 발생되는 모든 인터럽트를 말한다.
하드웨어 인터럽트의 처리 순서를 알아보자면,
먼저 인터럽트 요청 신호를 CPU에가 보내고 인터럽트 플래그를 통해 현재 인터럽트를 받아 들일 수 있는지 확인 한다.
인터럽트 플래그는 활성화가 되어 있어서 인터럽트를 받을 수 있다. CPU가 중요한 작업을 한다면 인터럽트 플래그를 불가능으로 설정하여 방해받지 않도록 할 수 있다.
하지만 모든 하드웨어 인터럽트를 플래그로 막을 수 있는 것은 아니다.(예를 들어 하드웨어가 고장 났을 때는 인터럽트가 반드시 실행되어야한다.)
만약 인터럽트 요청을 받아 들인다면 인터럽트 서비스 루틴을 실행한다. 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램이다.
먼저 클럭과 코어, 스레드 개념을 학습 한 후 멀티코어와 멀티스레드에 대해서 펴본다.
CPU의 처리 속도를 나타내는 수치이다.
컴퓨터 부품들은 '클럭 신호'에 맞춰서 움직인다. 클럭 신호가 빠르면 CPU는 더 빠르게 움직이게 되므로 처리 속도가 증가하게 된다. 보통 GHz 단위로 표기된다.
코어란 명령어를 실행하는 부품 즉 우리가 전통적으로 생각하는 CPU를 말한다.
멀티코어란 여러 개의 코어를 포함하는 CPU를 말한다.
스레드는 실행 흐름의 단위라는 사전적 의미를 가지고 있다. 스레드에는 하드웨어적 스레드와 소프트웨어적 스레드가 있다.
스레드를 하드웨어적으로 정의 한다면 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미한다. 이 스레드를 하나의 코어로 에서 처리할 수 있는 CPU를 멀티스레드 CPU라고 한다.
스레드를 소프트웨어적으로 정의하면 '하나의 프로그램에서 독립적으로 실행되는 단위'를 말한다. 보통 프로그래밍 언어를 학습할 때 접하는 스레드의 정의다.
명령어 파이프라인은 동시에 여러 개의 명령어를 겹처 실행하는 기법이다. 명령어를 순차적으로 실행하는 것보다 효율적으로 처리 할 수 있다.
명령어 파이프라이닝이 성능 향상에 실패 하는 상황이 발생할 수 있는데, 이런 상황을 파이프라인 위험이라고 부르며 데이터 위험, 제어 위험, 구조적 위험이 있다.
데이터 위험은 데이터의 의존성에 의해서 발생한다. 예를 들어 A 라는 데이터는 B + C의 연산 결과라고 했을 때 다음 명령어 에서 A + C 의 연산 결과를 얻기 위해서는 첫 번째 명령어의 결과가 반드시 저장되어 있어야 한다. 무작정 명령어를 동시에 실행하려고 하면 제대로 동작하지 않는 것을 보고 데이터 위험이라고 한다.
제어 위험은 명령어 실행 결과 분기 등으로 인한 프로그램 카운터의 변화에 의해 발생한다.
구조적 위험은 명령어를 겹쳐서 실행하는 과정에서 동시에 ALU, 레지스터 등과 같은 부품을 사용하려고 할 때 발생한다.
단일 파이프라이닝이 아닌 여러개의 파이프라인을 사용하는 것이다. 이론적으로 파이프라인의 개수에 비례하여 프로그램 처리속도가 빨라지지만, 예상치 못한 문제가 발생 할 수 있기 떄문에 반드시 비례한다고 할 수 없다. 그렇기 때문에 슈퍼 스칼라는 설계하기 까다롭다.
파이프라인의 중단을 방지하기 위해서 명령어를 순차적으로 실행하지 않는 병렬기법이다. 의도적으로 순서를 바꿔 처리하는 것이다.
플래그 레지스터
: 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터프로그램 카운터
: 메모리에서 가져올 명령어의 주소를 저장하는 레지스터범용 레지스터
: 데이터와 주소를 모두 저장할 수 있는 레지스터명령어 레지스터
: 해석할 명령어를 저장하는 레지스터정답은 코어
코어란 CPU 내에서 명령어를 실행하는 부품이다.
상단에 정리되어 있습니다!
이 글은 한빛미디어의 혼공학습단 활동을 하며 적는 글입니다. 혼자 공부하는 컴퓨터 구조+운영체제 책을 참고하여 작성되었습니다.
혼공시리즈: https://hongong.hanbit.co.kr/
너무 좋은 글이네요. 공유해주셔서 감사합니다.