본 포스트는 위 동영상을 글로 요약한 버전입니다. 그리고 이 영상은 제 Youtube에 있는 강의입니다.
컴퓨터는 프로그램을 어떻게 실행시키는 걸까? 컴알못과 함께 알아보도록 해요.
컴알못 소개
- 이름 : 컴알못
- 직업 : 소프트웨어 엔지니어
- 직급 : 신입사원(2년차)
- 성격 : 호기심이 많음
- 특징 : 시키는 일은 뭐든 열심히 하는 편, 컴퓨터에 대해 잘 알지 못함
알못이는 오늘도 코딩을 한다
그렇게 오늘도 시켜서 하는 코딩을 열심히 하던 도중, 알못이는 문득 궁금해졌어요.
- 내가 지금 하루 종일 컴퓨터 앞에서 뭐하는 걸까?
- 왜 내가 프로그래밍을 하면 이 착한 컴퓨터는 작성한대로 실행시켜주는 걸까?
- 이게 어떻게 동작하는 걸까?
그래서 알못이는 자신의 사수인 머대리님을 찾아가서 물었어요.
사수인 머대리님의 간단한 대답에 알못이는 오히려 궁금한 것들이 더 많이 생겼어요.
하지만 한꺼번에 물어보면 싫어하실까봐 하나씩 물어보기로 결정했어요.
프로그램을 누가, 어떻게, 왜 번역하는가?
스크립트 언어는 소스 코드를 실행 시키면 인터프리터가 한줄 한줄씩 번역 및 실행시키고, 컴파일 언어는 소스 코드를 한꺼번에 번역해서 실행시키지.
프로그램은 어디에, 왜 저장하는가?
추가로 주메모리와 레지스터 사이엔 캐시 메모리도 존재하지 냉장고는 집에 있어서 먹고 싶은 게 있을 때 바로바로 꺼낼 수 있지만 넣을 수 있는 음식의 개수는 가장 한정적이야.
편의점은 냉장고보단 물건이 들어갈 공간이 더 많지만 물건을 가져오려면 시간이 좀 더 걸려.
마트는 편의점보다 물건이 더 다양하고 많지만 훨씬 멀리 있고, 물류창고는 개인이 접근하기로 어렵고 물건을 사지 못해. 도매업자만 물건을 떼올 수 있지.
번역된 프로그램을 누가 어떻게 실행하는가?
머대리가 바빠서인지 CPU의 대한 질문을 회피하자, 알못이는 컴퓨터 공학 출신 컴과장님을 찾아갔어요.
CPU가 어떻게 프로그램을 실행시키나?
컴과장님은 알못이가 갑자기 무슨 바람이 들었나 생각했지만 친절하게 가르쳐주고 싶었어요. 성격이 급한 알못이는 아직도 CPU 동작원리를 모르겠다면서 징징댔어요.
CPU의 구성요소
프로그램 카운터
프로그램을 실행하면 제어장치가 먼저 프로그램 카운터라는 레지스터를 이용해서 명령어가 담긴 메모리의 주소 값을 찾아.
메모리는 집이 빈틈없이 늘어선 거리와 같은데 제어장치 안에 있는 프로그램 카운터라는 애가 돌아다니면서 쪽지 찾기를 해.
각 집에는 명령어가 담긴 쪽지가 있을 수도 있고 없을 수도 있는데, 명령어가 담긴 쪽지를 찾으면 그 집의 주소를 적어놔.
그렇게 찾은 쪽지는 메모리 주소 레지스터, 메모리 데이터 레지스터, 명령어 레지스터, 어큐뮬레이터를 통해 이동되고, 마침내 산술 논리 장치(ALU)가 연산을 마친 후 다시 빈 집에 결과가 적힌 쪽지를 보관해
레지스터랑 프로그램 카운터란?
계속되는 컴알못의 질문에 컴과장님은 지쳐버렸고, 옆에서 흐뭇하게 바라보던 전자공학 출신 전부장님이 나섰어요.
NOT GATE는 이 Truth Table에 나와있는 것처럼 무조건 입력 값의 반대의 출력을 내보내는 회로야. 자 밑에 Feed Back 회로를 살펴보자. 이 회로는 출력을 다시 입력으로 되먹임하는 회로인데, 이전 출력 값이 0이라고 치자. 그럼 출력이 입력이 되고, 그 입력이 다시 출력으로 나오는 무한 반복의 원리로 기억기능이 구현되는 것이지. 그런데 이렇게 간단한 걸로는 뭘 만들 수 없잖아?
NAND Gate는 Truth Table에 나와있는 것처럼 둘 다 1일 경우에만 0이고 나머지는 모두 1을 출력해줘. 그리고 플립플롭의 종류에도 회로의 구성에 따라 여러 가지가 있는데, CPU의 레지스터는 D 플립플롭이라는 회로를 써.
NOT Gate와 NAND Gate
회로까지 설명해주니까 도망치고 싶었던 알못이는 급하게 자리를 뜨려했지만 실패했어요.
CPU와 RAM을 구성하는 소자들
사람이 10진법을 사용하는 이유
이쯤되니 직원들이 하나 둘씩 모여 대표님까지 구경하게 되었습니다. 그럼에도 불구하고 알못이는 지치지도 않는지 질문을 이어나갔어요.
그런데 생각해보니까.. 컴퓨터는 2진법을 사용하는데, 왜 저희는 10진법을 사용 하는 걸까요?
몇 분간 침묵이 이어지다가 철학과 출신 대표님이 라고 말하자 모두 수긍을 했어요. 알못이는 수긍은 했지만 찜찜한 게 남았는지 그럼 왜 컴퓨터는 10진수를 안쓰고 2진수를 쓰나요? 손가락이 없어서 그런가요? 라고 따지듯이 질문을 했어요.
그러자, 대표님은 트랜지스터를 설명해주시면서, 자, 보자. 아까 전부장이 모든 회로는 기본적으로 transistor로 이루어져 있다고 했지? 저항은 무시하고, 신호를 조절하고 제어하는 가장 기본적인 장치가 이 트랜지스터거든. 트랜지스터는 전류가 지나가는 길의 문을 전압을 이용해 열고 닫아주는 스위치
역할을 해
숫자를 0부터 9까지 표현한다고 치자. 너가 말했던 것처럼 전류의 세기로 0~1A사이는 1, 1~2A는 2로 정하려면 전류를 스위치로 미세하게 조정할 수 있어야 하지.
반면에 2진법으로 0부터 9까지 표현하기 위해서는 4개의 스위치가 필요하지만 미세 조정할 필요가 없어. 왜냐면 각 스위치별로 바로 이 문턱값 이상의 힘만 주면 되기 때문이지. 그러면 각 자리수별로 조합해서 10진수로 변환하기만 하면 되거든.
이건 비커에 물을 부어서 눈금을 조절하는 거랑 비슷해. 8이라는 숫자를 만들기 위해 10L짜리 비커를 미세하게 계량하는 것과 1L짜리 비커 4개를 대충 계량하는 것 중에 어떤 게 쉬울지 생각해봐. 대신, 모든 건 컴퓨터 입장에서 생각해야 한단다.
이렇게 모든 깨달음을 얻은 직원들은 컴알못 때문에 못한 업무를 하느라 행복하게 야근을 하게 되었답니다. 이상 컴알못 이야기 끝~
ref
한 권으로 읽는 컴퓨터 구조와 프로그래밍(조너선 스타인하트)