사전 하드웨어
개념

하드웨어

gabury1고친 사람 github-actions[bot]

하드웨어는 프로그램이 시킨 일을 직접 해내는 기계 부분입니다. 계산과 데이터 보관, 다른 기계와의 통신이 그 일입니다. 무엇을 할지는 그 위에서 도는 소프트웨어가 정합니다.

쉽고 빠른 이해

하드웨어는 코드를 돌리는 물리적인 기계입니다. 서버 한 대 안의 계산 칩과 메모리, 디스크, 네트워크 카드가 그것입니다.

코드는 글자로 적은 명령일 뿐이라 혼자서는 아무 일도 못 합니다. 명령을 읽고 전기 신호로 계산해 줄 기계가 있어야 프로그램이 돕니다.

어떻게 도나:

  1. 계산 칩이 메모리에서 명령과 데이터를 읽습니다
  2. 계산한 결과를 다시 메모리에 씁니다
  3. 오래 남길 것은 디스크로, 밖에 보낼 것은 네트워크 카드로 넘깁니다

하드웨어는 코드가 못 넘는 선을 긋습니다. 속도와 용량은 부품이 정합니다. 코드를 고쳐도 그 선은 못 넘습니다. 부품은 오래 쓰면 닳아서 고장 납니다.

상세

피아노와 악보를 떠올려 보면 됩니다. 소리를 내는 것은 피아노입니다. 어떤 곡을 칠지는 악보가 정합니다. 같은 피아노로 악보만 바꾸면 전혀 다른 곡이 나옵니다.

하드웨어는 컴퓨터를 이루는 물리적인 부품입니다. 손으로 만질 수 있고 전기로 움직입니다. 서버 한 대를 열면 보이는 칩과 기판, 저장 장치, 전원 장치가 모두 하드웨어입니다.

소프트웨어는 그 반대편에 섭니다. 하드웨어에 무엇을 할지 적어 둔 명령의 모음입니다. 백엔드 개발자가 짜는 서버 프로그램도, 그 아래의 운영체제도 소프트웨어입니다.

둘을 나눠 두면 같은 기계로 여러 일을 할 수 있습니다. 기계를 새로 만들지 않고 프로그램만 바꿔 싣습니다. 컴퓨터가 계산기와 다른 점이 여기 있습니다.

하드웨어를 이루는 부품

컴퓨터 하드웨어는 하는 일에 따라 몇 갈래로 나뉩니다. 서버든 노트북이든 스마트폰이든 이 갈래는 같습니다. 아래 표는 갈래마다 하는 일과 서버에서 만나는 이름을 나란히 놓습니다.

갈래 하는 일 서버에서 만나는 이름
처리 장치 명령을 읽어 계산한다 CPU(Central Processing Unit, 중앙 처리 장치)
주기억 장치 지금 쓰는 명령과 데이터를 잠시 담는다 메모리
저장 장치 데이터를 오래 보관한다 디스크
입출력 장치 바깥과 데이터를 주고받는다 네트워크 카드 · 키보드 · 화면
연결 장치 부품 사이로 데이터를 나른다 메인보드 · 버스

이 문서의 「디스크」는 저장 장치 전체를 가리킵니다. 흔히 쓰는 종류는 둘입니다. 하드 디스크는 빙빙 도는 자기 원판에 데이터를 적습니다. SSD(Solid State Drive, 반도체 저장 장치)는 반도체 칩에 적어서 하드 디스크보다 빠릅니다.

표에서 눈여겨볼 것은 메모리와 디스크의 차이입니다. 메모리는 빠르지만 전원이 꺼지면 내용이 사라집니다. 디스크는 느리지만 전원이 꺼져도 내용이 남습니다.

그래서 프로그램은 평소에 디스크에 들어 있습니다. 실행할 때 메모리로 올라옵니다. CPU 는 메모리에 올라온 명령과 데이터만 읽어 계산하기 때문입니다.

요청 하나가 지나가는 부품

이 소절은 백엔드 서버가 HTTP(HyperText Transfer Protocol) 요청 하나를 처리할 때 부품들이 무엇을 하는지 따라갑니다. 요청이 네트워크 카드로 들어와 응답이 다시 나갈 때까지입니다.

sequenceDiagram
    participant 네트워크카드 as 네트워크 카드
    participant 메모리
    participant CPU
    participant 디스크
    네트워크카드->>메모리: 받은 요청을 옮겨 둔다
    네트워크카드->>CPU: 인터럽트로 도착을 알린다
    CPU->>메모리: 요청을 읽고 코드를 실행한다
    CPU->>디스크: 메모리에 없는 데이터를 부탁한다
    디스크->>메모리: 데이터를 옮겨 둔다
    CPU->>메모리: 응답을 쓴다
    메모리-->>네트워크카드: 응답을 가져가 내보낸다

그림의 첫 줄에서 네트워크 카드는 CPU 를 거치지 않고 메모리에 바로 씁니다. 장치가 이렇게 메모리에 직접 데이터를 옮기는 방식을 DMA(Direct Memory Access, 직접 메모리 접근)라고 부릅니다. CPU 가 바이트를 하나씩 옮기지 않으니 그동안 다른 계산을 할 수 있습니다.

둘째 줄의 알림은 인터럽트입니다. 장치가 CPU 에 「일이 생겼다」고 보내는 신호입니다. CPU 는 하던 일을 잠시 멈추고 그 일을 처리하러 갑니다. 알림이 없으면 CPU 가 계속 장치를 들여다보며 기다려야 합니다.

디스크도 같은 방식으로 일합니다. CPU 가 부탁만 해 두면 디스크가 데이터를 메모리에 옮기고 인터럽트로 알립니다. 그 사이 CPU 는 다른 요청을 처리합니다.

응답은 같은 길을 거꾸로 나갑니다. CPU 가 메모리에 응답을 써 두면 네트워크 카드가 DMA 로 그 응답을 가져가 내보냅니다.

빠른 부품과 큰 부품

이 소절은 부품마다 빠르기와 크기가 왜 반대로 가는지 봅니다. 백엔드에서 캐시를 두는 까닭이 여기서 나옵니다.

CPU 안에도 작은 저장 공간이 있습니다. 레지스터는 CPU 가 지금 계산 중인 값을 담는 칸입니다. 계산 회로 바로 옆에 있어서 가장 빨리 읽힙니다.

CPU 캐시는 메모리에서 읽은 데이터의 복사본을 CPU 가까이 두는 공간입니다. 같은 데이터를 다시 읽을 때 메모리까지 가지 않아도 됩니다.

저장 공간 빠르기 크기 전원이 꺼지면
레지스터 · CPU 캐시 가장 빠르다 가장 작다 사라진다
메모리 빠르다 중간 사라진다
SSD 느리다 크다 남는다
하드 디스크 더 느리다 더 크다 남는다

표를 위에서 아래로 읽으면 느려지는 대신 커지고 값이 싸집니다. 빠른 부품은 회로가 비싸서 많이 달 수 없기 때문입니다. 이렇게 빠르기와 크기로 계단을 쌓은 구조를 메모리 계층이라고 부릅니다.

자주 쓰는 데이터를 빠른 계층에 복사해 두면 느린 계층까지 내려가는 일이 줄어듭니다. 이 방법이 캐싱입니다. 데이터베이스가 자주 읽는 데이터를 메모리에 올려 두는 것도 같은 이유입니다.

하드웨어 위에 쌓인 소프트웨어 계층

서버 프로그램은 하드웨어를 직접 만지지 않습니다. 그 사이에 소프트웨어가 몇 겹 섭니다. 그림은 서버 프로그램이 네트워크 카드나 SSD 에 일을 시킬 때 거치는 길을 위에서 아래로 따라갑니다.

flowchart TD
    A["서버 프로그램"] -->|"시스템 콜"| K
    subgraph OS["운영체제"]
        K["커널"] --> D["디바이스 드라이버"]
    end
    D -->|"명령"| F["부품 안의 펌웨어"]
    F --> H["네트워크 카드 · SSD 의 회로"]

맨 위의 서버 프로그램은 하드웨어 일을 운영체제에 부탁합니다. 그 부탁이 지나는 통로가 시스템 콜입니다. 파일을 읽는 함수나 소켓에 쓰는 함수는 속에서 시스템 콜을 부릅니다.

부탁을 받는 쪽은 운영체제의 핵심부인 커널입니다. 커널은 하드웨어를 여러 프로그램에 나눠 줍니다. CPU 는 짧은 시간씩 돌아가며 쓰게 합니다. 메모리는 프로그램마다 따로 떼어 줍니다.

커널이 가운데 서는 까닭은 충돌을 막으려는 것입니다. 프로그램마다 하드웨어를 직접 만지면 남의 메모리를 덮어쓸 수 있습니다. 두 프로그램이 같은 디스크 칸에 동시에 쓸 수도 있습니다. 커널이 부탁을 받아 차례로 처리하면 이런 일이 안 납니다.

커널 아래에는 디바이스 드라이버가 있습니다. 부품은 제조사마다 알아듣는 명령이 다릅니다. 드라이버는 그 차이를 감추는 커널 쪽 코드입니다. 드라이버 덕분에 서버 프로그램은 어느 회사의 네트워크 카드든 같은 방법으로 씁니다.

드라이버가 보낸 명령은 부품 안의 펌웨어가 받습니다. 펌웨어는 부품 안의 칩에 담겨 함께 팔려 나오는 소프트웨어입니다. 전원이 들어오면 가장 먼저 실행되어 부품을 깨웁니다. 그 아래가 실제 회로입니다.

하드웨어를 나눠 빌리는 방법

백엔드 개발자가 만지는 서버는 대개 기계 한 대를 통째로 쓰지 않습니다. 이 소절은 하드웨어 한 대가 여러 서버로 쪼개져 빌려지는 방식을 봅니다.

하드웨어 한 대를 여러 대처럼 나눠 쓰게 하는 기술이 가상화입니다. 서버 하나가 기계 한 대를 다 쓰지 못할 때 남는 CPU 와 메모리를 다른 서버에 돌립니다.

가상화로 나눠 낸 컴퓨터 하나하나가 가상 머신입니다. 가상 머신마다 운영체제가 따로 뜹니다. 가상 머신은 저마다 기계 한 대를 가진 것처럼 돕니다.

나누는 일은 하이퍼바이저가 맡습니다. 하이퍼바이저는 진짜 하드웨어 위에서 CPU 와 메모리를 가상 머신마다 떼어 주는 소프트웨어입니다.

클라우드에서 서버를 빌릴 때 CPU 개수와 메모리 크기를 고릅니다. 이 선택이 곧 하드웨어를 고르는 일입니다. 실물 기계는 데이터 센터에 있고 여러 고객이 나눠 씁니다.

나눠 써도 아래의 하드웨어는 하나입니다. 같은 기계에 올라간 다른 가상 머신이 디스크를 몰아 쓰면 내 서버도 느려질 수 있습니다.

이런 간섭을 피하려고 기계 한 대를 혼자 빌리기도 합니다. 가상화 없이 기계를 통째로 빌리는 방식을 베어메탈이라고 부릅니다.

한 가지 일에 맞춘 하드웨어

CPU 는 무엇이든 계산하는 범용 칩입니다. 어떤 일은 그 일만 하도록 만든 회로가 훨씬 빨리 해냅니다. 이 소절은 그런 전용 하드웨어를 봅니다.

GPU(Graphics Processing Unit, 그래픽 처리 장치)가 대표입니다. 같은 계산을 많은 데이터에 한꺼번에 하는 칩입니다. 화면의 점 수백만 개를 동시에 칠하려고 만들었습니다. 지금은 기계 학습처럼 같은 곱셈을 끝없이 되풀이하는 일에도 씁니다.

소프트웨어로 하던 일을 이런 전용 회로에 넘기는 것을 하드웨어 가속이라고 부릅니다. 브라우저가 화면 그리기를 GPU 에 맡기는 것이 흔한 예입니다.

전용 회로의 대가는 정해진 일만 한다는 것입니다. 새 계산 방식이 나오면 회로를 고칠 수 없습니다. 칩을 새로 사야 합니다.

코드로 못 넘는 선

하드웨어는 프로그램이 넘을 수 없는 선을 긋습니다. 이 소절은 그 선 셋을 봅니다. 속도, 용량, 고장입니다.

속도의 선은 부품마다 다릅니다. 앞의 표에서 본 대로 SSD 와 하드 디스크는 메모리보다 느립니다. 요청 하나가 디스크를 기다리면 코드를 아무리 다듬어도 그만큼은 걸립니다.

용량의 선은 메모리에서 먼저 드러납니다. 메모리가 가득 차면 운영체제가 프로그램을 멈추지 않으려고 일부를 디스크로 밀어냅니다. 이를 스와핑이라고 부릅니다. 그러면 느린 디스크를 자주 기다리게 되어 서버 전체가 느려집니다.

선에 닿으면 하드웨어를 늘립니다. 먼저 떠올리는 방법은 기계 한 대의 부품을 더 빠르고 큰 것으로 바꾸는 것입니다. 이 방법이 수직 확장입니다. 코드는 그대로 둬도 됩니다. 대신 한 기계에 달 수 있는 부품에는 끝이 있습니다.

그 끝을 넘으려면 기계의 대수를 늘려 일을 나눕니다. 이 방법은 수평 확장입니다. 요청을 여러 기계에 나눠 보내므로 한 대의 한계에 묶이지 않습니다.

고장은 피할 수 없는 선입니다. 디스크는 오래 쓰면 닳아서 언젠가 읽히지 않습니다. 전원 장치나 메모리도 갑자기 멈춥니다.

그래서 데이터를 여러 디스크나 여러 서버에 똑같이 적어 둡니다. 이것을 복제라고 부릅니다. 한 곳이 고장 나도 다른 곳에 남은 사본으로 이어서 일합니다.

한 서버 안에서는 디스크 여러 개를 한 개처럼 묶어 씁니다. 이 방식이 RAID(Redundant Array of Independent Disks, 독립 디스크 중복 배열)입니다. 묶는 방법에 따라 디스크 한 개가 고장 나도 데이터가 남습니다.

하드웨어라는 이름

영어 hardware 는 원래 쇠로 만든 공구와 철물을 가리키던 말입니다. 컴퓨터의 기계 부분도 이 말로 부르게 됐습니다. 그 위에서 도는 프로그램에는 짝이 되는 이름 software 가 붙었습니다.

회사 이야기에서는 하드웨어가 기기 제품을 뜻하기도 합니다. 「하드웨어 사업」이라고 하면 게임기나 노트북처럼 부품을 모아 완성한 기기를 만들어 판다는 뜻입니다. 가리키는 물건은 이 문서의 하드웨어와 같습니다.

관련 항목

하드웨어를 이루는 부품

CPU · 메모리 · 디스크 · SSD · 하드 디스크 · 네트워크 카드 · 메인보드 · 버스 · 전원 공급 장치

하드웨어 위에서 도는 소프트웨어

소프트웨어 · 펌웨어 · 운영체제 · 커널 · 디바이스 드라이버 · 응용 프로그램

부품과 소프트웨어가 데이터를 넘기는 수단

DMA · 인터럽트 · 시스템 콜 · 메모리 맵 입출력 · PCIe

빠르기와 크기로 나뉜 저장 계층

레지스터 · CPU 캐시 · 메모리 계층 · 캐싱 · 비휘발성 메모리 · 스와핑

하드웨어를 나눠 쓰게 하는 기술

가상화 · 가상 머신 · 하이퍼바이저 · 컨테이너 · 베어메탈 · 데이터 센터 · 클라우드

한 가지 일에 맞춘 전용 하드웨어

GPU · 하드웨어 가속 · 하드웨어 보안 모듈 · FPGA · ASIC · SoC

하드웨어의 한계를 넘는 확장 방법

수직 확장 · 수평 확장 · 복제 · RAID · 이중화

하드웨어의 설계를 다루는 분야

컴퓨터 구조 · 폰 노이만 구조 · 명령어 집합 구조 · 임베디드 · 마이크로컨트롤러

다른 이름: hardware · 컴퓨터 하드웨어