이 글은 이해한 것을 적어놓은 것으로 정보는 '한눈에 보이는 컴퓨터 구조'에서 가져왔다.
들어가기 앞서
중앙처리장치는 컴퓨터의 모든 데이터 처리와 제어를 담당하고 있으며,이 임무를 수행하기 위하여 내부적ㅇ으로 레지스터 집합(register set), 연산기, 그리고 제어장치를 포함하고 있다.
중앙처리장치는 컴퓨터 안에서 모든 처리를 담당하기 때문에, 중앙처리장치를 프로세서(processor)라고도 부른다.
1. 중앙처리장치 구성 요소
제어장치
명령어 인출 단계에서 명령어 레지스터(IR)에 적재한 명령어를 해석하여 명령어를 실행한다.
역할은 프로그램의 흐름을 제어하는 순서 제어와 각 명령어의 실행을 제어하는 동작 제어로 구분된다.
- 순서 제어 : 제어장치는 프로그램에 나타난 명령어들이 차례대로 실행되로록 만드는 기능을 수행한다. 일반적으로 현재 처리하는 명령어가 끝나면 다음 순서의 명령어를 실행하지만, 프로그램 제어 명령어를 만나면 실행 순서가 변경되기도 한다.
- 동작 제어 : 제어장치는 각 명령어를 실행하는 기능을 수행한다. 실행 단계에서 제어장치는 각 명령어가 의도하는 동작이 수행될 수 있도록 컴퓨터 안의 다른 모든 부분(연산기, 레지스터, 기억장치, 입출력장치)을 제어한다.
순서 제어를 위하여 제어장치는 명령어 인출 단계에서 프로그램 카운터의 값을 수정하여, 명령어들이 순서대로 실행될 수 있도록 만든다.
분기 명령어를 실행할 때 : 프로그램 카운터의 값을 분기 목적지 주소로 변경
조건 분기 명령어를 처리할 때, 제어장치는 프로그램 카운터의 값을 변경할 조건이 있어야 하는데, 이 조건 정보는 상태 레지스터에 저장되어있다.
제어장치는 IR, SR, 그리고 클럭 신호를 받아 제어 신호를 생성한다.
- IR를 받아 현재 실행하고 있는 명령어를 해독하고,
- SR을 받아 PC값을 갱신할 조건을 검사하며,
- 클럭 신호를 받아 명령어 사이클을 구동하는데 필요한 타이밍 정보를 생성한다.
연산기
중앙처리장치 안에서 데이터 처리를 담당한다. 모든 데이터 처리 명령어와 관련된 데이터 조작을 담당한다.
연산기는 레지스터 또는 기억장치에서 두 개의 데이터를 가져어고, 그 결과를 레지스터 또는 기억장치로 저장한다.
제어장치는 명령어를 해독하여 연산기가 수행할 연산을 선택하는 제어 신호를 생성하여 연산기로 전달한다.
레지스터
중앙처리장치는 자신의 임무를 수행하기 위하여 현재 실행 중인 명령어의 주소, 명령어가 처리하고 있는 데이터를 저장하는 내부 기억장치를 필요로 하는데, 레지스터가 컴퓨터 내부의 기억장치 중에 액세스 속도가 가장 빠르며, 그 역할을 담당한다.
제어장치는 순서 제어와 동작 제어를 수행하는데, 이 동작을 수행하기 위하여, 중앙처리장치는 다양한 종류의 레지스터를 활용하며, 레지스터도 이에 따라 프로그램 제어를 위한 레지스터와 명령어 실행을 위한 레지스터로 구분할 수 있다.
- 제어용 레지스터 : 중앙처리장치가 프로그램을 진행시키기 위하여 사용하며, 이 그룹에 속하는 레지스터는 PC, IR, SR, 기억장치 주소 레지스터(MAR), 기억장치 버퍼 레지스터(MBR)등이 있다.
- 명령어 실행용 레지스터 : 중앙처리장치가 명령어를 처리하는 과정에서 임시로 처리할 데이터를 저장하거나 기억장치 주소를 저장할 목적으로 이 레지스터들을 사용한다. 이 그룹에 속하는 레지스터들은 데이터 레지스터와 주소 레지스터로 분류될 수 있다.
2.레지스터의 종류
레지스터는 제어용과 명령어 실행용으로으로 구분할 수 있다.
제어용 레지스터
중앙처리장치가 프로그램을 진행시키기 위하여 사용하며, 이 그룹에 속하는 레지스터는 PC, IR, SR, 기억장치 주소 레지스터(MAR), 기억장치 버퍼 레지스터(MBR)등이 있다.
기억장치는 프로그램과 데이터를 저장하고 있으므로, 인출 단계에서만 기억장치를 사용하는 것이 아니라, 명령어 실행 단계에서도 데이터를 액세스하기 위하여 기억장치를 사용한다.
따라서 중앙처리장치는 기억장치를 액세스하기위하여 내부적으로 기억장치 주소 레지스터(MAR)와 기억장치 버퍼 레지스터(MBR)를 사용한다.
- 기억장치 주소 레지스터(Memory Address Register) : 기억장치를 액세스할 주소를 저장한다. MAR의 출력이 시스템 버스의 주소 버스에 연결되어 있다.
- 기억장치 버퍼 레지스터(Memory BUffer Register) : 기억장치 읽기 동작을 할 때는 MAR이 제공하는 주소에 저장된 데이터가 일단 MBR로 들어 왔다가 다른 레지스터로 이동된다. 기억장치 쓰기 동작을 할 때는 MAR에 데이터를 기록할 기억장치 주소를 넣고 MBR에 기록할 데이터를 적재한 다음에 쓰기 제어 신호를 인가하면 해당 주소의 기억장소에 MBR이 복사되어 기록된다. MBR은 시스템 버스의 데이터 버스에 연결되어 있다.
MAR과 MBR의 존재와 PC가 주소 버스에 연결되어 있지않는다는 것을 고려했을 때, PC의 값이 직접 기억장치 주소로 인가 될 수 없다. 명령어 인출 단계는 다음과 같은 세 단계로 나누어 수행된다.
- MAR <- PC
- MBR <- Mem[MAR], PC <- PC + [명령어의 길이]
- IR <- MBR
데이터 읽기
- MAR <- 주소 레지스터
- MBR <- Mem[MAR]
- 데이터 레지스터 <- MBR
데이터 쓰기
- MAR <- 주소 레지스터
- MBR <- 데이터 레지스터
- Mem[MAR] <- MBR
상태 레지스터
제어 레지스터의 일종으로 중앙처리장치는 조건 혹은 이벤트를 검사하여 프로그램 실행 순서를 변경할지 결정하기 위하여 상태 레지스터를 참조한다.
상태 레지스터는 각 비트 별로 의미가 있으며, 플래그(flag)라고도 부른다. 플래그는 한 비트 정보이므로 참(true, 1) 또는 거짓(false, 0)의 값을 갖는다.
상태 레지스터는 연산기에서 연산 결과를 나타내는 조건 플래그(codition flags)와 그 외에 중앙처리장치를 제어하기 위한 제어 플래그(control flags)로 구성되어 있다.
프로세서 대부분이 공통적으로 갖고 있는 조건플래그는 다음과 같다.
- 부호 플래그(S, sign flag) : 산술 연산 결과의 부호 비트(sign flag)를 저장한다. 부호 비트는 2진수의 MSB(Most Significant Bit)이다. 이 비트의 값이 1이면 연산 결과가 음수이고, 0이면 연산 결과가 양수이다.
- 제로 플래그(Z, zero flag) : 산술 연산 결과가 0일 떄 1로 세트된다.
- 자리올림수(C, carry flag) : 산술 연산이 2진수 덧셈이고, 덧셈에서 자리올림수가 발행할 때 세트된다.
- 패리티 비트(P, parity bit) : 연산 결과에 대한 짝수 혹은 홀수 패리티를 정한다.
- 오버플로우(OV, overflow flag) : 정수 산술 연산을 수행한 후 결과값에 오버플로우가 발행하였는지 표시한다. 정수 연산의 결과가 연산기가 처리하는 데이터 비트 수로 표현할 수 있는 범위를 초과하면 오버플로우가 발생한다.
상태 레지스터는 연산기의 동작과 관련이 없고 시스템 전체를 제어하기 위한 플래그들도 포함한다.
- 인터럽트 가능 플래그(IE, Inerrupt enable flag) : 이 비트가 1로 세트되어 있으면 중앙처리장치가 외부 인터럽트 요청을 인실할 수 있다.이 비트의 초기값은 0이고, 시스템이 초기화된 상태에서 중앙처리장치는 인터럽트를 받아들이지 않는다. 컴퓨터가 부트(boot) 하면서 인터럽트 서비스 루틴 등 필요한 초기화를 완료한 후 이 비트를 세트하고 그 후부터 인터럽트 요청을 받아들인다.
- 운영체제 모드 플래그(SV, Supervisor mode flag) : 중앙처리장치가 운영체제(슈버바이저)모드와 사용자 모드 중의 어느 모드에서 프로그램을 실행 중인지 나타낸다.
명령어 실행용 레지스터
실행 단계에서 명령어가 의미하는 바를 실행하기 위하여, 중앙처리장치는 기억장치를 액세스하여야 하고, 레지스터의 데이터를 계산하여야 한다.이 과정에서 데이터 레지스터와 주소 레지스터가 사용된다.
데이터 레지스터 : 중앙처리장치가 처리하는 데이터를 임시로 저장한다.
주소 레지스터 : 기억장치를 액세스할 주소를 저장한다. 주소 레지스터가 가리키는 곳에서 기억장치를 액세스하기 떄문에 주소 레지스터를 포인터(pointer)라고 부르기도 한다.
주소 레지스터를 활용하는 방법은 중앙처리장치가 기억장치를 액세스하는 방법과 관련이 있다. 즉, 주소 레지스터를 이해하려면, 중앙처리장치가 기억장치를 활용하는 방법도 함께 이해하여야 한다.
중앙처리장치가 기억장치를 액세스하는 방법을 주소지정 방식이라고 하며, 자주 사용되는 주소 레지스터의 종류는 스택 포인터(stack pointer), 베이스 레지스터(base register), 그리고 인덱스 레지스터(index register)가 있다.
범용 레지스터(GPR, General Purpose Register)는 프로그래머가 임의로 데이터 레지스터 혹은 주소 레지스터 용도로 사용할 수 있는 레지스터이다.
스택 포인터
중앙처리장치는 스택에 데이터가 채워진 마지막 위치를 가리키는 레지스터인 스택 포인터(SP, Stack Pointer)를 갖고 있다.
시스템 스택은 스택 포인터를 통하여 액세스 된다.
중앙처리장치는 기억장치의 특정 영역을 스택 영역으로 지정하여 운영하는데, 그 영역을 시스템 스택(system stack)이라고 한다.
스택은 푸시(PUSH)와 팝(POP) 두가지 동작에 의하여 액세스된다.
PUSH 오퍼랜드 //오퍼랜드를 스택에 저장하라.
SP <- SP + [단어의 크기] //스택 포인터를 단어 크기만큼 증가시킨다.
Mem[SP] <- 오퍼랜드 //스택에 오퍼랜드를 저장한다.
POP 오퍼랜드 //스택에서 제거한 데이터를 오퍼랜드에 저장하라.
오퍼랜드 <- Mem[SP] //스택에서 데이터를 제거하여 오퍼랜드에 저장한다.
SP <- SP - [단어의 크기] //스택 포인터를 단어 크기만큼 감소시킨다.
베이지 레지스터
컴퓨터는 고급 언어로 작성된 프로그램의 파라미터 전달, 지역 변수(local variable) 할당, 서브루틴 호출시 반환 주소 저장 등의 목적으로 시스템 스택을 사용한다. 컴파일러는 베이스 레지스터(base register) 또는 베이스 포인터(BP, Base Pointer)를 스택의 한 기준점을 가리키는 용도로 사용한다.
인덱스 레지스터
프로그래머는 배열의 원소를 처음부터 끝까지 순차적으로 액세스하는 경우가 많은데, 배열을 순차적으로 액세스하기 위하여 인덱스 레지스터(IX, Index Register)를 사용한다.
인터럽트
인터럽트는 중앙처리장치가 컴퓨터 내부 또는 외부에서 발생할 수 있는 갑작스러운 사건에 대하여 대응하는 기능을 한다.
인터럽트 개념
인터럽트는 컴퓨터 내부에서 발생할 수도 있고 컴퓨터 외부에서 발생할 수도 있다. 내부인터럽트가 발생하면 컴퓨터는 더 이상 프로그램을 실행할 수 없다.
내부인터럽트
- 하드웨어 고장(hardware failure) : 구성 요소가 고장 날 수 있고, 혹은 데이터를 전달하는 과정에 일부의 비트가 잘못 전달될 수도 있다. 갑자기 전원이 꺼질 수도 있는데, 이러한 사건들은 프로그램의 실행과 관계가 없다.
- 실행할 수 없는 명령어(undeefined instruction) : 기억장치에서 인출한 명령어의 비트 패턴이 중앙처리장치가 실행할 수 있는 명령어로 정의되어 있지 않다면, 그 명령어를 실행할 수가 없다.
- 명령어 실행 오류(execution error) : 중앙처리장치가 인출한 명령어는 정상적이지만, 명령어를 실행할 수 없는 때도 있다. 예를 들면, 인출한 명령어가 나누기인데, 나누는 수가 0인 경우가 이에 해당한다.
- 사용 권한 위배(access privilege voilation) : 기억장치나 파일을 사용할 때 여러 가지 권한을 정의하여 사용 가능 여부를 제한하고 있다.
외부인터럽트
주로 입출력장치에 의하여 발생된다. 가장 중요한 외부 인터럽트는 타이머 인터럽트와 입출력 인터럽트이다.
- 타이머 인터럽트 : 컴퓨터안에 있는 타이머는 일정한 시간 간격으로 중앙처리장치에게 인터럽트를 요청해, 이 사건을 기반으로 시간을 측정하고, 프로세스의 실행 시간을 측정하여 프로세스를 스케줄하고, 주기적으로 수행할 작업을 실행시키는 등 아주 중요한 운영체제 작업을 수행한다.
- 입출력 인터럽트(I/O interrupt) : 속도가 느린 입출력장치가 데이터 전송 준비가 완료되었다는 것을 중앙처리장치에게 알리기 위하여 사용하는 인터럽트이다.
위 설명 중에서 프로세스란 보조 기억장치에 저장되어 있던 프로그램이 사용자의 요청에 의하여 기억장치로 읽혀 들어와 실행되고 있는 상태를 의미한다. 즉, 프로세스는 실행되고 있는 프로그램이다.
인터럽트 처리 과정
인터럽트 소스 : 인터럽트를 요청하는 하드웨어 요소
임의의 소스가 인터럽트를 요청한 떄부터 인터럽트 처리가 완료될 때까지의 처리 과정은 다음과 같다.
- 인터럽트 요청(interrupt request) : 임의의 소스가 인터럽트를 요청한다.
- 인터럽트 승인(interrupt acknowledge) : 중앙처리장치는 인터럽트 요청을 인식하고, 인터럽트소스에게 인터럽트를 확인하였음을 알려준다.
- 상태 저장(context save) : 중앙처리장치는 프로그램 실행을 중단하고 현재의 상태를 저장한다.
- 인터럽트 서비스(interrupt service) : 중앙처리장치는 인터럽트 소스가 요구한 작업을 실행한다.
- 인터럽트에서 복귀(return from interrupt) : 중앙처리장치는 원래 실행하던 프로그램으로 복귀한다.
위 4단계의 인터럽트 서비스는 중앙처리장치가 기억장치에 저장되어 있는 프로그램을 수행함으로써 이루어진다. 이 프로그램은 인터럽트 서비스 루틴(IRS, Interrupt Service Routine) 또는 인터럽트 핸들러(interrupt handler)라고 한다.
중앙처리장치가 인터럽트 요청을 인식하고 승인하기 위하여 중앙처리장치의 제어버스는 다음과 같은 두 개의 제어선을 포함하고 있다.
- 인터럽트 요청 신호(interrupt request, INTR) : 제어 입력 신호이며, 인터럽트를 요청하는 장치가 구동한다.
- 인터럽트 승인 신호(interrupt ackonwledge, INTA) : 제어 출력 신호이고, 중앙처리장치가 인터럽트 요청 장치에게 인터럽트를 인식하였음을 알려준다.
인터럽트 요청이 들어왔는지 검사하기 위하여, 중앙처리장치는 명령어사이클 안에서 인터럽트 요청 신호를 검사하여야 한다. 인터럽트를 처리하기 위하여 명령어 사이클은 인터럽트 단계(interrupt stage)를 포함하도록 수정되어야 한다.
'컴퓨터구조' 카테고리의 다른 글
컴퓨터구조_09.기억장치 (0) | 2021.12.15 |
---|---|
컴퓨터구조_08.제어장치 (0) | 2021.12.15 |
컴퓨터구조_07.중앙처리장치 설계 (0) | 2021.12.14 |
컴퓨터구조_05.연산기 (0) | 2021.10.06 |