본문 바로가기
CS/컴퓨터구조와운영체제

CPU 내부 구성

by cariño 2023. 5. 17.
728x90
반응형

[ALU]

계산을 하는 장

 

레지스터로부터 피연산자를 받고 제어장치로 부터 제어 신호를 받아들인다.

이런식으로 계산을 하기 위해서는 피연산자와 수행할 연산이 필요하다. 

 

해당 결과값은 다시 다른 레지스터에 내보낸다. ALU가 계산한 결과를 메모리가 아닌 레지스터에 임시적으로 저장하는 이유는 CPU가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 빠르기 때문이다. 

 

임시적으로 계산한 값을 그때그때 레지스터에 담고 해당 레지스터를 바탕으로 다른 레지스터에 작업 또는 메모리에 내보내기 등을 한다.

 

 

* 플래그

flag -> 플래그 레지스터

플래그란 연산 결과에 대한 결과값이 담기는 레지스터이다. 

ex) ALU가 연산한 값이 음수일 경우 해당 flag값이 플래그 레지스터에 담기게 된다. 

 

2진수를 음수로 반환하는 방법 중 음, 양수를 표현하는 기준은 cpu내부에서 플래그 값을 갖게 되는 부분을 기억하고 있자.

 

부호 플래그: 연산한 결과의 부호를 나타낸다. 

제로 플래그: 연산 결과가 0인지 여부를 나타낸다. 

그 외 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그  

연산 결과가 결과를 담을 레지스터에 비해 너무 클 경우에는 오버플로우가 플래그 레지스터에 명시된다. 

 

 

 


 

 

[제어장치]

제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치

 

- 제어장치가  받아들이는 정보

  • 1. 클럭: 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위 클럭신호는 일정한 박자에 맞춰서 발생되는 주기이다.  클럭 단위에 맞춰서 명령어들이 실행된다. 
  • 2. 명령어 레지스터 -> 명령어 레지스터에 담긴 해석할 명령어를 받는다.  제어장치는 해당 명령어를 받아들이고 해석해서 제어신호를 내보낸다. 
  • 3. 플래그 레지스터에 있는 플래그 값도 받아들인다.  해석할 명령어를 받고 부가적인 정보는 플래그 값을 통해서 정보를 받는다. 
  • 4. 제어신호를 발생시키는 신호는 cpu만 있는 것이 아니다.  만일 외부로 부터 제어신호가 발생시키는 부분이  cpu로 전달됐다면  해당 신호는 어떤 것인지 제어장치도 받는다. 

- 제어장치가 내보내는 정보

제어신호는 cpu 내부에 전달/ 외부에 전달하는 신호로 나뉘어 진다. 

  • 제어장치가 cpu 내부에 전달할 때: 제어신호는 to.레지스터 또는 연산 지시 등은 to. ALU로 신호를 보낸다
  • cpu 외부에 전달 할 때: 메모리 또는 입출력 장치에 읽고 쓰고 테스트 등의 신호를 보낸다. 

 

 


 

 

[레지스터]

레지스터는 CPU 내부의 작은 임시 저장 장치이다.  프로그램 속 명령어 또는 데이터는 실행 전후로 레지스터에 저장이 된다.  그 레지스터에 담긴 값을 관찰할 수 있게 된다.  CPU  내부에는 다양한 레지스터가 있고 각기 다른 역할을 가진다. 

  1.  프로그램 카운터: 메모리에서 가져올 명령어 주소를 저장
  2. 명령어 레지스터: 해석할 명령어 (방금 메모리에서 읽어들인 명령어)
  3. 메모리 주소 레지스터: 메모리 주소 (CPU가 읽고 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
  4. 메모리 버퍼 레지스터: 메모리와 주고받을 값 (데이터와 명령어) / CPU가 정보를 데이터 버스로 주고 받을 때 거치는 레지스터 
  5. 플래그 레지스터: 연산 결과 또는 CPU 상태에 대한 부가적인 정보
  6. 범용 레지스터: 다양하고 일반적인 상황에서 자유롭게 사용 (주소, 명령어, 데이터 등 보통 여러개 있다.)
  7. 스택 포인터: 주소 지정에 사용
  8. 베이스 레지스터: 주소 지정에 사용

 

 

프로그램 카운터가 계속 1씩 증가하는 것은 아니다. 순차적인 흐름이 끊기는 경우에는 특정 레지스터를 이용한다.

ex). 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시 (jump, call, return, conditional jump) 인터럽트 발생 등

다음번 메모리 주소로 이동하는 것이 아닌 점프로 이동

 

 

 

* 특정 레지스터를 이용한 주소 지정 방식

 

- 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식

스택 포인터: 스택의 꼭대기를 가리키는 레지스터 (어디까지 차 있는지에 대한 표시)

ex) 스택에 4번지까지 채워져 있다면 스택 포인터는 4번지를 가리킨다. 

 

스택은 메모리 안에 있다. 

메모리 안에 스택처럼 사용할 수 있는 공간이 별도로 있다. 

 

 

- 변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻기

특정 레지스터: 1. 프로그램 카운터, 2. 베이스 레지스터 

(데이터가 저장된 기억장치의 실제주소를 유효주소라고 한다.)

제대로 실행하려면 오퍼랜드 값과 더불어 어떤 레지스터와 더할 지 명령어한테 명시를 해야한다. 

 

 

1. 프로그램 카운터: 상대 주소 지정 방식

오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소를 얻는다. 

(프로그램 카운터: cpu가 메모리로 부터 불러올 다 명령어 주소가 담긴 레지스터)

 

 

2. 베이스 레지스터: 일종의 기준 주소 역할을 한다. (프로그램의 시작점 같은 것이 담긴다.)

기준 주소로 부터 카운터 값을 계산 후 코드 실행 

 

 


 

[명령어 사이클]

★컴퓨터 내부 동작 원리를 이해하기 

cpu는 메모리에 안에 있는 프로그램을 정해진 흐름으로 처리한다. 

이 정해진 흐름을 명령어 사이클이라고 한다. 간혹 이러한 정해진 신호를 끊는 신호를 인터럽트라고 한다. 

 

 

프로그램 속 명령어들은 일정한 주기가 반복되며 실행한다. 

인출 사이클: 메모리에 있는 값을 cpu내부로 갖고 와야 실행한다. 인출하는 주기를 인출 사이클

실행 사이클: 갖고온 프로그램을 실행하는 것

간접 사이클 : cpu에 명령어를 바로 가지고 와도 실행이 불가능 한 경우 즉 몇번 더 메모리에 접근을 해야하는 경우 간접사이클을 거쳐 실행사이클로 진행된다. 

 

어떤 명령어는 인출과 실행 사이클만으로 실행되고, 어떤 명령어는 인출, 간접, 실행 사이클을 거쳐 실행된다. 

 

 

[인터럽트]

interrupt: 방해하다. 중단시키다.

- CPU가 꼭 주목해야 하는 상황에 발생한다. /CPU가 바로 처리해야 할 다른 작업이 생겼을 때 발생한다.

 

동기 인터럽트(예외) Inception: CPU가 예기치 못한 상황을 접했을 때 발생

종류: 폴트, 트랩, 중단(어보트), 소프트웨어 인터럽트

진행 중인 실행을 중단하고 예외적인 상황을 바로 처리함.

ex) 실행 할 수 없는 명령어 , 디버깅 등 

 

비동기 인터럽트(하드웨어 인터럽트): 주로 입출력장치에 의해 발생한다. 

ex) 알림과 같은 역할이다. 전자렌지가 조리가 완료되면 알림을 보냄

키보드 입력, 마우스 클릭도 다 하드웨어 인터럽트이다. 이런 신호를 CPU가 입력에 대한 정보를 받고 처리를 시킨다. 

 

왜 사용하는지?

입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해서 사용한다.

입출력장치는 CPU에 비해서 느리다. 인터럽트가 없을 경우 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 한다. 하지만 인터럽트가 있다면, 비동기로 움직이기에 CPU는 다른일을 할 수 있다. 

 

 

[하드웨어 인터럽트의 처리 순서]

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

 

인터럽트 요청 신호: 하드웨어 입출력장치가 끼어들어도 되는지에 대한 CPU에 인터럽트 요청 신호를 보냄

인터럽트 플래그 : 플래그 레지스터 안에있는 플래그의 값이다. 그 플래그 값으로 요청온 인터럽트 값을 현재 처리할 수 있는지를 판단할 수 있다.

대부분 입출력 장치의 인터럽트는 인터럽트 플래그를 통해서 막을 수 있다 다만, 모든 인터럽트를 인터럽트 플래그를 통해서 막을 수 있는 것은 아니다. 

인터럽트 플래그에는 2가지 종류가 있다. 처리가 중요한 인터럽트 등이 있는데 해당 인터럽트들은 인터럽트 플래그로 막을 수 없다. 

비동기 인터럽트는 막을 수 없는 인터럽트(non maskable interrupt)와  막을 수 있는 인터럽트(maskable interrupt)가 있다.

보통 막을 수 없는 인터럽트는 하드웨어 고장, 정전등이 있을 수 있다. 

 

 

현재 실행 중인 프로그램이 진행 중에 cpu가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴으로 이동한다. 그 후 다시 실행중인 프로그램으로 돌아가 다시 수행을 시작한다.

CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴이 실행된다.

인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 메모리 안에서 실행되는 프로그램이다. 

ex)마우스가 이러이러한 요청을보내면 이렇게 행동해라

 

 

인터럽트 벡터:  각각의 인터럽트를 구분하기 위한 정보

하드웨어로 인터럽트와 인터럽트 벡터를 통해 CPU는 각 인터럽트의 서비스 루틴의 시작점을 알 수 있다.

 

요점: 'CPU가 인터럽트를 처리한다.' 의 내용은 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 되돌아 온다. 그리고 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다. 

 

 

인터럽트 서비스 루틴이 시작됐을 때 기존에 하던 작업에 대한 내용은 스택에 모두 백업을 시키게 된다.  

스택에는 CPU에 있는 레지스터의 값들이 보관되게 된다. 인터럽트 서비스 루틴이 모두 끝나서 본래 실행하던 프로그램으로 돌아온다면 스택 영역에 보관됐던 데이터들을 복구해와 다시 시작을 하게 된다. 

 

 

 

 

 

 

 

참고: [컴퓨터 공학 기초 강의] 혼자 공부하는 컴퓨터 구조* 운영체제

 

728x90

댓글