ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백엔드 개발자가 컴퓨터 구조를 알아야 하는 진짜 이유: 코드 한 줄 뒤의 하드웨어 세상
    CS/컴퓨터구조 2026. 1. 19. 19:54

    백엔드 개발자를 위한 컴퓨터 구조: 기초부터 실전 최적화까지

    [참고]https://www.skullkim-dev.com/2023/03/17/computer-structure-and-execute-program-process-overview/

    백엔드 개발자로 일하다 보면 우리는 대부분 추상화된 고수준 언어(Java, Python, JavaScript 등)와 프레임워크 위에서 개발합니다. 덕분에 메모리 주소를 직접 관리하거나 레지스터를 조작할 일은 거의 없죠.

    하지만 트래픽이 몰려 서버 응답이 느려지거나, 이유를 알 수 없는 시스템 병목 현상을 마주했을 때, 문제를 해결하는 열쇠는 결국 "내 코드가 하드웨어에서 실제로 어떻게 실행되는가?"를 이해하는 데 있습니다.

    오늘은 컴퓨터 구조의 핵심 요소(CPU, 메모리, I/O)를 살펴보면서, 이 기초 개념들이 어떻게 실제 백엔드 시스템 최적화와 연결되는지 정리해보았습니다.


    1. 컴퓨터의 두뇌, CPU (중앙처리장치)

    1) 기초 개념 (The Basics)

    CPU(Central Processing Unit)는 컴퓨터의 심장과 같은 존재입니다. 우리가 작성한 코드가 결국 기계어로 변환되어 실행되는 곳이며, 모든 연산과 제어가 여기서 이뤄집니다.

    CPU는 크게 다음 세 가지 구성 요소로 이루어집니다.

    • 산술논리연산장치(ALU): 덧셈, 뺄셈, 비교 같은 산술 및 논리 연산을 처리합니다.
    • 제어장치(CU): 메모리에 저장된 명령어를 읽고 해석하여 각 장치가 어떻게 동작해야 할지 제어 신호를 보냅니다.
    • 레지스터(Register): CPU 내부의 초고속 임시 저장 공간으로, 연산에 필요한 데이터를 잠시 보관합니다.

    💡 CPU의 명령어 사이클 (Instruction Cycle)
    CPU가 명령어를 실행하는 과정은 무한히 반복됩니다.

    1. 인출(Fetch): 메모리에서 명령어를 가져옵니다.
    2. 해석(Decode): 제어장치가 명령어를 분석해 동작을 결정합니다.
    3. 실행(Execute): ALU가 실제 연산을 수행합니다.
    4. 저장(Store): 결과를 레지스터나 메모리에 다시 저장합니다.

    2) 백엔드 실전 Insight

    백엔드 개발자가 주목해야 할 부분은 단순히 "CPU가 빠르다"는 것이 아니라, "CPU를 얼마나 효율적으로 사용하느냐"입니다.

    문맥 교환 (Context Switching) 비용

    우리는 많은 요청을 처리하기 위해 스레드(Thread)를 늘리곤 합니다. 하지만 CPU 코어 개수는 한정되어 있고, 실행해야 할 스레드가 많아지면 OS는 컨텍스트 스위칭을 빈번하게 수행해야 합니다.

    • 문제점: 스레드 A를 멈추고 상태를 저장한 뒤 스레드 B를 불러오는 과정 자체가 CPU 리소스를 잡아먹습니다.
    • Best Practice: Nginx나 Node.js의 싱글 스레드 이벤트 루프 모델이 효율적인 이유, 그리고 Java Tomcat의 Thread Pool 사이즈를 무조건 늘린다고 성능이 좋아지지 않는 이유가 바로 이 '교환 비용' 때문입니다.

    동시성(Concurrency) vs 병렬성(Parallelism)

    • 동시성: 싱글 코어에서 여러 작업을 번갈아 가며 처리 (논리적 동시 실행).
    • 병렬성: 멀티 코어에서 실제로 동시에 작업을 수행 (물리적 동시 실행).

    백엔드 서버 스펙을 정할 때 코어 수가 중요한 이유는 진정한 병렬 처리량을 결정하기 때문입니다. 특히 암호화나 이미지 처리 같은 CPU Bound 작업이 많다면, 물리 코어 수가 깡패입니다.


    2. 기억장치 계층 구조: 메모리에서 캐시까지

    1) 기초 개념 (The Basics)

    프로그램이 실행되려면 코드와 데이터가 메모리에 올라가 있어야 합니다. 컴퓨터는 속도와 비용의 균형을 맞추기 위해 계층 구조(Hierarchy)를 갖습니다.

    • 레지스터: CPU 내부의 가장 빠른 저장장치.
    • 캐시 메모리(Cache): L1, L2, L3 캐시로 나뉘며, CPU와 RAM 사이의 속도 차이를 완화합니다.
    • 메인 메모리(RAM): 실행 중인 프로그램 데이터가 머무는 휘발성 메모리입니다.
    • 보조기억장치(SSD/HDD): 전원이 꺼져도 데이터가 유지되는 비휘발성 장치입니다.

    💡 가상 메모리(Virtual Memory)란?
    운영체제는 물리 메모리의 한계를 극복하기 위해 RAM과 디스크를 결합해 가상 메모리를 제공합니다. 덕분에 여러 백엔드 프로세스가 동시에 실행되어도 서로의 메모리 영역을 침범하지 않고 독립적인 주소 공간을 가질 수 있습니다.

    2) 백엔드 실전 Insight

    캐시 지역성(Cache Locality)과 자료구조

    CPU가 데이터를 찾을 때 캐시에 있을 확률을 Cache Hit라고 합니다.

    • 적용: LinkedList보다 Array(List) 순회 속도가 훨씬 빠른 이유는 배열이 메모리에 연속적으로 저장되어 있어 '공간 지역성'이 높기 때문입니다. 즉, 한 번 데이터를 읽을 때 인접한 데이터를 함께 캐시에 올리기 유리합니다.

    Stack vs Heap, 그리고 GC

    • Stack: 함수 호출, 지역 변수 저장 (빠름, 자동 정리).
    • Heap: 동적으로 생성된 객체 저장 (GC 필요).
    • 적용: Java나 Python은 Heap에 쌓인 쓰레기 객체를 치우기 위해 GC(Garbage Collection)를 수행합니다. 이때 발생하는 Stop-the-world 현상은 서버의 레이턴시(Latency)를 튀게 만드는 주범입니다. 불필요한 객체 생성을 줄이는 것이 리액티브한 서버를 만드는 기본입니다.

    Redis를 사용하는 이유

    Redis 같은 In-Memory DB가 빠른 이유는 단순합니다. 디스크 I/O를 거치지 않고 RAM에서 바로 데이터를 읽기 때문입니다. 기억장치 계층 구조에서 한 단계 위(Disk → RAM)로 올라가는 것만으로도 성능은 수십~수백 배 향상됩니다.


    3. Storage & I/O: 병목은 항상 입출력에서 온다

    1) 기초 개념 (The Basics)

    • 보조기억장치(SSD, HDD): DB 파일, 로그 등이 저장되는 곳입니다. SSD의 랜덤 접근 속도가 빨라지면서 전체적인 시스템 성능이 크게 향상되었습니다.
    • 입출력장치(I/O Devices): 네트워크 통신 장치(NIC)도 포함됩니다. 우리가 클라이언트 요청을 읽고 응답을 보내는 것도 I/O 작업입니다.

    백엔드 시스템 성능 병목이 CPU보다 I/O 단계에서 자주 발생하는 이유는, CPU의 연산 속도에 비해 디스크나 네트워크의 속도가 현저히 느리기 때문입니다.

    2) 백엔드 실전 Insight

    Blocking vs Non-blocking I/O

    • Blocking: DB 조회를 요청하고 응답이 올 때까지 스레드가 아무것도 안 하고 대기(Wait)합니다.
    • Non-blocking: "DB야, 데이터 가져오면 알려줘"라고 시킨 뒤, 스레드는 다른 요청을 처리하러 갑니다.
    • 적용: Node.js나 Spring WebFlux가 적은 리소스로 대용량 트래픽을 감당하는 비결입니다. I/O 대기 시간을 낭비하지 않고 CPU를 알뜰하게 쓰는 전략입니다.

    랜덤 I/O vs 순차 I/O

    디스크 헤드가 여기저기 움직여야 하는 랜덤 I/O보다, 쭉 쓰는 순차 I/O가 압도적으로 빠릅니다.

    • 적용: 관계형 DB에서 인덱스(Index)를 타지 않는 Full Scan이 느린 이유는 디스크 전체를 랜덤하게 뒤져야 하기 때문입니다. 반면 Kafka 같은 메시지 큐는 데이터를 끝에만 추가하는(Append-only) 순차 쓰기 방식을 사용하여 디스크 속도의 한계를 극복합니다.

    4. 부품을 잇는 통로: 버스와 메인보드

    1) 기초 개념 (The Basics)

    아무리 강력한 CPU와 빠른 메모리도 서로 연결되지 않으면 무용지물입니다. 버스(Bus)는 이들을 연결하는 데이터 고속도로입니다.

    • 데이터 버스: 실제 데이터를 실어 나릅니다.
    • 주소 버스: "어디로 배달할지" 주소 정보를 전달합니다.
    • 제어 버스: 읽기/쓰기 신호를 제어합니다.

    2) 백엔드 실전 Insight (확장)

    이 개념을 서버 아키텍처 레벨로 확장하면 네트워크 대역폭(Bandwidth)과 유사합니다.

    • 적용: 아무리 DB 쿼리가 0.01초 만에 끝나고 웹 서버가 빨라도, 그 사이를 연결하는 네트워크 대역폭(Bus)이 좁다면 데이터 전송에 병목이 생깁니다. 클라우드 환경에서 인스턴스 타입을 고를 때 'Network Performance'를 확인해야 하는 이유가 바로 이 '버스의 한계'를 고려하는 것입니다.

    마치며: 하드웨어를 이해하면 코드가 보인다

    백엔드 개발자에게 컴퓨터 구조 지식은 면접용 암기 과목이 아닙니다.

    • 왜 이 쿼리는 느릴까? (Storage I/O, Index)
    • 왜 서버 메모리가 부족할까? (Heap, GC, Memory Lead)
    • 왜 동시 접속자가 늘면 CPU가 100%를 칠까? (Context Switching)

    이 모든 문제의 근본적인 원인은 하드웨어 리소스의 물리적 한계와 특성에 있습니다. 이 원리를 이해하고 코드를 작성한다면, 여러분은 단순히 "기능을 구현하는 개발자"를 넘어 "시스템 전체를 최적화할 수 있는 엔지니어"로 성장할 수 있을 것입니다.

Designed by Tistory.