더 효율적인 코딩을 위한 컴퓨터의 동작 원리 2편 – 튜링 머신과 폰 노이만 구조

이 글은 [Must Have Tucker의 Go 언어 프로그래밍(세종도서 선정작)]에서 발췌했습니다.
골든래빗 출판사

 

본 글에서는 컴퓨터와 프로그래밍 언어의 동작 원리를 정확히 알아 봅시다. 총 2편으로 구성했습니다. 2편에서는 튜링 머신과 폰 노이만 구조를 통해 컴퓨터 동작 원리에 대해 알아봅시다. 비트와 트랜지스터에 대한 설명은 1편에서 볼 수 있습니다.

 

 

1. 계산기에서 컴퓨터로

트랜지스터를 이용해서 계산기를 만드는 방법을 살펴보았습니다. 하지만 생각해보시면 계산기하고 컴퓨터는 엄연히 다릅니다. 계산기로는 계산만 할 수 있지만, 컴퓨터로는 음악을 틀고 게임을 하고 인터넷도 할 수 있습니다. 즉 컴퓨터는 연산이라는 목적에 한정되지 않고 다용도로 사용됩니다. 그럼 어떻게 계산기에서 컴퓨터로 발전했는지 살펴보겠습니다.

 

1.1 최초의 상상속 컴퓨터 : 튜링 머신

튜링 머신이란 영국의 천재 과학자 앨런 튜링이 컴퓨터가 존재하기 전에 상상으로 구현한 기계(컴퓨터)입니다. 앨런 튜링이 죽고 나서 이 튜링 머신에 기초하여 컴퓨터가 만들어지게 됩니다. 1936년 발표한 논문*에서 앨런 튜링은 이 기계를 a-machine이라고 불렀습니다. a는 automatic의 준말입니다.

* Turing, A.M. “On Computable Numbers, with an Application to the Entscheidungsproblem”

 

시대를 앞서간 앨런 튜링

영국의 천재 과학자입니다. 2차대전 당시 독일의 첨단 암호화 장치인 에니그마를 해독해서 2차대전에서 연합국이 승리하는 데 커다란 전공을 세웠습니다. 또 컴퓨터의 기반이 된 튜링 머신, AI 테스트의 기준이 된 튜링 테스트 등 컴퓨터 발전에도 큰 이바지를 했습니다. 앨런 튜링은 동성애자였습니다. 당시 영국은 동성애자를 법으로 금지하고 있었고 아무리 전쟁영웅이라고 해도 예외가 아니었습니다. 그 결과 화학적 치료 명령을 받았고 이에 좌절한 앨런 튜링은 청산가리가 묻은 사과를 한 입 베어물고 자살합니다.

상상 속 머신인 튜링머신을 간단히 그리면 다음과 같이 장치가 아주 기다란 종이다발을 가리키고 있는 형태입니다. 종이다발은 칸으로 구분되어 있고 이 기계 장치는 현재 칸을 읽을 수 있고, 칸을 자유자재로 이동할 수 있습니다. 이를 통해 기계 상태를 조정함으로써 계산을 수행합니다.

 

 

오늘날 컴퓨터는 튜링 머신에 기초하여 폰 노이만 기계를 거쳐 완성하게 됩니다.

 

1.2 컴퓨터의 완성 : 폰 노이만 구조

앨런 튜링은 아쉽게도 컴퓨터 완성을 보지 못하고 세상을 떠났습니다. 또 다른 천재인 폰 노이만 이 실제로 동작하는 컴퓨터를 최초로 구현하게 됩니다. 폰 노이만 구조를 간략하게 다음 그림과 같이 나타낼 수 있습니다.

 

 

중앙에 연산을 담당하는 중앙 처리 장치인 CPU(central processing unit), 기억 장치인 메모리(memory), 그리 고 입력과 출력을 담당하는 외부 입출력 장치가 있는 형태입니다. 폰 노이만 구조는 현대 컴퓨터 에서 모두 사용하는 기본적인 구조입니다.

폰 노이만 구조에서 명령은 중앙 처리 장치인 CPU에서 수행됩니다. 프로그램이란 메모리에 올라가서 CPU에 명령어를 순차적으로 제공하는 명령어 묶음입니다. 실제로 초창기 컴퓨터는 종이 카 드에 구멍을 뚫어서 사용하는 천공카드 다발을 사용해서 컴퓨터에 프로그램 명령어들을 제공했습니다.

 

우주 최강의 두뇌 폰 노이만

오스트리아 출신의 과학자입니다. 어릴 때부터 천재로 유명했습니다. 2차대전이 발발하자 미국 맨하탄 프로젝트에 참여해서 핵폭탄을 개발하는 데 공헌합니다. 우주 최강의 두뇌라고 불리던 폰 노이만은 양자 역학, 수학, 경제학, 컴퓨터 공학 등 다양한 분야에서 많은 업적을 남겼습니다. 맨하탄 프로젝트 동안 쏘인 방사선이 원인으로 추정되는 암으로 54세로 생을 마감합니다.

이 종이 다발인 천공카드에 명령어들이 적혀 있는데요, 종이에 적힌 명령은 ‘음악을 연주해라’, ‘게임을 실행해라’와 같은 복잡한 명령이 아닌 더하기, 빼기 같은 단순한 명령입니다. 컴퓨터는 단순한 명령을 매우 빠르게 수행하는 기계이고, 명령을 어떤 순서로 실행할지 정의한 문서가 바로 프로그램입니다.

 

 

컴퓨터는 위 그림과 같이 한 줄을 읽고 명령을 수행하고 한 줄을 전진시키는 걸 계속 반복합니다. 프로그래머는 프로그래밍 언어를 사용해서 어떤 연산을 어떤 순서로 실행할지 정의하는 사람입니다.

 

 

2. 컴퓨터 동작 원리

컴퓨터는 크게 중앙 처리 장치인 CPU, 데이터를 보관하는 메모리, 입출력 장치로 구성됩니다. 메모리는 휘발성 메모리와 비휘발성 메모리로 나눕니다. 각각 램 메모리, 하드디스크를 예로 들 수 있습니다. 각각을 편의상 램 메모리와 하드디스크로 불러 설명하겠습니다. 모두 데이터를 저장하는 기능을 담당합니다. 램 메모리는 하드디스크보다 데이터 읽기/쓰기 속도가 빠르지만, 전원 공급이 중단되면 저장된 데이터가 사라집니다( 휘발성). 하드디스크는 전원 공급이 끊겨도 사라지지않는 비휘발성 특징을 갖습니다.* ****프로그램 실행 파일은 하드디스크에 보관되어 있습니다.

* 오늘날 하드디스크는 속도가 훨씬 빠른 SSD로 대체되고 있습니다.

오늘날의 컴퓨터 내부 구조는 다음과 같습니다. 프로그램을 실행하면 컴퓨터에서 일어나는 일을 그림에 표시해뒀습니다.

 

 

1. 프로그램 로드

프로그램이 실행되면 운영체제는 프로그램 실행 파일을 메모리에 복사합니다. 이것을 로드(load)라고 합니다. 하드디스크는 대용량 데이터를 보관할 수 있지만 속도가 느리다는 단점이 있습니다. 반면 램 메모리는 하드디스크보다 용량은 작지만 더 빠릅니다. 그래서 프로그램을 실행하기 앞서 프로그램 코드와 필요한 데이터를 메모리로 복사합니다. 그런 뒤 프로그램 첫 줄부터 한 줄씩 코드를 실행하게 됩니다.

 

2. 데이터 로드 및 캐싱

모든 명령은 CPU에 의해서 실행됩니다. CPU가 연산을 처리하려면 연산에 필요한 데이터를 가져와야 합니다. 이를 위해서 CPU 내부에는 캐시cache라는 별도 메모리 공간을 가지고 있습니다. 캐시는 연산에 필요한 데이터를 보관하는 임시 보관장소입니다. 램 메모리보다 적은 공간이지만 훨씬 빠릅니다. 먼저 메모리에서 연산에 필요한 데이터를 캐시로 복사합니다. 하지만 복사할 때 정확히 연산에 필요한 부분만 복사하는 게 아니라 근처 데이터도 같이 복사합니다. 일반적으로 다음 연산에 필요한 데이터는 이전 연산에 사용된 데이터와 연속되어 있는 경우가 많기 때문입니다.* ****캐시를 사용하면 램 메모리를 이용하는 횟수가 줄어 성능이 높아지게 됩니다.

* 데이터 지역성(data locality) 또는 참조 지역성(locality of reference)의 원리라고 부릅니다.

 

3. 연산 및 저장

자 이제 연산에 필요한 데이터가 캐시에 준비됐습니다. 이제 CPU는 연산에 사용할 데이터를 레지스터(register)로 복사합니다. 레지스터는 실제 연산이 수행되는 특수한 데이터 공간입니다. 일반적으로 CPU 레지스터의 크기는 32비트 컴퓨터에서는 32비트 즉 4바이트이고, 64비트 컴퓨터에 서는 64비트 즉 8바이트입니다(그래서 64비트 컴퓨터는 한 번에 8바이트씩 연산을 수행할 수 있어서 32비트 컴퓨터에 비해서 연산 속도가 빠릅니다). 명령에 따라 연산 결과를 메모리에 저장하기도 합니다.

 

캐시 미스

CPU는 레지스터 값을 이용해서 해당 연산을 수행합니다. 그리고 그다음 줄 연산을 실행 합니다. 만약 그다음 줄 연산에 필요한 데이터가 이미 캐시에 있다면 다시 메모리에서 데이터를 가져올 필요 없이 바로 레지스터에 복사해서 연산을 수행합니다. 하지만 캐시에 필요한 데이터가 없다면 캐시를 비우고 다시 메모리에서 연산에 필요한 데이터를 복사해옵니다. 이것을 캐시 미스(cache miss) 또는 캐시 실패(cache fault)라고 부릅니다. 캐시 미스가 발생 하면 그만큼 시간이 더 걸리므로 캐시 미스가 최대한 발생하지 않도록 코딩하면 성능상 이득을 얻을 수 있습니다. 따라서 관련 데이터를 연속된 메모리 공간에 저장하면 캐시 미스가 덜 발생할 수 있습니다. 예를 들어 게임에서는 화면에 그릴 렌더링 데이터를 연속된 메모리 공간에 저장해서 성능을 올립니다.

 

 

3. 핵심 요약

1. 트랜지스터는 스위치와 증폭에 사용됩니다. 스위치로 사용할 때는 1, 0 상태를 가집니다.

2. 트랜지스터를 활용해 논리 소자를 만들 수 있고, 논리 소자로 계산기를 만듭니다.

3. 컴퓨터는 튜링 머신으로 기초가 마련되고, 폰 노이만 구조로 완성됐습니다.

4. 프로그램 연산과 저장은 CPU가 데이터를 하드디스크, 램 메모리, 캐시, 레지스터 메모리 공간으로 복사하면서 이뤄집니다.

WRITER

공봉식

13년 차 게임 서버 프로그래머로 다양한 장르의 온라인 게임을 개발했습니다. 넥슨과 네오위즈를 거쳐서 현재는 EA 캐나다에서 근무 중입니다. 「Tucker Programming」 유튜브 채널을 운영합니다.

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내