👩‍💻 알고리즘/🎛️ 컴퓨터 구조 & OS

[혼공학습단 12기] 4장, CPU 원리

오브 🧙‍♂️ 2024. 7. 20. 17:51

" ALU " 

ALU ( 출처 : 위키백과 )

 

ALU는 무엇을 하나?

 

1. 레지스터를 통해 피연산자를 받아들이고,

제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들인다. 

 

2. 연산을 수행한 결괏값을 일시적으로 레지스터에 저장한다. (결과 형태 : 특정 숫자, 문자, 메모리주소)

WHY?

메모리 접근 속도가 레지스터 접근 속도보다 훨씬 느리므로

연산할 때마다 메모리에 저장하면 프로그램 실행 속도가 느려질 수 있기 때문

 

3. 계산 결과와 플래그를 같이 내보낸다. 

플래그는 플래그 레지스터에 저장된다.

( 플래그 : 연산 결과에 대한 추가적인 정보)

[ 플래그 종류 ]

부호 플래그 연산 결과 부호 1이면 음수 / 0이면 양수
제로 플래그 연산 결과가 0인가? 1이면 0 / 0이면 0아님
캐리 플래그 올림수나 빌림수가 발생했는가? 1이면 올림수,빌림수 발생 / 0이면 발생X
오버플로우 플래그 오버플로우가 발생했는가? 1이면 오버플로우 발생 / 0이면 발생X
인터럽트 플래그 인터럽트가 가능한가? 1이면 인터럽트 가능 / 0이면 불가능
슈퍼바이저 플래그 커널 모드로 실행중인가 / 사용자 모드로 실행중인가? 1이면 커널 모드 / 0이면 사용자 모드

 

" 제어 장치 "

제어 장치는 무엇을 하나?

제어 신호를 내보내고, 명령어를 해석한다.

 

1. 클럭 신호를 받아들인다.

클럭 ( 출처 : 위키백과 )

 

컴퓨터의 모든 부품이 맞춰 움직이는 시간 단위

주의

- 클럭이라는 박자에 맞춰 작동할 뿐, 한 박자마다 작동하는 게 아님.

- 하나의 명령어가 여러 클럭에 걸쳐 실행될 수 있음.

 

2. 해석해야 할 명령어를 받아들인다.

CPU가 해석해야 할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장되는데, 

제어장치는 명령어를 받아 해석한 뒤, 제어신호를 발생시켜 컴퓨터 부품에 수행해야 할 내용을 전달한다.

 

3. 플래그 레지스터 속 플래그 값을 받아들인다.

플래그 값을 받아 이를 참고하여 제어 신호를 발생시킨다.

 

4. 시스템 버스, 그중에서 제어 버스로 전달된 제어 신호를 받아들인다.

 

" 레지스터 "

1. 프로그램 카운터

메모리에서 가져올 명령어의 주소를 저장한다.

 

2. 명령어 레지스터

메모리에서 읽어 들일 해석할 명령어를 저장한다.

 

3. 메모리 주소 레지스터

- 메모리 주소를 저장한다. 

- CPU가 읽어들이고자 하는 주소 값을 버스로 보낼 때, 메모리 주소 레지스터를 거치게 된다.

 

4. 메모리 버퍼 레지스터

- 메모리와 주고받을 데이터와 명령어를 저장한다.

- 메모리에  쓰고싶은 값이나 메모리로부터 전달받은 값은 이 레지스터를 거치게 된다.

 

5. 범용 레지스터

- 데이터와 주소를 모두 저장할 수 있다.

- 일반적으로 CPU 안에는 여러 개의 범용 레지스터가 있다.

 

6. 플래그 레지스터

- ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장한다.

- 연산 결과나 CPU 상태에 대한 부가적인 정보를 저장한다.

 

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

 

1. 스택 주소 지정 방식

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

- 스택 포인터는 스택의 꼭대기를 가리키는 레지스터로,

스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터

 

2. 변위 주소 지정 방식

연산 코드와 오퍼랜드로 이루어진 명령어에서

오퍼랜드 필드 값과 특정 레지스터 값을 더하여 유효주소를 얻어내는 주소 지정 방식

 

2-1. 상대 주소 지정 방식

- 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

- IF문과 유사하게 모든 코드를 실행하는 것이 아니라 분기하여 특정 주소의 코드를 실행할 때 사용

 

2-2. 베이스 레지스터 주소 지정 방식

- 오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식

- 기준 주소 -> 베이스 레지스터  / 기존 주소로부터 떨어진 거리 -> 오퍼랜드

125p 2번
플래그 레지스터 : 연산 결과 또는 cpu 상태에 대한 부가 정보를 저장하는 레지스터
프로그램 레지스터 : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터
명령어 레지스터 : 해석할 명령어를 저장하는 레지스터 

 

" 명령어 사이클 "

하나의 명령어를 처리하는 정형화된 흐름

프로그램의 명령어들은 일정한 주기를 가지고 실행됨

 

1. 인출 사이클

메모리에 있는 명령어를 CPU로 가져오는 단계

 

2. 실행 사이클

- CPU로 가져온 명령어를 실행하는 단계

- 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계

 

3. 간접 사이클

-간접 주소 지정 방식은 오퍼랜드 필드에 유효 주소를 명시한다.

이 경우, 명령어를 실행하기 위해서 메모리 접근을 한 번 더 해야 한다.

이런 경우 간접 사이클이 추가된다. 

" 인터럽트 "

CPU의 작업을 방해하는 신호

EX. ) 이게 더 급하니까 지금 하는 거 멈추고 이것부터 처리해 줘!

 

1. 동기 인터럽트 (=예외)

- CPU에 의해 발생되는 인터럽트

- CPU가 실행하는 프로그래밍상의 오류와 같은 예외적인 상황에 마주쳤을 때 발생하는 인터럽트

 

2. 비동기 인터럽트 (=하드웨어 인터럽트)

- 입출력장치에 의해 발생하는 인터럽트 

- 알림 역할 ( EX. 세탁기 완료 알림, 전자레인지 조리 완료 알림 )

 

이를 사용하지 않으면, CPU는 입출력장치가 언제 작업을 마칠지 모르기 때문에 주기적으로 완료 여부를 확인해야 하고,

다른 생산적인 일을 할 수 없으니 CPU는 사이클을 낭비하게 된다.

 

처리순서

1. 입출력 장치가 CPU에 인터럽트 요청

 

2. CPU는 실행 사이클을 끝내고 명령어를 인출하기 전 인터럽트 여부를 확인

 

3. CPU는 인터럽트 요청을 확인하고, 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 확인

- 인터럽트 플래그가 활성화되어 있어야 인터럽트 요청을 수용 가능

- 하드웨어 인터럽트를 받아들일지, 무시할지 결정

- CPU가 중요한 작업을 처리하거나, 어떤 방해도 받지 않아야 하면 => 플래그 불가능으로 설정

=> 인터럽트 요청 와도 무시 

- 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 없다. 무시할 수 없는 인터럽트는 

반드시 가장 먼저 처리해야 하는 인터럽트가 된다. ( EX.) 정전, 하드웨어 고장 )

 

4. 인터럽트 받아들일 수 있으면, CPU가 지금까지 한 작업 백업

 

5. CPU는 인터럽트 벡터를 참고하여 인터럽트 서비스 루틴을 실행

인터럽트를 처리하기 위한 프로그램 ( = 인터럽트 핸들러 )

( EX.) 키보드가 어떤 인터럽트 요청을 보냈을 때는 ~~ 게 작동한다. ) 

 

5. 인터럽트 서비스 루틴 끝내면, 백업해 둔 작업 복구해 실행 재개

 

 " 인터럽트 벡터 "

각기 다른 인터럽트 서비스 루틴을 구분하기 위해 이용한다.

인터럽트 서비스 루틴을 식별하기 위한 정보

 

인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.

=> CPU는 인터럽트 벡터를 통해 특정 인터럽트의 서비스 루틴을 처음부터 실행할 수 있다.