컴퓨터 구조 개론
1.1 컴퓨터의 시작: 기계식 계산기에서 전자 컴퓨터까지
컴퓨터는 어느 날 갑자기 나타난 것이 아니다. 인류가 복잡한 계산을 더 빠르고 정확하게 하고 싶어하는 욕구에서 시작되었다. 주판에서 시작해 기계식 계산기를 거쳐 오늘날의 스마트폰까지, 컴퓨터의 역사는 인류의 도전과 혁신의 역사다.
1.1.1 기계식 계산기의 시대
찰스 배비지의 차분기관 (1822년)
영국의 수학자 찰스 배비지는 수학표의 오류에 짜증이 났다. 당시 수학표는 사람이
손으로 계산해서 만들었기 때문에 실수가 많았다. 그는 "이런 계산을 기계가
자동으로 할 수 없을까?"라고 생각했고, 차분기관(Difference Engine)을 설계했다.
톱니바퀴와 축으로 이루어진 이 기계는 다항식을 계산할 수 있었다.
해석기관: 최초의 프로그래밍 가능한 기계 구상 (1837년)
배비지는 더 나아가 해석기관(Analytical Engine)을 구상했다. 이 기계의 혁신적인
점은 프로그램을 바꿀 수 있다는 것이었다. 자카드 직조기에서
영감을 받아 천공 카드로 명령을 입력하는 방식을 생각했다.
해석기관은 현대 컴퓨터와 놀라울 정도로 비슷한 구조를 가지고 있었다:
- Mill(제분소): 계산을 수행하는 부분 → 현재의 CPU
- Store(저장소): 숫자를 저장하는 부분 → 현재의 메모리
- 천공 카드: 명령어 입력 → 현재의 프로그램
1.1.2 전자식 컴퓨터의 탄생
앨런 튜링과 튜링 머신 (1936년)
제2차 세계대전 중 독일군의 암호 '에니그마'를 해독하던 앨런 튜링은
"계산 가능한 모든 것을 계산할 수 있는 기계"의 이론적 모델을 제시했다.
튜링 머신은 단순하지만 강력한 아이디어였다:
- 무한히 긴 테이프 (메모리)
- 테이프를 읽고 쓸 수 있는 헤드
- 현재 상태를 기억하는 장치
- 상태에 따라 다음 동작을 결정하는 규칙표 (프로그램)
이 간단한 모델이 현대 컴퓨터의 이론적 기초가 되었다. "튜링 완전(Turing Complete)"하다는 것은 튜링 머신이 할 수 있는 모든 계산을 할 수 있다는 의미다.
ENIAC: 최초의 범용 전자 컴퓨터 (1946년)
펜실베니아 대학에서 만든 ENIAC(Electronic Numerical Integrator and Computer)은
진공관 17,468개를 사용한 최초의 전자식 디지털 컴퓨터다.
그림 1.1: ENIAC - 무게 30톤, 방 하나를 가득 채운 최초의 전자 컴퓨터
ENIAC의 놀라운 성능:
- 초당 5,000번의 덧셈 (당시로서는 경이적인 속도)
- 사람이 20시간 걸리는 포탄 궤적 계산을 30초에 완료
- 전력 소비: 150kW (전구 1,500개를 켤 수 있는 양)
하지만 ENIAC은 프로그래밍이 매우 불편했다. 새로운 계산을 하려면 수천 개의 스위치와 케이블을 다시 연결해야 했다. 마치 전화 교환원이 수동으로 전화선을 연결하는 것과 비슷했다.
1.1.3 폰 노이만 구조: 현대 컴퓨터의 청사진
저장 프로그램 방식의 혁명 (1945년)
헝가리 출신 수학자 폰 노이만은 획기적인 아이디어를 제시했다:
"프로그램도 데이터처럼 메모리에 저장하자!"
이전까지는 프로그램(명령어)과 데이터를 별도로 취급했다. 폰 노이만 구조는 둘 다 메모리에 저장하여, 프로그램을 쉽게 바꿀 수 있게 했다. 이것이 현대 컴퓨터의 기본 구조가 되었다.
1. 입력장치: 외부에서 정보를 받아들임 (키보드, 마우스)
2. 출력장치: 결과를 외부로 내보냄 (모니터, 프린터)
3. 기억장치: 프로그램과 데이터를 저장 (메모리)
4. 연산장치: 실제 계산을 수행 (ALU)
5. 제어장치: 다른 장치들을 조율 (Control Unit)
1.1.4 트랜지스터에서 마이크로프로세서까지
트랜지스터의 발명 (1947년)
벨 연구소에서 발명된 트랜지스터는 진공관을 대체했다. 크기는 100분의 1,
전력 소비는 1000분의 1로 줄었다. 이것이 컴퓨터 소형화의 시작이었다.
집적회로 (IC, 1958년)
잭 킬비와 로버트 노이스가 독립적으로 발명한 집적회로는 여러 트랜지스터를
하나의 칩에 집어넣었다. 실리콘 웨이퍼 위에 회로를 "인쇄"하는 방식으로
대량 생산이 가능해졌다.
| 시대 | 기술 | 집적도 | 대표 제품 |
|---|---|---|---|
| 1960년대 | SSI (Small Scale) | 수십 개 트랜지스터 | 기본 논리 게이트 |
| 1970년대 | MSI (Medium Scale) | 수백 개 | 간단한 계산기 |
| 1980년대 | LSI (Large Scale) | 수천 개 | 초기 마이크로프로세서 |
| 1990년대~ | VLSI (Very Large) | 수백만 ~ 수십억 개 | 현대 CPU |
Intel 4004: 최초의 마이크로프로세서 (1971년)
일본 계산기 회사의 주문으로 만들어진 Intel 4004는 2,300개의 트랜지스터를
집적한 4비트 프로세서였다. 손톱만한 크기에 ENIAC과 비슷한 성능을 냈다.
무어의 법칙 (Moore's Law)
Intel 공동 창업자 고든 무어는 1965년 "집적회로의 트랜지스터 수가 2년마다 2배씩 증가한다"고 예측했다. 놀랍게도 이 예측은 50년 이상 맞아떨어졌다. 덕분에 우리는 주머니에 1970년대 슈퍼컴퓨터보다 강력한 스마트폰을 가지고 다닌다.
1.2 우리 주변의 컴퓨터들
"컴퓨터가 뭐예요?"라고 물으면 대부분 노트북이나 데스크톱을 떠올린다. 하지만 실제로 우리는 하루에 수십 개의 컴퓨터와 상호작용한다. 대부분 눈에 보이지 않을 뿐이다.
1.2.1 눈에 보이는 컴퓨터
이것들은 누구나 컴퓨터라고 인식하는 장치들이다:
- 데스크톱/노트북: 가장 전통적인 형태의 개인용 컴퓨터
- 스마트폰: 주머니 속의 컴퓨터, 전화 기능은 부가적
- 태블릿: 노트북과 스마트폰의 중간 형태
- 스마트워치: 손목 위의 컴퓨터
- 게임 콘솔: PlayStation, Xbox - 게임 전용 컴퓨터
이 컴퓨터들의 공통점은 범용성이다. 다양한 프로그램을 설치하고 실행할 수 있다. 운영체제(Windows, macOS, Android, iOS)가 있어서 사용자가 원하는 앱을 추가할 수 있다.
1.2.2 숨어있는 컴퓨터: 가전제품 속 임베디드 시스템
집 안을 둘러보면 수많은 전자제품이 있다. 놀랍게도 대부분 작은 컴퓨터를 내장하고 있다. 이런 컴퓨터를 임베디드 시스템이라고 부른다.
주방의 컴퓨터들:
- 전자레인지: 시간과 출력을 제어하는 마이크로컨트롤러 내장
- 밥솥: 온도 센서로 밥 상태를 감지하고 가열을 조절
- 냉장고: 온도 제어, 습도 조절, 스마트 기능
- 식기세척기: 물 온도, 세척 시간, 건조 과정을 프로그램으로 제어
거실과 침실의 컴퓨터들:
- TV: 스마트 TV는 작은 컴퓨터, 앱도 설치 가능
- 에어컨: 온도 센서와 연동해 자동으로 실내 온도 조절
- 공기청정기: 미세먼지 센서로 공기질을 측정하고 자동 운전
- 로봇청소기: 센서로 지도를 만들고 최적 경로를 계산
1.2.3 우리가 모르게 쓰는 컴퓨터
매일 사용하지만 컴퓨터라고 인식하지 못하는 것들도 많다:
교통 관련:
- 교통카드: NFC 칩이 들어있어 잔액을 저장하고 계산
- 자동차: 현대 자동차는 100개 이상의 ECU(전자제어장치) 탑재
- 엔진 제어: 연료 분사량, 점화 시기 조절
- ABS: 바퀴 잠김 방지
- 에어백: 충돌 감지 후 0.03초 내 작동
- 인포테인먼트: 내비게이션, 음악, 전화
- 신호등: 교통량에 따라 신호 시간을 조절하는 스마트 신호등
- 엘리베이터: 최적 경로를 계산하여 대기 시간 최소화
금융 관련:
- 신용카드/체크카드: EMV 칩은 작은 컴퓨터로 암호화 처리
- ATM: 은행 전산망과 연결된 특수 목적 컴퓨터
- POS 단말기: 카드 결제를 처리하는 전용 컴퓨터
왜 이것들도 컴퓨터일까?
컴퓨터의 정의: "프로그램에 따라 데이터를 처리하는 전자 장치"
위의 모든 기기들은:
- 입력을 받고 (센서, 버튼, 카드 접촉)
- 처리하고 (계산, 비교, 판단)
- 출력한다 (동작, 디스플레이, 신호)
그리고 이 모든 과정은 프로그램에 의해 제어된다. 따라서 이들은 모두 컴퓨터다!
1.2.4 보이지 않는 곳의 거대한 컴퓨터들
우리가 직접 보지는 못하지만, 일상생활을 지탱하는 거대한 컴퓨터들도 있다:
- 데이터센터의 서버:
- 구글 검색 = 수백만 대의 서버가 협력
- 넷플릭스 스트리밍 = 전 세계 서버에서 영상 전송
- 카카오톡 메시지 = 서버가 중계하여 전달
- 은행 전산 시스템: 초당 수만 건의 거래를 처리
- 기상청 슈퍼컴퓨터: 날씨 예측을 위한 복잡한 시뮬레이션
- 증권거래소 시스템: 마이크로초 단위로 주식 거래 처리
그림 1.2: 구글 데이터센터 - 수십만 대의 서버가 우리의 검색을 처리한다
1.3 컴퓨터 종류별 특징: 프로그래머가 알아야 할 차이점
같은 C언어로 프로그램을 작성하더라도, 어떤 컴퓨터에서 실행될지에 따라 코드를 다르게 작성해야 한다. 각 종류의 컴퓨터는 서로 다른 제약사항과 특성을 가지기 때문이다.
1.3.1 임베디드 시스템: 작지만 중요한 컴퓨터
특징: 극도로 제한된 자원
여러분이 아두이노(Arduino)로 LED를 깜빡이는 프로그램을 만든다고 생각해보자. 아두이노 우노는 다음과 같은 사양을 가진다:
- 프로그램 메모리: 32KB (Word 문서 1페이지 정도)
- RAM: 2KB (문자 2,000개 저장 가능)
- 속도: 16MHz (최신 스마트폰의 200분의 1)
이런 환경에서는 우리가 PC에서 당연하게 쓰는 것들을 쓸 수 없다:
// PC에서는 문제없는 코드 int *array = malloc(1000 * sizeof(int)); // 동적 메모리 할당 printf("Hello, World!\n"); // 화면 출력 float result = sqrt(2.0); // 복잡한 수학 함수 // 임베디드에서는 이렇게 해야 한다 int array[10]; // 정적 배열만 사용 (크기도 작게) // LED로 신호 전달 (printf 대신) digitalWrite(LED_PIN, HIGH); // 정수 연산으로 근사값 계산 int sqrt_approx = 1414; // sqrt(2) * 1000
실시간 제약: 정확한 타이밍이 생명
자동차 에어백 시스템을 생각해보자. 충돌을 감지하면 정확히 30밀리초 내에 에어백을 터뜨려야 한다. 너무 빠르면 운전자가 다치고, 너무 느리면 소용없다. 이런 시스템에서는 "평균적으로 빠르다"는 의미가 없다. 항상 정해진 시간 내에 작동해야 한다.
1. 메모리를 아껴라 - 변수 하나도 신중하게
2. 동적 할당을 피하라 - 메모리 부족 시 대처 불가
3. 무한 루프를 활용하라 - 운영체제가 없으니 직접 관리
4. 타이밍을 정확히 지켜라 - 1밀리초도 중요할 수 있다
1.3.2 개인용 PC: 편리함의 대가
특징: 풍부한 자원과 추상화
여러분이 사용하는 노트북은 대략 이런 사양을 가진다:
- RAM: 8~32GB (아두이노의 400만 배)
- 저장공간: 256GB~1TB SSD
- CPU: 4~16코어, 2~5GHz
이런 환경에서는 프로그래머의 편의를 위한 많은 기능을 제공한다:
- 운영체제: 메모리 관리, 파일 시스템, 멀티태스킹을 자동으로 처리
- 가상 메모리: 실제 RAM보다 큰 프로그램도 실행 가능
- 고수준 언어: Python, Java 같은 편리한 언어 사용 가능
- 가비지 컬렉션: 메모리를 자동으로 정리
하지만 이런 편리함에는 대가가 있다:
// Python에서 리스트 만들기 - 매우 간단! numbers = [i for i in range(1000000)] // 하지만 내부적으로는... // 1. 100만 개의 정수 객체 생성 // 2. 각 객체마다 추가 메타데이터 (타입 정보, 참조 카운트) // 3. 리스트 자체의 오버헤드 // → 실제로는 수십 MB의 메모리 사용!
성능 vs 개발 속도의 트레이드오프
PC 프로그래밍에서는 대부분 개발 속도가 실행 속도보다 중요하다. 프로그램이 0.1초에 끝나든 0.01초에 끝나든 사용자는 차이를 못 느낀다. 하지만 개발 시간이 1주일이냐 1개월이냐는 큰 차이다.
1.3.3 서버: 동시에 수천 명을 상대하기
특징: 동시성과 확장성
네이버나 구글 같은 서비스는 동시에 수백만 명이 사용한다. 하나의 컴퓨터로는 불가능하므로, 수천~수만 대의 서버가 협력한다.
서버 프로그래밍의 핵심 고민:
- 동시성: 여러 요청을 동시에 처리하기
- 멀티스레딩: 하나의 프로그램이 여러 일을 동시에
- 비동기 처리: 기다리지 않고 다른 일 먼저 처리
- 확장성: 사용자가 늘어도 대응하기
- 수직 확장: 더 좋은 서버로 교체
- 수평 확장: 서버 대수를 늘림
- 가용성: 24시간 365일 서비스 제공
- 이중화: 하나가 고장나도 다른 것이 대체
- 무중단 배포: 서비스 중단 없이 업데이트
// 웹 서버의 동시 처리 예시 (Node.js) // 10,000개의 요청이 동시에 와도 처리 가능 app.get('/user/:id', async (req, res) => { // 데이터베이스 조회 (0.1초 걸림) const user = await database.getUser(req.params.id); // 기다리는 동안 다른 요청 처리! // 전통적 방식이면 0.1초 × 10,000 = 1,000초 // 비동기 방식이면 거의 0.1초 res.json(user); });
1.3.4 슈퍼컴퓨터: 하나의 거대한 문제 해결하기
특징: 병렬 처리의 극한
날씨 예보를 위해서는 지구 전체의 대기를 시뮬레이션해야 한다. 지구를 1km × 1km × 1km 격자로 나누면 약 5억 개의 격자가 생긴다. 각 격자의 온도, 습도, 기압, 바람을 계산하려면 일반 컴퓨터로는 몇 달이 걸린다. 내일 날씨를 다음 달에 알려주면 소용없다!
슈퍼컴퓨터는 이 문제를 다음과 같이 해결한다:
- 문제 분할: 한국은 1번 컴퓨터가, 일본은 2번 컴퓨터가...
- 동시 계산: 수천 개의 프로세서가 동시에 계산
- 결과 통합: 각자 계산한 결과를 모아서 전체 그림 완성
"여자 한 명이 아기를 낳는데 9개월이 걸린다. 그럼 여자 9명이면 1개월에 낳을 수 있을까?"
당연히 안 된다! 어떤 문제는 나눌 수 없다. 슈퍼컴퓨터 프로그래머의 일은 문제를 어떻게 잘 나누고, 프로세서들이 서로 방해하지 않게 조율하는 것이다.
1.3.5 프로그래머를 위한 정리
같은 "덧셈" 프로그램도 시스템에 따라 다르게 작성해야 한다:
| 시스템 | 주요 고려사항 | 프로그래밍 스타일 |
|---|---|---|
| 임베디드 | 메모리 절약 전력 효율 실시간 응답 |
저수준 언어 (C, 어셈블리) 정적 메모리 할당 비트 연산 활용 |
| PC | 개발 속도 사용자 경험 호환성 |
고수준 언어 (Python, Java) 라이브러리 활용 GUI 프로그래밍 |
| 서버 | 동시 처리 확장성 안정성 |
비동기 프로그래밍 마이크로서비스 로드 밸런싱 |
| 슈퍼컴퓨터 | 병렬화 통신 최소화 부하 균등 |
MPI, OpenMP 도메인 분할 벡터 연산 |
각 시스템은 다른 도구와 접근법이 필요하다. 훌륭한 프로그래머는 상황에 맞는 적절한 기술을 선택할 줄 안다.
정리
이번 파트에서는 컴퓨터의 역사를 통해 현대 컴퓨터의 기본 개념을 이해하고, 우리 주변의 다양한 컴퓨터를 인식하며, 각 종류별 특징이 프로그래밍에 미치는 영향을 살펴보았다.
핵심 요점:
- 컴퓨터는 기계식 계산기에서 시작해 전자식으로 진화했다
- 폰 노이만 구조가 현대 컴퓨터의 기본이 되었다
- 우리 주변에는 수십 개의 보이지 않는 컴퓨터가 있다
- 각 종류의 컴퓨터는 다른 제약과 특성을 가진다
- 프로그래머는 타겟 시스템에 맞게 코드를 작성해야 한다
'강의 > 컴퓨터 구조' 카테고리의 다른 글
| 데이터의 표현 - Part2 (0) | 2025.09.19 |
|---|---|
| 데이터의 표현 - Part1 (0) | 2025.09.19 |
| 컴퓨터 구조 개론 - Part 3 (1) | 2025.09.12 |
| 컴퓨터 구조 개론 - Part 2 (0) | 2025.09.12 |