Go 01 | 컴퓨터 원리

임종성·2021년 11월 15일
1

Golang

목록 보기
1/1
post-thumbnail

앞으로 Go 언어를 사용함에 따라 Tucker의 Go 언어 프로그래밍 이라는 서적으로 공부를 하게 되었습니다. Go 언어를 배우기 앞서 컴퓨터와 프로그래밍 언어의 동작 원리를 먼저 이해해보겠습니다.

비트의 탄생과 트랜지스터

트랜지스터는 연산을 수행하는 가장 기본이 되는 소자입니다. CPU, 메모리, 그래픽카드 등에 사용되며 컴퓨터는 트랜지스터로 구성되어 있다고 해도 과언이 아닙니다. 간단하게 살펴보면 트랜지스터는 성질이 다른 2가지 실리콘인 n형 반도체와 p형 반도체를 끼워 만듭니다.

예를 들어 n-p-n 트랜지스터는 n형 실리콘 사이에 p형 실리콘을 넣어 만듭니다. 이 때 가운데의 p형을 Base, 양쪽의 n형을 양공을 방출한다는 뜻의 Emitter와 방출된 양공을 수집한다는 뜻의 Collector라고 합니다.

트랜지스터와 0과 1

트랜지스터는 크게 증폭과 스위치의 2가지 기능을 제공합니다. 컴퓨터에서는 증폭보다 스위치가 주로 사용되기에 스위치 기능 위주로 살펴보겠습니다.

위와 같이 회로에 스위치가 열려 있으면 베이스에 전류가 흐르지 않고 모든 전류계에 전류가 흐르지 않습니다. 하지만 스위치를 닫아 베이스에 전류가 흐르게 되면 모든 전류계에 전류가 흐르게 됩니다. 이러한 성질을 이용해 회로에 전류가 흐를 때를 1, 전류가 흐르지 않을 때를 0으로 하여 스위치처럼 이용할 수 있습니다.

컴퓨터가 0과 1밖에 모른다고 말하는 것은 이와 같은 성질에서 비롯된 말입니다. 이렇게 0과 1 둘 중 하나의 숫자를 나타내는 공간을 1비트 라고 합니다.

2진수

컴퓨터는 1과 0 두 숫자를 사용해 모든 수를 표현합니다. 트랜지스터 1개로 0, 1을 표현할 수 있는데 2진수로 한 자리를 차지하게 됩니다. 즉, 2진법 10111이라는 숫자를 표현하고자 하면 트랜지스터가 총 5개가 필요합니다. 한 트랜지스터가 2진법으로 한 자리를 표현하는 것을 바로 1 비트(bit)라고 하며, 1비트가 8개 모인 8비트를 바로 1 바이트(byte)라고 합니다.

트랜지스터에서 계산기로

지금까지 트랜지스터로 0과 1을 표현해 숫자를 나타내는 방법을 알아보았습니다. 그렇다면 컴퓨터의 핵심 기능은 계산은 어떻게 트랜지스터로 표현하는 것일까요?

논리 소자와 트랜지스터

트랜지스터로 계산기를 만들기 위해 먼저 논리 소자를 알아야 합니다. 논리 소자는 입력에 따라 특정 결과를 반환하는 대표적인 기본 전기회로로, AND, OR, XOR, NOT 등이 있습니다.

  • AND
    두 입력이 모두 1이면 1, 하나라도 0이면 0을 반환합니다. 이러한 논리연산을 트랜지스터로 어떻게 만들 수 있을까요? 아래 그림에서 A와 B를 각각의 트랜지스터라고 한다면, 두 트랜지스터에 모두 전류가 흘러야 출력에 전류가 흐르고, 하나의 트랜지스터라도 전류가 흐르지 않으면 출력은 0이 될 것입니다.

    위와 같은 방식으로 각각의 논리연산을 트랜지스터로 구성할 수 있습니다.

  • OR
    두 입력 중 하나라도 1이면 1, 모두 0이면 0을 반환합니다.

  • XOR
    두 입력이 서로 다르면 1을, 같다면 0을 반환합니다. 아래 XOR Gate의 스위치 회로를 보면 트랜지스터로 어떻게 논리회로를 구성하는지 확인할 수 있습니다.

  • NOT
    입력이 하나이고 0이면 1을, 1이면 0을 반환합니다.

논리 소자로 사칙연산 구현하기

이제 논리 소자를 이용하여 어떻게 계산하는지 살펴보도록 하겠습니다. 1비트 가산기란 1비트 입력 2개를 더하는 회로소자로, 표로 정리하면 다음과 같습니다.

0+0은 00, 0+1과 1+0은 01, 1+1은 10으로 2진법 숫자 더하기를 표현하고 있습니다. 그런데 위의 carry는 AND, sum은 XOR의 결과와 같다는 것을 알 수 있습니다. 즉 carry는 AND 논리연산, sum은 XOR 논리연산의 결과로 표시하면 1비트 가산기를 만들 수 있습니다. 이렇게 트랜지스터의 스위치 기능으로 연산을 할 수 있습니다.

계산기에서 컴퓨터로

지금까지는 트랜지스터를 이용해 계산기를 만드는 방법을 살펴보았습니다. 그러나 계산기와 컴퓨터는 엄연히 다르고, 컴퓨터는 연산에 국한되지 않고 다양한 기능으로 사용되고 있습니다. 어떻게 계산기에서 컴퓨터로 발전해왔을까요?

폰 노이만 구조

중앙에 연산을 담당하는 중앙 처리 장치인 CPU(Central Processing Unit), 기억 장치인 메모리, 입력과 출력을 담당하는 외부 입출력 장치가 있는 형태가 바로 폰 노이만 구조입니다.

폰 노이만 구조에서 명령은 중앙 처리 장치인 CPU에서 수행됩니다. 프로그램이란 메모리에 올라가서 CPU에 명령어를 순차적으로 제공하는 명령어의 묶음입니다. 여기서 CPU가 메모리에 저장된 명령어를 받아와 계산할 때 메모리로부터 명령어를 가져오는 fetch, 명령어의 의미를 해석하는 decode, 명령어를 실행하는 execute, 결과를 저장하는 store의 순서로 처리됩니다. 또한 폰 노이만 구조는 ‘내장 메모리 순차처리 방식’을 따르고 있기 때문에 CPU는 순차적으로 한 번에 명령어 하나씩 실행합니다.

컴퓨터 동작 원리

위에서 살펴본 바와 같이 컴퓨터는 크게 중앙처리장치인 CPU, 데이터를 보관하는 메모리, 입출력 장치로 구성됩니다. 메모리는 램 메모리, 하드디스크와 같은 휘발성 메모리와 비휘발성 메모리로 나뉘고, 모두 데이터를 저장하는 기능을 담당합니다.

램 메모리는 하드디스크보다 데이터의 읽기/쓰기 속도가 빠르나 휘발성이라는 단점을 가지고 있고, 하드디스크는 비휘발성이라는 특징을 가지고 있습니다. 프로그램 실행 파일은 하드디스크에 보관되어 있으며, 프로그램을 실행하면 컴퓨터는 다음과 같은 4단계의 일을 수행합니다.

프로그램 로드

프로그램이 실행되면 운영체제는 프로그램 실행파일을 메모리에 복사하며, 이것을 로드라고 합니다. 하드디스크보다 램 메모리의 데이터 처리 속도가 빠르기에 프로그램을 실행하기에 앞서 메모리로 복사하는 것입니다.

데이터 로드 및 캐싱

모든 명령은 CPU에서 실행됩니다. CPU가 연산을 처리하기 위해서 연산에 필요한 데이터를 가져와야 하고, 이를 위해 CPU 내부에 캐시(cache)라는 별도 메모리 공간을 가지고 있습니다. 캐시는 연산에 필요한 데이터를 보관하는 임시 보관장소로, 램 메모리보다 적은 공간이지만 훨씬 빠른 속도를 가지고 있습니다.

연산 및 저장

이제 CPU는 연산에 사용할 데이터를 레지스터(register)로 복사합니다. 레지스터는 실제 연산이 수행되는 특수한 데이터 공간으로, 일반적으로 64비트 컴퓨터에서 64비트, 즉 8바이트 입니다. 명령에 따라 연산 결과를 메모리에 저장하기도 합니다.

캐시 미스

CPU는 레지스터 값을 이용해 해당 연산을 수행하고 그 다음 줄을 수행합니다. 이 때 다음 연산에 필요한 데이터가 이미 캐시에 있다면 굳이 메모리에서 데이터를 가져올 필요 없이 바로 레지스터에 복사해 연산을 수행합니다. 그러나 캐시에 필요한 데이터가 없다면 캐시를 비우고 다시 메모리에서 연산에 필요한 데이터를 복사해옵니다. 이를 캐시 미스 또는 캐시 실패라 부릅니다. 따라서 캐시 미스가 발생하지 않도록 코딩하면 성능상 이득을 얻을 수 있습니다.


참고자료

Tucker의 Go 언어 프로그래밍
트랜지스터 알아보기
논리게이트: XOR Gate
조합 논리회로 - 가산기
폰 노이만 구조

profile
어디를 가든 마음을 다해 가자

1개의 댓글

comment-user-thumbnail
2021년 11월 19일

프로그래밍 언어 배우는데 컴퓨터 구조부터 공부하는건 너무 low-level 공부 아님?

답글 달기