CPU
컴퓨터 구조 중에서 가장 중요한 부품인 CPU는 중요한 개념이 많다.
CPU의 구성 요소
대표적인 구성 요소 3가지를 확인 해보고 그 중 레지스터를 더 자세히 공부하였다.
- ALU(산술논리연산장치)
- 계산을 담당하는 회로이다. 즉 계산만을 위해 존재.
- 더하기, 빼기(2의보수로 더하기 처리), 곱셈, 오버플로우 검출 등
- 제어 장치
- 명령어를 해석하고 제어 신호를 내보내는 장치
- 물론 다른 장치도 제어 신호를 내보낼 수 있다.
- 레지스터들
- 명령어 처리 전후로 값을 임시 저장하는 장치, 여러개가 존재한다.
- 특수한 목적으로 있는 레지스터도 있다.
개발자 입장에서 여기서 가장 중요한 장치는 무엇일까?
특별한 직군을 제외하고 레지스터 이외의 장치를 다룰 필요가 없다.
그런데 레지스터는 보안, 로우 레벨에서 개발하는 개발자들은 레지스터를 많이 다룬다.
레지스터에 어떤 값이 담기는 지를 관찰하면 명령어 처리 전후의 과정을 엿볼수있다.
그렇기 때문에 레지스터가 제일 중요하다.
CPU마다 레지스터의 이름, 개수, 용량, 동장방식이 달라질 수 있다.
공통적으로 수행하는 것을 확인해보자.
ALU
- 계산기 회로
- 레지스터로부터 피연산자(연산의 대상)을 받아 들인다.
- 제어장치로부터 제어 신호(연산할 작업)을 받아 들인다.
- 연산의 결과값을 레지스터, 플래그 레지스터에 저장한다.
- 연산 결과에 대한 부가정보가 있을 수 있다, 결과값이 레지스터보다 커지는 경우(오버플로우가발생), 아니면 연산 결과가 음수인지 양수인지 알아야할 때 부가정보를 플래그 레지스터에 저장한다.
플래그 레지스터
- 연산의 결과에 대한 부가 정보
- CPU마다 생김새가 다를 수 있다.
- 공통적으로 아래 이미지에 있는 플래그들이 사용된다.
- 부호 플래그
- 연산한 결과의 부호를 나타낸다.
- 1로 설정되어 있으면 연산결과가 음수이다. 설정이 없으면 양수다
- 제로 플래그
- 연산 결과가 0인지 여부를 나타낸다.
- 캐리 플래그
- 연산 결과 올림수나 발생했는지 여부를 나타낸다.
- 99 + 2 = 101 올림수가 발생, 21-17 빌림수 발생 등
- 오버플로우 플래그
- 오버플로우가 발생했는지 여부를 나타낸다.
- 인터럽트 플래그
- 인터럽트가 가능한지 여부를 나타낸다.
- 인터럽트는 CPU의 정상 적인 실행흐름을 멈추는 신호
- 인터럽트가 발생하면 CPU는 지금 실행중인 작업을 백엎하고 급한일을 처리 후 다시 재개한다.
- 슈퍼바이저 플래그
- 커널 모드로 실행중인지, 사용자 모드로 실행 중인지를 나타낸다.
- 위에 내용은 운영체제와 관련된 내용이다.
- 운영체제중 가장 중요한 부분이 커널이라고 한다.
- 명령어 중 커널모드로 실행할 수 있는데 보안, 다른 프로세서에게 영향을 미치는 명령이나 하드웨어를 직접 조작해야하는 예민한 명령어는 커널모들로만 실행을 해야 작업을 수행한다.
플래그 레지스터 중 부호 플래그 1이면 연산결과는 음수 결과다.
제로 플래그가 1이면 연산결과는 0이다.
제어장치
- 제어 신호를 내보내고 명령어를 해석하는 장치
- 부가정보를 참고해야 명령어를 해석하기 때문에 먼저 플래그 레지스터 값을 받고 그 뒤 해석할 명령어가 저장되어 있는 명령어 레지스터를 확인한다.
- CPU 외/내부에도 제어신호를 전달할 수 있다. 제어신호는 시스템 버스에 전달이 된다. ALU한테 제어신호를 보내면 수행할연산, 레지스터한테 제어신호를 보내면 레지스터간의 연산, 레지스터끼리 데이터 이동 등 제어신호를 보냄.
- 시스템 버스
- 4가지 핵심부품 정보 전달 통로
- 데이터 버스
- 주소 버스
- 제어 버스
클럭 신호
- 부품을 일사분란하게 움직일 수 있게 하는 시간 단위
- 참고로 클럭 신호는 일정한 반복이 아니다.
- 부품이 움직이는 박자
- 클럭 신호가 빠르게 반복된다면, 부품들을 박자에 따라 빠르게 수행
- 클럭 신호가 느리게 반복된다면, 느리게 수행
레지스터
- 프로그램의 실행 전후로 값을 임시 저장하는 작은 저장 장치
- 레지스터에 어떤 값이 저장되는지 관찰해도 프로그램의 가장 저수준의 실행 흐름을 볼 수 있다.
- CPU마다 레지스터의 이름 크기 종류가 다양하다.
- 디버거를 통해 레지스터를 관찰할 수 있다.
- 프로그램 카운터(정말 중요)
- 다음으로 메모리에서 가져올 명령어 주소 (메모리에서 읽어들일 주소)
- 운영체제에서도 중요한 개념
- 프로그램 카운터는 특별할 일이 없는한 1씩 증가되면서 1씩 증가되며 메모리의 프로그램이 순차적으로 증가된다.
- 특별한 경우란, JUMP 200 명령어(분기문), 인터럽트 발생 등
- 사실 특별한 경우는 빈번하게 발생됨.
- 명령어 레지스터
- 해석할 명령어(메모리에서 읽어드린 주소를 저장), 제어장치가 명령어 해석
- 메모리 주소 레지스터
- 메모리 주소(읽어들일 주소 값)
- 메모리 버퍼 레지스터
- 메모리와 주고 받을 명령어와 데이터가 저장됨. (데이터 버스로 주고받음)
- 플래그 레지스터
- 연산 결과에 대한 부가 정보 저장
- 범용 레지스터
- 범용적으로 사용 가능한 레지스터(여러 개 있음)
- 대용량 계산이 있을 때 범용 레지스터 사용
- 스택 포인터
- 스택 주소 지정방식에 사용되는 스택의 꼭대기를 가리키는 레지스터
- 베이스 레지스터
- 변위 주소 지정 방식에서 사용되는 떨어진 거리를 가리키는 레지스터
- 오퍼랜드 필드의 값을 변위 삼아, 특정 레지스터 값을 더해 유효 주소를 얻는 주소 지정 방식
- 상대 주소 지정 방식
- 오퍼랜드안의 값 + 프로그램 카운터 == 유효 주소
- 다음 실행할 명령어와 3번 이전에 떨어진 명령어를 실행해라.
- 베이스 레지스터 주소 지정 방식
- 오퍼랜드 + 베이스 레진스터(기준주소) == 유효 주소
- 기준 주소로 부터 어느정도 떨어진 주소를 실행해라
- 200에서 50이 떨어진 주소 실행 250번지 주소 실행
명령어 사이클과 인터럽트
CPU가 메모리에 있는 명령어를 갖고와서 실행할 때에는 일정한 주기를 반복하며 실행한다.
일정한 주기를 명령어 사이클 이라고 한다. 클럭 신호에 맞춰 명령어를 인출하고 실행하고 한다.
이 흐름을 멈추는 것이 인터럽트이다.
명령어 사이클
- CPU가 명령어를 순차적으로 처리하는 양상
- 메모리에서 명령어를 가져오고 (fetch)
- 가져온 명령어를 실행하고 (execute)
- 메모리에서 명령어를 가져오고 (인출)
- 가져온 명령어를 실행하고 (실행)
- CPU는 인출 사이클과 실행사이클을 반복하며 실행한다.
- 메모리에 있는 명령어를 인출하면 바로 실행이 된다? 아니다 간접 주소 지정 방식을보자.
- 실제 연산에 사용될 데이터를 얻기 위해 한 번 더 메모리에 접근해야 할 경우가 있다.
- 명령어를 인출해도 곧 바로 실행이 아니라 메모리에 접근을 해야한다.
- 그래서 메모리 접근이 더 필요할 경우, 간접 사이클이 필요하다.
인터럽트 사이클
- interrupt: 방해하다, 중단시키다
- CPU의 정상적인 실행흐름을 방해하는 신호.
- Exception도 인터럽트의 일종
- Fault도 인터럽트의 일종
- 동기 인터럽트
- Exception 예외
- 주로 CPU에 의해 발생
- 명령어 처리 도중 비정상적인 상황을 마주했을 경우 발생, 0을 나누려고 한다 등 예외 상황
- 디버깅할때 BreakPoint를 찍을때도 인터럽트의 일종
- Exception 예외
- 비동기 인터럽트
- 주로 하드웨어의해 발생하기 때문에 인터럽트
- 하드웨어 인터럽트
- 주로 입출력장치에 의해 발생
- 세탁기 완료 알림, 전자레인지 조리 완료 알림과 같은 알림 역할 수행
- CPU가 프린터기한테 입출력 작업을 요청 ⇒ CPU는 프린터기가 완료했는 지 주기적으로 확인해야함.(polling), 불필요한 CPU 사이클이 낭비가 될 수 있음. ⇒ 완료 알림을 받기 전까지 오로지 내 할일에 집중하겠다.
- 입출력장치에게 입출력 작업을 맡겨 두면, CPU는 인터럽트를 받을 때까지는 다른 업무 수행 가능
하드웨어 인터럽트 처리 순서(매우 중요)
- 입출력장치는 CPU에게 인터럽트 요청 신호를 보냄
- 예를 들어, 입출력 작업이 완료되었습니다. 요청 보냄, 인터럽트 가능해?
- CPU는 실행 사이클 이후 인출 전 인터럽트 여부 확인
- 실행하던 작업을 끝내고 인터럽트를 확인
- CPU는 인터럽트 요청 확인 후, 인터럽트 플래그를 통해 인터럽트 수용 여부 확인
- 인터럽트 플래그(지금내가 인터럽트를 처리할 수 있는지 없는지 여부를 확인)를 통해 수용여부확인
- 인터럽트가 가능하다면 지금까지의 작업 백업
- 지금까지의 작업을 백엎을 메모리내에 스택에 하게 됨.
- 프로그램 카운터 값이 대표적
- 인터럽트 벡터를 참고하여 인터럽트 서비스 루틴(인터럽트 핸들러 실행)
- 인터럽트 서비스 루틴 해당 인터럽트를 처리하기 위한 특별한 프로그램, 하드웨어 상에 문제가 발생했을때 이렇게 처리 해주세요. 등 즉, 인터럽트가 발생한 다양한 상황에 대해서 어떻게 처리해야할지 명시가 되어 있는 프로그램, 핸들러
- 인터럽트 백터 어떤 인터럽트가 발생했는지에 따라 인터럽트 서비스 루틴의 시작 주소가 달라질 수 있다. 인터럽트의 종류를 식별해줄 수 있는 정보이다. 인터럽트 백터를 통해 CPU는 인터럽트 서비스 루틴의 시작 주소를 알게 되어 그 주소로 점프하고 인터럽트를 실행하게 됨.
- 인터럽트 서비스 루틴(프로그램) 실행 후 백업한 작업 복구, 실행 재개
- 스택에 백엎한 프로그램을 가져와 다음으로 실행할 메모지 주소를 확인.
결과적으로 인터럽트가 발생하면, 현재 작업을 백엎하고 인터럽트 서비스 루틴 실행하고 백엎한 작업을 다시실행.
결론
CPU의 핵심 3가지 구성요소인 ALU, 제어장치, 레지스터를 알아봤다.
각각 어떠한 역할을 담당하고 수행하는지 알아보고 시스템 버스를 통해 서로 어떤 작업을 주고 받는지 공부해봤다.
간단하게 정리를 해보자면 명령을 수행할때 플래그 레지스터에 있는 값들을 확인해보고 클럭 신호에 맞춰 제어장치가 제어 신호를 내보내고 명령어를 해석한다. 이 때 명령어가 저장되어 있는 명령어 레지스터를 확인해보고 명령에 따라 레지스터에 제어신호를 보내기도 하고 계산이 필요하면 ALU에 전달하고 메모리에도 전달하고 입출력장치에도 제어신호를 전달할 수 있다.
'Computer Science > Computer Architecture' 카테고리의 다른 글
[Computer Science] [컴퓨터구조] CPU(2) (0) | 2024.12.16 |
---|---|
[Computer Science] [컴퓨터 구조] 데이터 (1) | 2024.12.13 |
[Computer Science] [컴퓨터구조] 명령어 (4) | 2024.12.12 |