Welcome to My World (www.dgmayor.com)

하드웨어/아두이노 & 라즈베리파이 관련 기사 모음 (2)

12 . CPU 구조 및 논리회로, 전자회로 재정리 (2)

dgmayor 2022. 8. 26. 12:54
728x90

트랜지스터는 Emitter(E), Collector(C), Base(B)로 구성

위에서 봤듯이 Base에 전류가 흐르면

NPN : C -> E로 전류가 흐름

PNP : E -> C로 전류가 흐름

 

즉, 가운데 도선(B)에  특정 전압을 걸어주면

전류가 흐름

 

이 트랜지스터를 이용하면

우리가 배운 논리회로를 구현할 수 있음

 

트랜지스터 두 개를 직렬로 연결해

각 Base 부분인 A, B에 전류의 여부에 따라

출력이 결정되며

 

이는 우리가 알고 있는 AND 게이트가 된다

 

트랜지스터를 병렬로 연결하면

 

우리가 알고 있는 OR 게이트이다

 

NOT 게이트는 출력을 트랜지스터 앞에 달면

Base에 전류가 없는 경우

출력으로 전류가 흐르고

Base에 전류를 흘려주면

트랜지스터 쪽으로 전류가 흐르게 됨

 

NOT 게이트

 

위에서 나온 게이트들을 조합하여 XOR 게이트 구성 가능

 

XOR 게이트

 

AND / OR / NOT 회로 도식화

그럼 덧셈을 수행하는 원리를 알아보자

전류 출력 여부에 따라 0과 1로 이루어진

이진수 덧셈이 이루어지며

 

네 가지 경우로 나뉘며

이를 통해 두 출력의 합을 0, 1, 2로 구분할 수 있게 된다

 

합과 올림수는 각 XOR, AND 게이트의 논리와 동일하므로

 

이렇게 회로를 구성하면 더하기 게이트를 구성 가능

실제 덧셈에 사용되는 논리회로는 더 복잡하지만

이처럼 트랜지스터를 이용한다는 사실만 알아두자

 

CPU에는 산술 논리 장치(Arithmetic Logic Unit), ALU가 있다

+, - 같은 산술과

AND, OR 같은 논리를 연산함

 

반도체는 전기를 끊었다 연결했다 ON/OFF 하는

수십억 개의 트랜지스터로 구성됨

CPU 안에 트랜지스터의 수가 충분하면 0, 1으로 모든 계산이 가능

 

=> 트랜지스터가 많을수록 성능 UP

 

실제로는 미세먼지보다 작은 모스펫이라는 형태로 들어감

 

 

모스펫의 몸체는 반도체

위에는 전류가 흐르는 도체 존재

 

도체 부분에 전류를 걸어주면

전자들이 도체 쪽으로 밀집되고

여기에 전압을 걸어주면

+ 쪽으로 전자가 이동하면서

전류가 흐름

 

CPU, RAM, SSD가 보드에 존재하고

CPU는 느린 SSD와 직접 통신하지 않음

프로그램 실행 시, 데이터는 램으로 이동하고

CPU가 이를 가져감

 

RAM도 CPU보다 많이 느리기 때문에

CPU 내부나 근처에 캐시 메모리를 가지고 있음

캐시 메모리는 용량이 적으므로 중요한 데이터만 저장하여 사용

- CPU는 L1 -> L2 -> L3 -> RAM 순서로 원하는 데이터를 찾아봄

 

컴퓨터의 기억장치는 하드, 램, 캐시, 레지스터

- 레지스터 : CPU 내부에서 데이터를 일시적으로 저장하는 장치

 

레지스터 동작 원리와 종류 (일부)

- 프로그램 카운터(PC) : 다음에 수행할 메모리의 주소

- 메모리 주소 레지스터 : PC로부터 수행할 주소를 넘겨받고, 해당 주소에서 데이터를 가져옴

- 메모리 버퍼 레지스터 : 메모리 주소 레지스터가 가져온 데이터나 명령을 일시적으로 저장
해당 메모리가 명령어 일 경우 명령어 레지스터로 전달하고
연산에 사용될 데이터인 경우 누산기 레지스터로 전달

- 명령어 레지스터 : 명령에 관한 데이터 저장

- 제어장치 : 명령어 레지스터에게 명령을 받아 해석하고 시스템에 지시를 보냄

- 누산기 레지스터 : 연산의 결과나 중간 값을 일시적으로 저장

최종 결과는 메모리 버퍼 레지스터로 전달되고, 메모리 버퍼 레지스터를 통해 메모리로 전달됨

- ALU : 산술 논리 연산을 수행

 

개발자가 프로그래밍 언어로 개발한 프로그램은

컴파일되어 어셈블리어로 변환됨

어셈블리어는 어셈블러에 의해 0과 1로 된 기계어로 다시 변환됨

 

앞의 명령어 부분은 6bit로 이루어짐

뒤의 데이터 부분은 10bit로 이루어짐

프로세서가 한 번에 처리할 수 있는 값이 16비트가 됨

 

여기서 프로세서가 한번에 처리할 수 있는 단위는 워드(Word) 라고함

(32bit CPU의 워드 :  32bit[4byte])

(64bit CPU의 워드 :  64bit[8byte])

 

따라서 각 범용 레지스터의 크기는 워드의 크기만큼 정해짐

32bit CPU의 PC 레지스터의 크기 : 4byte

64bit CPU의 PC 레지스터의 크기 : 8byte

 

32bit가 표현할 수 있는 숫자는 2^32이다

따라서, 메모리의 주소도 2^32개만큼 표시할 수 있다

 

램의 각 주소 당 기본 메모리 단위는 1 byte 이므로

1byte를 2^32개 만큼 가리킬 수 있으며

이는 1byte * 2^32 =  4GB가 된다

 

즉, 32bit CPU는 최대 4GB의 표현하고 사용할 수 있다

실제로는 메모리에 컴퓨터 운영을 위한

다른 데이터도 올라가기 때문에 3GB 정도를 사용할 수 있다

 

이와 같이 64bit OS는 2^64인 16 엑사바이트만큼의 메모리를 표시하나?

그만큼의 메모리 어드레싱을 할 필요가 없기 때문에

실제로는 하위 48bit만 사용

 

다시 돌아와서 16bit CPU 예를 보자

해당 기계어는 램에 위와 같이 저장됨

램은 8비트씩 저장하므로 두줄로 저장

 

PC가 다음에 수행할 주소인 램의 100번 주소를 가리키고

메모리 주소 레지스터는 해당 명령 수행을 위해 100번 주소를 PC로부터 읽어옴

메모리 버퍼 레지스터는 100번째 주소의 값을 읽어와 저장

이 단계를 '인출'이라고 함

 

메모리 버퍼 레지스터에 저장된 데이터는 명령이기 때문에

명령어 레지스터에 저장

PC는 1 Word 만큼 증가(16bit CPU이므로 2byte만큼)

- 100 -> 102

명령어 레지스터에 저장된 명령은 제어장치로 이동되어 해석

이 단계를 '해석'이라고 함

 

제어장치의 명령은 10번째 데이터를 읽어 오는 명령이며

메모리 주소 레지스터에 읽어올 메모리의 주소(10번)가 저장되고

해당 주소(10번)에서 값을 읽어 메모리 버퍼 레지스터에 저장

 

10번 주소의 값은 명령어가 아닌 값(2)이므로 누산기 레지스터에 저장됨

여기까지가 명령어 LOAD[10] 한 줄의 처리 과정!

 

다음 처리를 위해 PC에 저장된 다음 실행할 주소(102)를 메모리 주소 레지스터로 가져옴

메모리 버퍼 레지스터를 통해 해당 값을 읽어오고

해당 값은 명령어이기 때문에 명령어 레지스터로 저장

명령어 레지스터의 명령 수행을 위해 제어장치로 저장

 

ADD 명령을 수행하기 위해 기존 누산기 레지스터의 값 2는

ALU로 전달

11의 값을 읽기 위해 메모리 주소 레지스터에 저장되고

읽어온 값은 메모리 버퍼 레지스터에 저장

해당 값(3)은 명령이 아닌 값이므로 바로 누산기 레지스터에 저장

ALU에 의해 바로 2 + 3이 수행되고 값은 누산기 레지스터에 다시 저장

 

이 단계를 '실행'이라고 함

모든 과정은 제어장치를 통해 컨트롤됨

 

마지막으로 PC에 저장된 104번째 명령을 처리하기 위해

메모리 주소 레지스터가 104를 저장하고

메모리 버퍼 레지스터가 해당 주소의 값을 읽어옴

해당 값은 STORE[12]인 명령어 이므로

명령어 레지스터에 저장됨

저장하라는 명령이 제어장치에 저장

해당 명령 수행을 위해 메모리 주소 레지스터에 저장할 주소(12)가 저장

누산기 레지스터에 저장된 5가 메모리 버퍼 레지스터에 저장

해당 값이 지정된 주소(12)의 메모리에 저장

 

이와 같이 CPU는 인출 -> 해석 -> 실행 -> 저장하는 과정을 거침

 

각 과정은 여러 개의 쓰레드에 의해 처리되며

코어 하나에 여러 개의 쓰레드가 실행되면 속도가 빨라지고

코어가 많아지면 더 빨라진다~

 

아키텍처 디자인은 회사마다 다르며

팬티엄, 샌디브릿지, 하스웰, 타이거레이크 등

다양한 형태로 진화하고 있음

 

728x90