04-1. ALU와 제어장치
- CPU는 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 장치이다.
- CPU 내부에는 계산을 담당하는 ALU, 명령어를 읽어 들이고 해석하는 제어장치, 작은 임시 저장 장치인 레지스터가 있다.
ALU
- 1+2를 계산할 때 1, 2라는 피연산자와 ‘더하기’라는 수행할 연산이 필요하다.
- 이렇게 ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들인다.
- 연산의 결과값은 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장한다.
- CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다.
- ALU가 연산할 때마다 결과를 메모리에 저장한다면 프로그램 실행 속도를 늦출 수 있기 때문에 레지스터에 우선 저장하는 것이다.
- 계산 결과와 더불어 플래그를 내보낸다.
- 플래그는 연산 결과에 대한 추가적인 상태 정보이다. 예를 들면 음수인지 양수인지, 0인지, 오버플로우(연산 결과가 연산 결과를 담을 레지스터보다 큰 상황)가 발생했는지 등이 있다.
- 플래그는 플래그 레지스터에 저장된다.
제어장치
- 제어장치는 제어 신호를 내보내고, 명령어를 해석하는 부품이다.
- 제어 신호는 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호이다.
첫째, 제어장치는 클럭 신호를 받아들인다.
- 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다.
- 컴퓨터 부품들은 클럭이라는 박자에 맞춰 작동할 뿐 한 박자마다 작동하는 건 아니다. 명령어가 여러 클럭에 걸쳐 실행될 수 있다.
둘째, 제어장치는 ‘해석해야 할 명령어’를 받아들인다.
- CPU가 해석해야 할 명령어는 명령어 레지스터에 저장된다.
- 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
셋째, 제어장치는 플래그 레지스터 속 플래그 값을 받아들인다.
- 제어장치는 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다.
넷째, 제어장치는 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들인다.
- 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있다.
- 제어장치는 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.
- 제어장치가 내보내는 정보에는 크게 CPU 외부에 전달하는 제어 신호와 CPU 내부에 전달하는 제어 신호가 있다.
- CPU 외부에 제어 신호를 전달한다는 말은 제어 버스로 내보낸다는 말과 같다.
- 제어장치가 메모리에 저장된 값을 읽거나 새로운 값을 쓰고 싶다면 메모리로 제어 신호를 내보낸다.
- 입출력장치의 값을 읽거나 새로운 값을 쓰고 싶을 때는 입출력장치로 제어 신호를 내보낸다.
- CPU 내부에 전달하는 제어 신호에는 크게 ALU에 전달하는 제어 신호, 레지스터에 전달하는 제어 신호가 있다.
- ALU에는 수행할 연산을 지시하기 위해 내보낸다.
- 레지스터에는 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보낸다.
04-2. 레지스터
- 프로그램 카운터
- 메모리에서 읽어 들일 명령어의 주소를 저장한다.
- 명령어 포인터라고 부르는 CPU도 있다.
- 명령어 레지스터
- 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터이다.
- 제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보낸다.
- 메모리 주소 레지스터
- 메모리의 주소를 저장하는 레지스터이다.
- CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거치게 된다.
- 메모리 버퍼 레지스터
- 메모리에 주고받을 값(데이터와 명령어)를 저장하는 레지스터이다.
- 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터를 거친다.
- 범용 레지스터
- 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이다.
- 플래그 레지스터
- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터이다.
특정 레지스터를 이용한 주소 지정 방식(1): 스택 주소 지정 방식
- 스택은 한쪽 끝이 막혀있는 통과 같은 저장 공간이다. 따라서 가장 최근에 저장하는 값부터 꺼낼 수 있다.
- 스택 포인터란 스택의 꼭대기를 가리키는 레지스터이다. 즉, 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.
- 메모리 안에 스택처럼 사용할 영역이 정해져 있는데 이를 스택 영역이라고 한다.
특정 레지스터를 이용한 주소 지정 방식(2): 변위 주소 지정 방식
- 변위 주소 지정 방식이란 오퍼랜드 필디의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식이다.
- 변위 주소 지정 방식을 사용하는 명령어는 연산 코드 필드, 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드, 주소를 담고 있는 오퍼랜드 필드가 있다.
- 이때, 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.
상대 주소 지정 방식
- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식이다.
- 프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다.
- 예를 들어, 오퍼랜드가 -3이었다면 프로그램 카운터에서 얻은 명령어의 세칸 이전 번지 명령어를 실행하는 것이다.
베이스 레지스터 주소 지정 방식
- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식이다.
- 베이스 레지스터는 ‘기준 주소’, 오퍼랜드는 ‘기준 주소로부터 떨어진 거리’의 역할을 한다.
- 예를 들어, 베이스 레지스터에 200, 오퍼랜드가 40이라면 기준 주소 200번지로부터 40만큼 떨어진 240번지로 접근하라는 의미이다.
04-3. 명령어 사이클과 인터럽트
명령어 사이클
- 프로그램은 수많은 명령어로 이루어져 있고, CPU는 이 명령어들을 하나씩 실행한다. 이때 각각의 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 한다.
- 메모리에 있는 명령어를 CPU로 가지고 오는 단계를 인출 사이클이라고 한다.
- CPU로 가져온 명령어를 실행하는 단계를 실행 사이클이라고 한다. 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계이다.
- 메모리 접근이 더 필요한 경우 간접 사이클이 추가된다.
인터럽트
- CPU의 작업을 방해하는 신호를 인터럽트라고 한다.
동기 인터럽트 (예외)
- CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주쳤을 때 발생하는 인터럽트이고, 예외라고도 부른다.
비동기 인터럽트 (하드웨어 인터럽트)
- 주로 입출력장치에 의해 발생하는 알림과 같은 인터럽트이다.
- CPU는 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 이런 알림과 같은 하드웨어 인터럽트를 사용한다.
- 예를 들어, 프린터에 출력을 명령했다고 가정해보자. 입출력장치는 CPU보다 속도가 현저히 느리기 때문에 결과를 바로 받아볼 수 없다. 이때 만약 하드웨어 인터럽트를 사용하지 않는다면 CPU는 프린트가 언제 끝날지 모르기 때문에 주기적으로 프린터의 완료 여부를 확인해야 한다.
- 하지만 하드웨어 인터럽트를 이용하면 프린트 완료 인터럽트를 받을 때까지 CPU는 다른 작업을 처리할 수 있다.
하드웨어 인터럽트 처리순서
- 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
- 인터럽트는 CPU의 정상적인 실행 흐름을 끊는 것이므로 다른 누군가가 인터럽트하기 전에는 “지금 끼어들어도 되나요?” 하고 CPU에 물어봐야 하는데 이를 인터럽트 요청 신호라고 한다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트 플래그는 하드웨어 인터럽트를 받아들일지,무시할지를 결정하는 플래그이다.
- CPU가 중요한 작업을 처리해야 하거나 어떤 방해도 받지 않아야 할 때 인터럽트 플래그는 불가능으로 설정되고 인터럽트 요청을 무시한다.
- 반대로 가능으로 설정되어 있다면 CPU는 인터럽트 요청 신호를 받아들이고 인터럽트를 처리한다.
- 다만, 무시할 수 없는 인터럽트 요청도 있다. 예를 들면 정전이나 하드웨어 고장 등이 있다.
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
- 인터럽트 요청을 받기 전까지 CPU가 수행하고 있었던 일은 인터럽트 서비스 루틴이 끝나면 되돌아와서 마저 수행을 해야 한다.
- 따라서 현재 프로그램을 재개하기 위해 필요한 모든 내용을 스택에 백업한다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴은 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램으로, 인터럽트 핸들러라고도 부른다. 예를 들어, ‘마우스가 어떤 인터럽트 요청을 보냈을 때는 어떻게 작동한다.’와 같다.
- 인터럽트 벡터는 인터럽트 서비스 루틴을 식별하기 위한 정보이다. CPU는 각기 다른 인터럽트 서비스 루틴을 구분하기 위해 인터럽트 벡터를 사용한다.
- 다시 말해, CPU가 인터럽트 서비스 루틴을 실행하려면 인터럽트 서비스 루틴의 시작 주소를 알아야 하는데, 이를 인터럽트 벡터를 통해 알 수 있다.
- 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개한다.
- ALU는 레지스터로부터 피연산자를, 제어장치로부터 제어 신호를 받아들이며, 연산 결과와 플래그를 보낸다.
- 제어장치는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들이고, CPU 내부와 외부로 제어 신호를 내보낸다.
- 레지스터
- 프로그램 카운터: 메모리에서 가져올 명령어의 주소 저장
- 명령어 레지스터: 해석할 명령어 저장
- 메모리 주소 레지스터: 메모리의 주소 저장
- 메모리 버퍼 레지스터: 메모리와 주고받을 데이터를 저장
- 범용 레지스터는: 데이터와 주소를 모두 저장
- 플래그 레지스터: 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장
- 명령 사이클은 하나의 명령어가 처리되는 주기로 인출, 실행, 간접, 인터럽트 사이클로 구성되어 있다.
- 인터럽트는 CPU의 정상적인 작업을 방해하는 신호로, 예외와 하드웨어 인터럽트가 있다.
- 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 동작들로 이루어진 프로그램이다.
'혼자 공부하는 컴퓨터 구조+운영체제' 카테고리의 다른 글
6장 메모리와 캐시 메모리 (1) | 2024.06.04 |
---|---|
5장 CPU 성능 향상 기법 (0) | 2024.06.04 |
3장 명령어 (0) | 2024.05.18 |
2장 데이터 (0) | 2024.05.17 |
1장 컴퓨터 구조 시작하기 (0) | 2024.05.10 |