간략히 읽는 컴퓨팅 아키텍처의 역사 – 1. 컴퓨팅과 컴퓨팅 아키텍처의 관계

in #blockchain8 years ago (edited)

데이터 컴퓨팅의 진화가 어떻게 ‘클라우드’나 ‘빅데이터’, ‘블록체인’, ‘인공지능’ 같은 것에 이르게 되는가에 대한 글을 쓰다보면 종종 ‘컴퓨팅 아키텍처’에 대해 설명해야 하는 상황이 생긴다. 그리고 ‘컴퓨팅 아키텍처’ 문제는 종종 그 글의 핵심 주장(‘왜 클라우드, 빅데이터, 블록체인, 인공지능이 등장하게 되었는가?’)을 떠받치는 ‘중요한 논거’인 경우가 많다. 그런데 그런 글 안에서 이것을 풀어서 설명하다 보면 글의 중심을 놓칠 수 있기 때문에, 대~~충 넘어가게 되는데, 그 때마다 이에 대한 글을 따로 써야겠다는 생각을 했지만 짬을 내지 못했었다.

물론 컴퓨팅 아키텍쳐의 역사에 대해, 심지어 그것이 무엇인지에 대해, 컴퓨터 공학 전문가가 아닌 사람이 설명을 하는 것은 매우 무모한 모험일 수 있다. 그러나 나는 아직 컴퓨터 공학 전문가가 일반인들이 쉽게 이해할 수 있도록 쓴 컴퓨팅 아키텍쳐에 대한 글을 찾지 못했다. 그래서 컴퓨터 공학 전문가가 써놓은 컴퓨팅 아키텍쳐에 대한 글을 마주하게 되는 일반인들은 그 설명의 내용이 자신이 컴퓨터에 대해 무지하다는 자백을 요구하는 ‘청구서’ 처럼 느껴진다.

그럼 대학에서 관련 학과를 전공한 대부분의 사람들은 어떻게 느낄까? 대개 상황은 셋 중 하나다. 아는 척을 해야 하거나, 이해한다고 착각하거나, 솔직해지거나.(이건 전공자들에 대한 비하는 아니다. 다만 전공자들의 대부분은 이 문제를 일반인이 이해할 수 있을 정도로 설명하지 못한다는 현실을 이야기하는 것이다.) 이런 상황은 왜 벌어지는 것일까? 일단 이 물음을 가지고 컴퓨팅 아키텍처의 역사 이야기로 들어가 보자.

‘컴퓨팅’은 무엇을 하는 것이고 컴퓨팅 아키텍처는 무엇인가?

일단 설명적 편의를 위해서 ‘컴퓨팅’을 컴퓨터라는 물체(하드웨어)로부터 떼어서 생각해 보기로 하자. 즉 그 안에서 이루어지고 있는 작업을 컴퓨팅이라고 보자는 뜻인데, ‘컴퓨팅’은 실상 별게 없다. ‘연산’, ‘조건문’, ‘루프(순환)’, ‘데이터’, 그리고 이것들을 실행하는 ‘프로세스’. 이게 전부다. 다만 이 다섯 가지 용어의 의미가 우리가 상식적으로 알고 있는 의미의 범위를 살짝살짝 벗어나는데, 이걸 놓치면 종종 읽고 들어도 무슨 뜻인지를 이해할 수 없는 모국어의 함정에 빠져들게 되는 ‘공포스러운’ 상황을 맞게 되는게 문제다.

먼저 컴퓨팅에서 ‘연산’은 우리가 흔히 알고 있는 4칙 연산만을 뜻하는 것이 아니라는 점이 문제의 출발점이다. 혹시 고등학교 수학 교과서에 나오는 ‘복잡했던’ 수학 연산들을 떠올리고 알고 싶지 않은 감정이 생긴다면 그것은 오해다. 컴퓨팅에서 문제가 되는 ‘연산’은 그런 고차원적인 것들과는 거리가 멀다. 오히려 컴퓨팅에서의 ‘연산’은 너무 단순해서 ‘연산’이라는 거창한 어휘가 오글거리는 것들이다.

예를 들어 두 자릿수인 이진수 10(2)이 있다고 하면, 우리는 컴퓨터의 메모리 두 칸을 사용해서 이 숫자를 나타낼 수 있다. 한 칸에 1을 표시하고 다른 한 칸에 0을 표시하는 것이다. 이걸로 단순한 연산 하나를 생각해보자. 숫자를 한칸씩 왼쪽으로 이동시켜서 왼쪽 벽을 뚫고 허공에 던져진 1을 오른쪽의 빈 방에 다시 넣는 것. 컴퓨팅에서는 이것도 일종의 ‘연산’이다. 그러고나면 결과는 이렇게 된다. 01(2) 이것보다 더 심한 것도 있다. 두 방을 모두 0이 되게 만드는 것. 이것도 하나의 연산이다. 당연히 두 방을 모두 1로 만드는 것도 ‘연산’이다. 이런 연산은 실제로 일반인이 그 말을 배울때 머릿속에 갖고 있는 ‘연산’의 의미에서 매우 멀리 떨어져 있다. ‘컴퓨팅에서 연산이란’ 대개 1차원으로 된 방의 열(列) 구조로 만들어진 ‘컴퓨터 메모리’에 기록된 값에 대한 규칙에 의한 변형들인데, 컴퓨팅에서는 이런 것들도 ‘연산’이고 우리가 잘 알고 있는 4칙 연산도 ‘연산’이다. 근데 이걸 같은 말로 퉁쳐서 부르니 일반인들이 길을 잃기 십상이다.

물론 컴퓨팅에서는 매우 자주 사용되는 ‘복합 연산’들도 있다. 엄밀하게 보면 독자적인 하나의 프로그램이라고 불러도 될 정도이지만, 너무나 자주 사용되므로 ‘구구단’ 처럼 연산을 효과적으로 만들어준다는 점에서 ‘연산’이라고 불러주기로 하자. 다만 이 경우에는 ‘특별한 형태를 가진 데이터’를 사용하는 경우가 있는데, 이는 ‘데이터’를 설명한 후에 다시 풀어서 이야기하기로 한다.

그 다음 두 가지는 이 연산들을 연결하는 방식들에 대한 것이고, 상식적인 의미와 크게 다르지 않다. ‘조건문’은 말 그대로 ‘어떤 조건에 부합하면 A로 그렇지 않으면 B로’와 같은 ‘조건에 의한 다음 연산 선택 혹은 다음 프로세스 선택을 통한 연산 순서 제어논리’이고, ‘루프’는 ‘그 루프 안에 들어있는 연산들을 루프 탈출 조건이 발생할 때까지 반복하는 연산 순서 제어논리’다. 그런 점에서 일상 언어의 일반적 의미와 크게 다르지 않다.

다만 ‘데이터’는 좀 미묘하다. 일상적 언어에서 ‘데이터’는 대개 그 ‘내용’ 또는 ‘값’을 뜻하지만, 컴퓨팅에서의 데이터는‘어디에 있는’ 데이터인가가 중요하다. 사용자로부터 ‘키보드로 입력’ 받는 것인지, 메모리의 특정 주소로부터 읽어 들이는 것인지, 하드 디스크나 USB와 같은 저장매체로부터 읽어 들이는 것인지, 그것도 아니면 네트워크로 수신하는 것인지에 따라 ‘데이터’를 다루는 방식이 달라진다. 이것은 당연히 ‘연산’의 결과인 ‘데이터’를 ‘쓰는(writing)’ 것에서도 같다. 다만 컴퓨팅 결과인 ‘데이터’를 쓰는(writing) 것은 사람을 위해 ‘스피커’에 소리로 쓰거나 ‘디스플레이’에 화소들로 쓰는 것과 같은 다양한 미디어적 ‘쓰기’가 있다는 점이 좀 특별하다.

컴퓨팅에서의 ‘데이터’가 일상 언어의 데이터와 다른 점은 또 있다. 그것은 ‘어떤 모양으로 된’ 데이터인가 하는 점이다. 일상 언어에서 ‘데이터’는 대개 ‘실수(real number)’이거나 ‘문자열’ 정도일 것이다. 그러나 컴퓨팅에서의 ‘데이터’는 대개 행과 열을 가진 칸들로 이루어진 ‘정형’ 데이터이거나, ‘비정형 데이터’를 그런 식으로 ‘정형화’하고, 각 칸에는 숫자나 문자열이 들어간다. 그렇게 보면 일상의 언어에서 쓰이는 ‘데이터’의 형식은 행과 열이 각각 하나인 형태인 셈이다. 물론 그보다 더 복잡한 ‘데이터의 형태’들도 쓰이는데 이것은 ‘프로세스’ 이야기에서 다시 하기로 하자.

‘프로세스’는 일상 언어에서 사용되는 의미와 비슷하게 쓰인다. 하지만 ‘프로세스’는 그 자체가 일상에서 잘 사용되지 않는 용어라는 것이 문제인데, ‘이해를 위한 약간의 집중’을 필요로 한다. 비유적으로 설명하자면, 프로세스를 만드는 것은 회전 원판이 놓인 식탁에 사람들을 둘러 앉게하면 사람수가 많더라도 한 자리에서 음식을 회전 원판에 올리고 돌리는 작업을 반복하여 효과적으로 서빙을 할 수 있는 것과 같은 원리다. 사람들을 어떤 테이블에 어떻게 앉히는가에 따라 음식을 전달하는 작업의 효율이나 안정성은 완전히 달라진다. ‘데이터 구조체’들은 바로 이런 회전원판이 달린 식탁과 같은 것들이어서, 개개인에게 음식을 분배하는(연산) 때에도 효과적이고 여럿이 물주전자를 공유하여 필요할 때 마다 물을 마시려고 ‘경합’하거나 ‘공유’하는 경우(프로세스)에도 효과적이다.

그런데 이런 식탁에 음식을 분배하는데 적합한 운반수단(데이터 구조체)은 어떻게 생겨야 효과적일까? 바퀴달린 3단 카트와 같이 좀 복잡하지만 음식을 많이 담는 운반수단에 위의 두 개 층에는 개인별 음식들을 싣고 맨 아래에는 공용 주전자 등을 실으면, 작업 순서에 최적일 수 있다. 이게 프로세스와 데이터 구조체의 관계와 비슷하다고 보면 된다. 식당 바닥에 이 운반수단들이 상향(식탁으로 향하는)과 하향(주방으로 향하는) 진로를 나누어 쓸 것인지 교차 지점에서는 어떤 규칙으로 카트가 통행할 것인지도 미리 정해두면 효율적 운영에 도움이 될 것이다. 이게 프로세스다.

물론 이런 식의 설명은 매우 부실하다. 하지만 컴퓨터 공학을 모르는 사람 입장에서는 이 정도도 매우 복잡한 상황이다. 그러나 일단은 이 정도라도 알고 넘어가 두면 뒤의 이야기를 이해하는데 도움이 되므로 용어들을 ‘눈에’ 보여준 것으로 만족하기로 하자. 정리하자면 컴퓨팅은 몇 개의 개념들로 이루어진 작업을 고속으로 하는 것인데, 이 때 빈번하게 등장하는 문제들을 위해서 그 문제해결에 최적화된 새로운 형태로 ‘연산’이나 ‘데이터’를 정의해서 해결하는 것이고, 이것을 소프트웨어 단독으로 할 것인지 하드웨어의 도움을 받아서 할 것인지 더 나은 방법은 없는지를 개선해 온 것이 컴퓨팅 아키텍처의 역사라고 보면 된다. 그리고 이것은 ‘미시적 작업’ 에서의 ‘작업 처리 과정’ (식당 안에서 개별 작업을 효율화하는)과 ‘거시적 작업’ 에서의 ‘목적 달성 과정’ (한식당인가 중식당인가에 따라 메뉴에 따라 음식분배 작업 전반의 구조적 변화가 생긴다)에서 동시에 일어나며, 이들 간에 서로 영향을 주며 발전한다는 것 정도를 이해해 두면 도움이 된다. ‘클라우드’나 ‘빅데이터’, ‘블록체인’은 ‘데이터 컴퓨팅의 거시적 목적’을 달성하는 과정, ‘인공지능’은 ‘미시적 작업’을 발전시키는 과정과 관계가 깊다. 이제 아래 글을 슬쩍 봐두는 것으로 ‘컴퓨팅과 아키텍처의 관계’에 대한 이야기는 마무리^^

프로세스는 작업이 처리되는 과정을 의미하며, 이것들은 조건이나 루프와 같은 ‘연산 흐름 제어 논리’에 의해 ‘선형적’으로 구성되거나 ‘비선형적’으로 구성되는데, 중간에 서로 나뉘어졌던 각 프로세스의 결과가 다시 모여서 ‘연산’에 쓰이기 위해서는 ‘동기화’라는 과정을 거쳐서 ‘프로세스 간 동기화된 데이터 교환’이 이루어지는 경우와 각 프로세스의 연산 결과를 ‘상태’로 여겨 별도의 동기화를 하지 않는 ‘프로세스 간 비동기적 데이터 교환’이 이루어지는 경우가 있다. 물론 프로세스 간 동기화 문제는 이것만 있는 것이 아니다. 서로 다른 프로세스가 일부 구성요소를 공유하는 경우에 발생하는 또다른 문제도 있다. 이것은 하드웨어 레벨로 내려오면 ‘CPU 스케쥴링’이나 ‘쓰레드’라는 용어를 가지고 정의되는데, 프로세스를 최적으로 처리하기 위한 소프트웨어와 하드웨어의 최적 분업을 위한 용어 분리라고 봐도 무방하다.

마이크로한 컴퓨팅 프로세스 상에서는 프로세스 간의 데이터나 작업 구성요소 공유에서 생기는 여러 문제들을 ‘순서를 잘 정해주는’ 방식(‘세마포어’나 ‘뮤텍스’ 같은 이름으로 불리는 전형적 기법들이 있으나 설명은 생략)으로 해결하는데, 이때 아주 다양하게 ‘데이터 구조체’가 사용된다. ‘트리(tree)나 ‘그래프(Graph)’, ‘대기열(Queue)’이나 ‘스택(stack)’, ‘연결 목록(Linked List)’, ‘연결 고리(Circular Linked List)’ 같은 것들이 그것들이다.
그 외에도 ‘데이터 구조체’는 컴퓨팅에서 자주 사용되는 ‘복합 연산’(혹은 알고리즘)을 쉽고 빠르게 구현하기 위해 구현된 것들도 있다. ‘트리’의 일종인 ‘힙(Heap)’ 같은 것들이나 ‘그래프’ 같은 것들이 그런 종류들이다.

(이 글의 다음편은, ‘컴퓨팅 아키텍처를 알아서 뭘 어쩌라고?’인데, ‘컴퓨팅 아키텍처’에 대한 이해를 좀 깊게 하면 최근 핫한 주제들에 대한 ‘이해도’가 어떻게 달라지는지를 예시할 계획이다.)

Sort:  

좋은글 잘 읽었습니다.
아주 정독했다는 증거로
오타 찾아드립니다 ㅋㅋㅋ

** ‘어디에 있는’ 데이터인가가 중요**
띄어쓰기를 없애야 합니다 ㅋㅋ

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.081
BTC 60794.22
ETH 1603.88
USDT 1.00
SBD 0.47