본문 바로가기

computer science

[#혼공] 혼자 공부하는 컴퓨터 구조+운영체제 [Chapter.04]

  들어가기에 앞서, 첫번째 챕터에서 아래 그림은 [혼공 컴퓨터구조 + 운영체제]의 1장에서 다뤘습니다. 바로, 컴퓨터 구조의 큰 그림입니다. 이 그림을 크게 두고 순서대로 하나씩 배워가고 있습니다. 앞의 두 · 세번째 챕터에서는 [컴퓨터가 이해하는 정보]의 [데이터], [명령어] 부분을 다뤘습니다. 이제는 컴퓨터의 네 가지 핵심 부품을 다룰 순서이고, 이번 페이지에서는 CPU의 작동 원리에 대해서 자세히 다뤄볼 예정입니다.

 

  CPU라는 말은 참으로 익숙합니다... 현재 회사에서 제공 받은 맥북은 10-core CPU 입니다. 그리고, 제가 구매한 개인 맥북은 8-core CPU이네요. 그리고, AWS 환경에서 코드를 실행할 때, vCPU라는 용어도 들립니다. 하지만, 각각의 CPU라는 의미가 어떤 느낌인지는 사실 정확히는 모르고 있었습니다. 이번 챕터를 정독한다면, CPU라는 단어를 조금은 더 잘 이해하고 사용할 수 있게 될겁니다. 그럼 한번 CPU를 자세히 들여다보시죠 :)

(다음 페이지에서는 CPU 성능 향상 기법을 다룹니다.) 

 

 

https://dsms27.tistory.com/118

 

 

[01-2] 복습

 

 

 

[04-1] ALU와 제어장치

 

 

 

ALU

 

  ALU는 계산하는 부품입니다. 예를 들어, "1 + 2" 계산을 하기 위해서는 1과 2라는 피연산자와 +라는 수행할 연산이 필요합니다. 피연산자는 레지스터로부터 받아오고, 연산은 제어장치로부터 받아오게 됩니다. 그리고 결과 값도 메모리에 저장하기 전에 일시적으로 레지스터에 저장하게 됩니다. CPU가 메모리에 너무 자주 접근하게 되면 프로그램 실행 속도가 늦어지기 때문입니다. ALU는 계산 결과 말고도, 플래그플래그 레지스터에 내보냅니다. 플래그란 연산 결과에 대한 추가적인 상태 정보를 뜻합니다. 

 

 

플래그 종류 의미 사용 예시
부호 플래그 연산한 결과의 부호 1일 경우 음수
0일 경우 양수
제로 플래그 연산 결과가 0인지 여부 1일 경우 0
0일 경우 0이 아님
캐리 플래그 연산 결과 올림수나
빌림수가 발생했는지
1일 경우 올림수 or 빌림수 발생
0일 경우 발생 x
오버플로우 플래그 오버플로우가 발생했는지
*오버플로우 : 연산 결과 > 레지스터 크기
1일 경우 오버플로우 발생
0일 경우 오버플로우 x
인터럽트 플래그 인터럽트가 가능한지
(04-3에서 다룰 예정)
1일 경우 인터럽트 가능
0일 경우 불가능
슈퍼바이저 플래그 커널 모드가 실행중인지,
사용자모드로 실행중인지 (9장에서 다룰 예정)
1일 경우 커널 모드 실행
0일 경우 사용자 모드 실행

 

 

 

 

제어장치

 

  제어 장치는 제어 신호를 내보내고 명령어를 해석하는 부품입니다. 참고로 제어 장치는 CPU 구성 요소중 가장 정교하게 설계된 부품입니다. 제어 장치의 역할이 무엇인지 정도만 이해해도 좋을 것 같습니다. 

 

 

(1) 아래는 제어 장치가 받아들이는 정보에 대한 내용입니다.

 

첫째, 제어 장치는 클럭 신호를 받아들입니다. 

둘째, 제어 장치는 '해석해야 할 명령어'를 받아들입니다.

셋째, 제어 장치는 플래그 레지스터 속 플래그 값을 받아들이비다.

넷째, 제어 장치는 시스템 버스, 그 중에서 제어 버스로 전달된 제어 신호를 받아드립니다.

 

(2) 아래는 제어 장치가 내보내는 정보에 대한 내용입니다.

 

크게 2가지로 나눠집니다.

첫째, CPU 외부 : 제어 버스로 제어 신호를 내보냅니다. 메모리에 전달하는 제어 신호와 입출력장치에 전달하는 제어 신호가 있습니다.

둘째, CPU 내부 : ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있습니다. 

 

 

 

 

[04-2] 레지스터

 

 

  프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장됩니다. 따라서 레지스터에 저장된 값만 잘 관찰해도 프로그램의 실행 흐름을 파악할 수 있습니다. CPU에는 다양한 레지스터가 있고 그 역할도 다양합니다. 아래는 레지스터의 종류입니다.

 

 

(1) 프로그램 카운터

 

메모리에서 가져올 명령어의 주소입니다. 명령어 포인터라고도 부릅니다.

 

(2) 명령어 레지스터

 

해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터입니다. 

 

(3) 메모리 주소 레지스터

 

메모리의 주소를 저장하는 레지스터입니다. CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리 주소 레지스터를 거칩니다.

 

(4) 메모리 버퍼 레지스터

 

메모리와 주고 받을 값을 저장하는 레지스터입니다. 즉, 메모리에 쓰고 싶은 값이나 메모리부터 전달받은 값은 메모리 버퍼 레지스터를 거칩니다. CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거칩니다. 

 

(5) 플래그 레지스터

 

ALU 연산 결과에 따른 플래그를 플래그 레지스터에 저장합니다. 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 다룹니다.

 

(6) 범용 레지스터 

 

다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터입니다. 데이터와 주소 모두 저장할 수 있습니다. 

 

(7) 스택 포인터

 

스택의 꼭대기를 가리키는 레지스터입니다. 

 

(8) 베이스 레지스터 

 

'기준 주소', 오퍼랜드는 '기준 주소로부터 떨어진 거리'로서의 역할을 합니다. 

 

 

다만, 책의 [좀 더 알아보기]에서 저자가 말하길, 레지스터 이름이 제조사마다 다르고 역할도 조금씩 다른 경우가 많다고 합니다. CPU의 전문성을 높이고 싶다면, 상용화된 CPU 속 레지스터를 들여다 볼 필요가 있다고 조언합니다. 아래 링크에서 레지스터 관련 공부를 할 수 있습니다. :) 

https://github.com/kangtegong/self-learning-cs/blob/main/registers/registers.md#%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8-arm-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0

 

 

 

 

 

[04-3] 명령어 사이클과 인터럽트

 

 

 

명령어 사이클

 

  CPU가 하나의 명령어를 처리하는 과정에는 어떤 정해진 흐름이 있습니다. 그리고 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 합니다. 

 

(1) 인출 사이클 

명령어를 메모리에서 CPU로 가져오는 사이클 

 

(2) 실행 사이클

CPU로 명령어를 인출했다면 명령어를 실행하는 사이클

 

(3) 간접 사이클

유효 주소의 주소를 가지고 메모리에 한번 더 접근

 

 

 

 

인터럽트

 

  말 그대로, interrupt "방해한다" 또는 "중단한다"는 뜻입니다. 회사에서 업무를 하던 중 상사의 요청으로 하던 업무를 중단할 때가 있습니다. 마찬가지로, CPU에서도 우선순위의 작업이 발생한 경우, 현재 작업을 중단하게 되기도 합니다. 그리고 이러한 인터럽트의 종류는 2가지가 있습니다. 

 

 

동기 인터럽트 비동기 인터럽트
   
CPU에 의해 발생하는 인터럽트입니다. 예를 들면, 프로그래밍 상의 오류가 있을 때 발생하는 인터럽트입니다. "예외"적인 상황에 발생하기 때문에, "예외"라고도 부릅니다. 
   

주로 입출력장치에 의해 발생하는 인터럽트입니다. 전자레인지 완료 알림과 같은 알림 역할을 합니다. 

CPU가 프린터와 같은 입출력장치에 입출력 작업을 부탁하면, 작업을 끝낸 입출력장치가 CPU 완료 알림을 보냅니다.

하드웨어 인터럽트가 부를 수도 있습니다. 

예를 들면, CPU가 프린터에 출력을 명령했을 때, 입출력 장치는 CPU보다 속도가 현저히 느리기 때문에, CPU는 입출력 작업의 결과를 바로 받아볼 수 없습니다. 이때 하드웨어 인터럽트가 없다면, CPU가 주기적으로 프린터의 완료 여부를 확인해야 하고 그렇다면 다른 생산적인 일을 못해서 사이클이 낭비됩니다. 전자렌지 알람이 없어서 완료될 때까지 기다리는 것과 같은 이치가 됩니다. 

 

 

삐빅! 4-1 플래그 부분에서 살짝 다뤘던 내용입니다.

 

 

 

 

 

예외

 

 

 

폴트 : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외입니다. 

 

트랩 : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외입니다.

 

중단 : CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없을 때의 예외입니다.

 

소프트웨어 인터럽트 : 시스템 호출이 발생했을 때 나타납니다. (09장에서 다룸)