ultra_dev
CPU의 작동 원리 본문
ALU
계산을 위해 필요한 정보들을 받아들이고 연산
(레지스터로부터 피연산자, 제어장치로부터 제어 신호를 받아들임)
+
이 결과값을
레지스터로 내보내고 (결과값을 레지스터로 내보내는 이유는 cpu가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 더 빠르니까! 임시적으로 계산 결과 그때그때 레지스터에 담고 이걸 바탕으로 메모리에 쓴다든지 하는 작업 하는 것)
또 플래그(연산 결과에 대한 부가정보 ex.연산 결과가 음수다, 양수다)로 내보낸다.
제어장치
+클럭 : 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위. 시계할 때 그 clock.
명령어 레지스터, 플래그, 제어버스들로부터 정보를 입력 받고 제어신호를 내보낸다.
레지스터(레지스터 간에 정보를 이동해라..같은 )와 ALU(수행할 연산 지시 하는 것처럼..)처럼 cpu내부에 전달하는 제어 신호와
메모리(메모리를 읽어라 같은), 입출력 장치(입출력 장치를 읽어라 같은)처럼 cpu 외부에 전달하는 제어 신호가 있다.
레지스터
- cpu 내부의 작은 임시저장장치
- 프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장된다
- 그 값을 개발자가 관찰 가능함!
cpu 종류마다 레지스터 종류는 다르지만 알아야 할 필수 레지스터는 아래와 같다
- 프로그램 카운터
: 메모리에서 가져올 명령어의 주소(메모리에서 읽어 들일 명령어의 주소)
: 다음에 메모리에 뭘 읽어들일지..
: 명령어 포인터(Instruction Pointer)라고 부르는 cpu도 있다. - 명령어 레지스터 : 해석할 명령어 (방금 메모리에서 읽어 들인 명령어)
- 메모리 주소 레지스터
: 메모리의 주소 (cpu가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
: 프로그램 카운터에 있는 주소를 메모리 주소 레지스터가 복사하고 그걸 주소 버스가 밖으로 내보내는..! - 메모리 버퍼 레지스터
: 메모리와 주고받을 값(데이터와 명령어)
: cpu가 정보를 데이터 버스로 주고 받을 때 거치는 레지스터
ex)
1000번지에 있는 것 실행할 거니 1000을 프로그램 카운터에 담고
1000을 메모리 주소 레지스터로 복사하고
1000번지 주소를 읽고 싶다고 메모리에 주소 버스 통해 쏴줌
메모리는 1000번지에 저장된 값을 메모리 버퍼 레지스터로 데이터버스 통해 전달하고
프로그램 카운터는 1 증가
이게 프로그램을 순차적으로 실행할 수 있는 원리가 됨!
그렇다고 무조건 1 증가해서 다음 번지로 가고 그런건 아님
순차적인 실행 흐름이 끊기는 경우도 존재
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행시 (JUMP,CONDITIONAL JUMP, CALL 등)
- 인터럽트 발생 시 등등..
5.플래그 레지스터 : 연산 결과 또는 cpu 상태에 대한 부가적인 정보
6.범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
7.스택 포인터
: 주소 지정에 사용 (스택의 꼭대기 가리키며..)
: 스택 주소 지정 방식 사용(스택과 스택 포인터를 이용한 주소 지정 방식)
: 스택의 꼭대기를 가리키는 레지스터(스택이 어디까지 차 있는지에 대한 표시)
: 예를 들어서 스택포인터가 4번지를 가리키고 있으면 현재 스택은 4번지까지 채워져있다는 뜻!!
8.베이스 레지스터
: 주소 지정에 사용 (기준 주소 저장하며..)
+ 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻음 .. 베이스 레지스터에 기준 주소가 담기고 거기로부터 얼만큼 떨어져있는지가 오퍼랜드 필드에 담기는 느낌!? 만약 베이스 레지스터가 200이고 오퍼랜드에 50이 담겨 있으면 기준주소 200번지로부터 50번지 떨어진 코드를 실행하라는 뜻
: 변위 주소 지정 방식
-> 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻는 방식(상대 주소 지정 방식과 베이스 레지스터 주소 지정 방식이 존재)
: 상대 주소 지정 방식
-> 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기
ex) 프로그램 카운터에 다음으로 읽을 메모리 주소가 담기고, 베이스 레지스터가 -3이라면 둘이 결합돼서 3번째 이전의 명령어를 읽어라는 뜻이됨
명령어 사이클과 인터럽트
명령어 사이클
- 프로그램 속 명령어들은 일정한 주기가 반복되며 실행
- 이 주기를 명령어 사이클이라고 한다.
- 인출 사이클 : 메모리에 저장된 값을 cpu 내부로 갖고 오는 것을 인출이라 함
- 실행 사이클 : 갖고 왔으면 실행해야겠지
인출→실행→인출→실행… 반복되면서 cpu가 실행 되는 것
- 그런데 간접 주소 지정 방식 같은 경우 cpu로 명령어 가지고 와도 바로 실행 불가능하고 간접 사이클이 추가된다(메모리 접근이 더 필요한 경우)
- 이 경우는 인출 사이클 → 간접사이클 → 실행사이클이 되는 것
- 여기에 후술할 인터럽트 사이클까지 끼면 총 4개의 사이클이 도는 것
인터럽트
- cpu가 꼭 주목해야할 때, cpu가 얼른 처리해야 할 다른 작업이 생겼을 때 발생!
- 이게 급한거니까 지금 하는거 멈추고 이거부터 해!
인터럽트는 동기 인터럽트(예외)와 비동기 인터럽트(하드웨어 인터럽트)로 구성됨
- 동기 인터럽트 (예외) : CPU가 예기치 못한 상황을 접했을 때
- 엇 이 예외적인 상황은 뭐지 이거부터 처리해야지~느낌
- 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력 장치에 의해 발생
- 문제라기 보다는 뭔가 알림 같은 느낌!
- 나 다른 일 하고 있을테니까 입출력 완료되면 불러! 이런 느낌!
- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용
- 입출력 장치의 입출력 작업은 일반적으로 cpu에 비해 느리다
- 만약 인터럽트가 없다면 cpu는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 한다.
- 인터럽트가 있기 때문에 입출력 작업 동안 Cpu는 다른 일을 할 수 있다.
하드웨어 인터럽트의 처리 순서
- 입출력 장치는 cpu에 인터럽트 요청 신호를 보낸다.
- cpu는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인한다. 인터럽트가 있었나 확인!
- cpu는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
- 인터럽트를 받아들일 수 있다면 cpu는 지금까지의 작업을 백업한다.
- cpu는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
- 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해둔 작업을 복구하여 실행을 재개한다.
인터럽트 요청 신호 : cpu의 작업을 방해하는 인터럽트에 대한 요청
인터럽트 플래그 : 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
인터럽트 벡터 : 인터럽트 서비스 루틴의 시작주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램
인터럽트 요청 신호
- 입출력장치가 지금 끼어들어도 되는지 신호 보내는 것. cpu의 정상 흐름을 끊는거니까 요청 신호를 보내는 것
- 이때 너무 중요한 인터럽트는 인터럽트 플래그를 통해 못 막고 무조건 받아들여야 하는 경우 있음(하드웨어 고장, 정전..)
인터럽트 서비스 루틴
- cpu가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴 실행
- 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리할 것인지가 적혀있는 프로그램
- 키보드가 인터럽트 요청을 보내면 이렇게 해라~
- 메모리에 저장돼있음
ex)
1,2번 명령어 처리하다 인터럽트 서비스 루틴 실행되면 해당 서비스루틴으로 가서 실행하고 다시 돌아오는 것!
cpu가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다는 뜻.
이 때, 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.
연산 하다가 프로그램 카운터가 1500이었고 메모리 버퍼 레지스터에 abc값 들어있었는데 인터럽트 서비스 루틴 실행해야하면
기존 값들을 전부 스택 영역에 저장하고 인터럽트 서비스 루틴 주소를 프로그램 카운터에 넣어서 실행함
그 뒤 다시 스택에서 불러들여서 프로그램카운터 1500, 메모리 버퍼 레지스터 abc값들 복구하는 것
+ 인터럽트 벡터 : 각각의 인터럽트를구분하기 위한 정보
- 인터럽트 서비스 루틴 A는 마우스 관련이고 B는 키보드 관련이고
- 해당 인터럽트 서비스 루틴의 시작 주소와 같은 것을 구분하기 위한 정보
'혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
메모리와 캐시 메모리 (0) | 2023.09.10 |
---|---|
cpu의 성능 향상 기법 (0) | 2023.09.09 |
명령어 (0) | 2023.08.28 |
데이터, 0과 1 (0) | 2023.08.26 |
컴퓨터 구조 (0) | 2023.08.16 |