본문 바로가기

프로세스와 스레드: 한 컴퓨터에서 여러 작업이 동시에 돌아가는 원리

📑 목차

    한 컴퓨터에서 어떻게 여러 일을 “동시에” 할 수 있을까

    컴퓨터를 사용할 때 음악을 들으면서 웹 브라우저로 검색을 하고, 동시에 메신저로 대화를 나누는 일이 자연스럽게 느껴진다. 화면만 보면 여러 작업이 동시에 돌아가는 것처럼 보인다. 그러나 내부에서는 CPU가 한순간에 하나의 작업만 처리할 수 있음에도 불구하고, 운영체제는 여러 작업을 거의 동시에 처리되는 것처럼 보이게 만든다.

    이때 핵심이 되는 개념이 프로세스(Process)와 스레드(Thread)이다. 두 단어 모두 “프로그램 실행 단위”와 관련이 있지만, 실제로는 역할과 사용 목적이 분명히 다르다. 프로세스와 스레드의 차이를 이해하면, 다음과 같은 궁금증을 스스로 설명할 수 있게 된다.

    • 왜 같은 컴퓨터에서 여러 프로그램이 동시에 돌아가는 것처럼 보이는지
    • 같은 프로그램 안에서도 여러 작업이 동시에 진행되는 이유는 무엇인지
    • 어떤 경우에 컴퓨터가 갑자기 버벅거리거나 멈춘 것처럼 느껴지는지

    이 글에서는 프로세스, 스레드, 멀티태스킹, 멀티스레딩, 운영체제를 핵심 키워드로 삼아, 전산학 비전공자도 이해할 수 있도록 개념 정의 → 원리 → 실제 사례와 주의점 순서로 설명한다.


    프로세스와 스레드의 개념과 기본 원리

    1. 프로세스란 무엇인가: 실행 중인 프로그램의 기본 단위

    먼저 프로세스(Process)부터 살펴본다. 전산학에서 프로세스는 보통 “실행 중인 프로그램의 인스턴스”라고 설명한다. 조금 풀어 쓰면 다음과 같다.

    • 하드디스크나 SSD에 저장된 프로그램 파일은 그 자체로는 단순한 정적인 코드 덩어리이다.
    • 사용자가 아이콘을 클릭해 프로그램을 실행하는 순간, 운영체제는
      • 해당 실행 파일을 메모리(RAM)로 올리고,
      • CPU가 실행할 수 있도록 준비하며,
      • 필요한 자원을 배정하여 하나의 독립된 실행 단위를 만든다.
    • 이 “실행 중인 프로그램 + 할당된 메모리 + 열어 둔 파일 + 각종 자원 상태”의 묶음을 프로세스라고 부른다.

    프로세스의 중요한 특징은 다음과 같다.

    1. 독립된 메모리 공간을 가진다.
      • 각 프로세스는 자신만의 코드 영역, 데이터 영역, 스택, 힙을 가진다.
      • 기본적으로 다른 프로세스의 메모리 영역에 마음대로 접근할 수 없다.
      • 이는 안정성과 보안을 위해 매우 중요하다.
    2. 자기만의 자원 집합을 가진다.
      • 프로세스는 열어둔 파일, 네트워크 소켓, 장치 핸들 등 자신만의 자원을 가진다.
      • 운영체제는 프로세스별로 자원을 기록하고 관리한다.
    3. 운영체제가 관리하는 스케줄링 단위이다.
      • 운영체제는 여러 프로세스 사이에서 CPU 시간을 분배한다.
      • 어느 프로세스에 언제 CPU를 줄지 결정하는 일을 스케줄러(Scheduler)가 담당한다.

    한마디로, 프로세스는 “운영체제가 자원과 실행을 관리하기 위한 가장 기본적인 단위”라고 볼 수 있다.

    2. 스레드란 무엇인가: 프로세스 안에서 일을 나누는 더 작은 실행 흐름

    스레드(Thread)는 보통 “프로세스 안에서 실제로 실행되는 작업 흐름의 단위”라고 설명한다. 스레드를 이해하려면 먼저 다음 사실을 짚을 필요가 있다.

    • 하나의 프로세스는 코드, 데이터, 메모리 공간 등 큰 틀의 자원을 갖고 있다.
    • 그러나 “실행 흐름”은 하나일 수도 있고, 여러 개일 수도 있다.

    이때 실행 흐름을 구성하는 단위가 스레드이다.

    1. 단일 스레드 프로세스
      • 프로세스 안에 실행 흐름이 하나뿐인 경우이다.
      • 예전 단순 프로그램들은 대부분 이런 형태였다.
      • 한 번에 한 가지 일만 처리한다.
    2. 멀티스레드 프로세스
      • 프로세스 안에 실행 흐름이 여러 개 있는 경우이다.
      • 각 스레드는 같은 프로세스의 메모리 공간과 자원을 공유하면서, 서로 다른 일을 동시에 진행한다.
      • 예를 들어,
        • 한 스레드는 화면을 그리는 일을 하고,
        • 다른 스레드는 네트워크 데이터를 받는 일을 하고,
        • 또 다른 스레드는 파일을 저장하는 일을 할 수 있다.

    스레드의 특징은 다음과 같다.

    • 같은 프로세스의 메모리와 자원을 공유한다.
    • CPU 입장에서는 “스케줄링 가능한 실행 단위”이므로, 프로세스가 아니라 스레드 단위로도 CPU를 번갈아 사용한다.
    • 스레드끼리는 서로 데이터를 공유하기 쉽지만, 그만큼 동기화 문제가 발생하기 쉽다. (예: 두 스레드가 동시에 같은 데이터를 고치는 상황 등)

    정리하면,

    • 프로세스는 집 전체에 해당하고,
    • 스레드는 그 집 안에서 일하는 여러 사람 정도로 비유할 수 있다.
      집(프로세스)은 서로 다르지만, 한 집 안 사람들(스레드)은 같은 부엌, 거실, 욕실(메모리와 자원)을 함께 쓴다.

    프로세스와 스레드: 한 컴퓨터에서 여러 작업이 동시에 돌아가는 원리
    프로세스와 스레드를 집과 사람에 비유한 구조도

    3. 프로세스와 스레드의 비교 정리

    프로세스와 스레드를 표 형식으로 비교하면 다음과 같은 차이가 있다.

    • 메모리 공간
      • 프로세스: 각자 독립된 메모리 공간을 가진다.
      • 스레드: 같은 프로세스 안에서 메모리 공간을 공유한다.
    • 자원 사용
      • 프로세스: 파일, 장치, 소켓 등을 각각 별도로 연다.
      • 스레드: 프로세스가 가진 자원을 함께 사용한다.
    • 생성 비용
      • 프로세스: 새로운 프로세스를 만들려면 메모리 공간과 자원을 별도로 배정해야 하므로 비용이 크다.
      • 스레드: 프로세스 안에서 실행 흐름만 하나 더 만드는 것이므로 상대적으로 비용이 작다.
    • 안정성과 격리
      • 프로세스: 한 프로세스가 이상 동작을 해도 다른 프로세스에는 직접적인 영향을 덜 준다.
      • 스레드: 같은 프로세스 안 스레드 중 하나가 문제를 일으키면, 프로세스 전체가 종료될 위험이 있다.

    이 차이를 이해하면, 어떤 상황에서 프로세스를 여러 개 만들고, 어떤 상황에서 스레드를 여러 개 만드는 것이 적절한지 판단하는 데 도움이 된다.


    멀티태스킹과 멀티스레딩, 실제 동작 원리와 주의점

    1. 멀티태스킹: 여러 프로세스를 동시에 돌리는 운영체제의 기술

    사용자는 웹 브라우저, 음악 플레이어, 메신저, 문서 편집기 등 여러 프로그램을 동시에 실행한다. 이때 운영체제는 각 프로그램을 개별 프로세스로 취급하고, 다음과 같은 방식으로 멀티태스킹을 구현한다.

    1. 프로세스마다 고유한 메모리 공간과 자원 배정
      • 운영체제는 프로그램을 실행할 때마다 새로운 프로세스를 생성한다.
      • 각 프로세스는 서로 다른 메모리 공간을 가져, 서로 간섭하지 않도록 보호받는다.
    2. CPU 시간 분할
      • CPU는 한 번에 하나의 명령 흐름만 실행할 수 있다.
      • 운영체제는 CPU 시간을 매우 짧은 단위로 쪼개어 여러 프로세스에 번갈아 배정한다.
      • 이 과정을 시분할(time-sharing)이라고 한다.
    3. 문맥 교환(Context Switch)
      • 한 프로세스에서 다른 프로세스로 실행을 넘길 때,
      • 현재 프로세스의 CPU 레지스터 상태, 프로그램 카운터, 기타 정보를 저장해 두고,
      • 다음 프로세스의 상태를 복원한 뒤 실행을 이어 간다.
      • 이 전환 과정을 문맥 교환이라고 한다.

    이렇게 빠른 속도로 여러 프로세스를 오가면서 실행하기 때문에, 사람의 눈에는 여러 프로그램이 동시에 동작하는 것처럼 보인다.

    2. 멀티스레딩: 하나의 프로그램 안에서 여러 일을 동시에 처리

    멀티스레딩(Multi-threading)은 하나의 프로세스 안에서 여러 스레드가 동시에 실행되는 구조를 말한다. 예를 들어 웹 브라우저를 생각해 보자.

    • 한 스레드는 사용자의 입력(마우스, 키보드)을 처리하고,
    • 다른 스레드는 웹 페이지 내용을 네트워크로 받아오고,
    • 또 다른 스레드는 화면에 내용을 그리는 일을 할 수 있다.

    이렇게 하면 다음과 같은 장점이 있다.

    1. 반응성 향상
      • 네트워크에서 데이터를 받아오는 작업이 오래 걸리더라도,
      • 사용자 입력을 처리하는 스레드는 별도로 동작하므로 프로그램이 덜 “멈춘 것처럼” 느껴진다.
    2. CPU 활용도 증가
      • 여러 스레드가 동시에 준비되어 있다면,
      • 멀티코어 CPU 환경에서 각 코어에 다른 스레드를 배정하여 전체 작업 시간을 줄일 수 있다.
    3. 자원 공유의 효율성
      • 같은 프로세스 안에서 메모리와 자원을 공유하므로,
      • 스레드 간 데이터 교환이 프로세스 간 통신보다 상대적으로 단순하고 빠르다.

    CPU가 여러 프로세스를 번갈아 실행하는 멀티태스킹과 한 프로세스 안 여러 스레드를 분배해 실행하는 멀티스레딩 구조를 비교한 다이어그램
    멀티태스킹과 멀티스레딩에서 CPU가 작업을 나누어 처리하는 흐름도

    3. 실제 사용 예시: 우리가 매일 보는 프로세스와 스레드

    몇 가지 실제 예시를 통해 프로세스와 스레드 개념을 정리한다.

    1. 웹 브라우저
      • 크롬, 엣지 같은 브라우저는 보통 탭마다 별도의 프로세스를 만들거나, 탭 그룹별로 프로세스를 나누기도 한다.
      • 각 탭 프로세스 안에서는 화면 렌더링, 자바스크립트 실행, 네트워크 통신 등이 스레드 단위로 나뉘어 동작한다.
      • 한 탭이 오류를 일으켜도 전체 브라우저가 함께 종료되지 않도록 하기 위한 구조이다.
    2. 문서 편집 프로그램
      • 기본적인 단일 문서 편집 프로그램도
        • 화면을 갱신하는 스레드,
        • 자동 저장을 담당하는 스레드,
        • 맞춤법 검사나 배경 작업을 처리하는 스레드 등으로 나뉘어 있을 수 있다.
    3. 동영상 플레이어
      • 한 스레드는 영상 디코딩,
      • 다른 스레드는 음성 디코딩,
      • 또 다른 스레드는 재생 타이밍 조절과 자막 표시를 맡는 식으로 역할을 분담한다.

    이처럼 사용자 입장에서는 “하나의 프로그램”처럼 보이지만, 그 내부에서는 여러 스레드가 서로 협력하면서 프로그램 전체를 구성하고 있다.

    4. 동시성 문제와 주의할 점: 스레드가 많다고 항상 좋은 것은 아니다

    스레드는 자원을 공유하므로 효율적이지만, 동시에 동시성(Concurrency) 문제라는 위험도 함께 가진다. 대표적인 문제는 다음과 같다.

    1. 경쟁 조건(Race Condition)
      • 두 스레드가 동시에 같은 데이터를 읽고 쓰면서 예기치 않은 결과가 나오는 상황이다.
      • 예를 들어 은행 계좌 잔액을 두 스레드가 동시에 수정하면, 실제 입출금 내역과 다른 잔액이 저장될 수 있다.
    2. 교착 상태(Deadlock)
      • 스레드 A는 자원 1을 잡고 자원 2를 기다리고, 스레드 B는 자원 2를 잡고 자원 1을 기다리는 상황처럼
      • 서로가 서로를 기다리기만 해서 아무도 진행하지 못하는 상태이다.
    3. 문맥 교환 비용
      • 스레드를 너무 많이 만들면, 오히려 CPU가 스레드 사이를 전환하는 데 드는 비용이 늘어난다.
      • 실제 작업보다 스케줄링과 전환에 더 많은 시간을 쓰게 되어 성능이 떨어질 수 있다.

    따라서 프로그래머 입장에서는

    • 스레드 간에 공유하는 데이터를 최소화하고,
    • 잠금(Lock), 뮤텍스(Mutex), 세마포어(Semaphore) 같은 동기화 도구를 적절히 사용하며,
    • 필요한 만큼의 스레드만 생성하는 것이 중요하다.

    일반 사용자 입장에서 이 내용을 모두 알 필요는 없지만, 적어도 “스레드를 많이 만든다고 무조건 빠른 것이 아니라, 설계와 관리가 중요하다”는 점을 알고 있으면 좋다.

    5. 성능 문제를 바라보는 관점: 프로세스·스레드 기준으로 보기

    컴퓨터가 느려졌을 때, 작업 관리자(윈도우)나 활동 모니터(macOS)를 열어 보면 여러 프로세스와 그 안에서 동작하는 스레드 수를 확인할 수 있다. 이 정보를 보면 다음과 같은 판단을 할 수 있다.

    • CPU 사용률이 매우 높은 특정 프로세스가 있는지
    • 메모리를 과도하게 사용하는 프로세스가 있는지
    • 백그라운드에서 동작하는 프로세스(업데이트, 클라우드 동기화 등)가 지나치게 많은지

    이때 “프로세스와 스레드” 개념을 알고 있으면,

    • 단순히 “컴퓨터가 느리다”가 아니라,
    • “특정 프로그램이 너무 많은 작업(스레드)을 돌리고 있다”,
    • “불필요한 프로세스가 너무 많이 떠 있다”처럼 조금 더 구체적으로 상황을 이해할 수 있다.

    프로세스와 스레드를 알면 컴퓨터의 ‘동시 실행’이 논리적으로 보인다

    이 글에서는 프로세스와 스레드를 중심으로, 한 컴퓨터에서 여러 작업이 동시에 돌아가는 원리를 살펴보았다. 핵심 내용을 정리하면 다음과 같다.

    1. 프로세스는 실행 중인 프로그램의 기본 단위이다.
      • 각 프로세스는 독립된 메모리 공간과 자원을 가진다.
      • 운영체제는 프로세스를 단위로 CPU 시간과 자원을 관리한다.
    2. 스레드는 프로세스 안에서 실제로 실행되는 작업 흐름 단위이다.
      • 하나의 프로세스 안에 여러 스레드가 있을 수 있다.
      • 스레드는 같은 프로세스의 메모리와 자원을 공유하면서 서로 다른 일을 동시에 수행한다.
    3. 멀티태스킹과 멀티스레딩은 “동시에 실행되는 것처럼 보이게 만드는 핵심 기술”이다.
      • 멀티태스킹: 여러 프로세스를 번갈아 실행하여 동시에 돌아가는 것처럼 보이게 한다.
      • 멀티스레딩: 하나의 프로세스 안에서 여러 스레드를 사용해 반응성과 성능을 높인다.
    4. 스레드는 효율적이지만, 동시성 문제와 설계상의 위험도 함께 가진다.
      • 경쟁 조건, 교착 상태, 과도한 스레드 생성 등은 제대로 관리하지 않으면 성능 저하와 오류를 유발할 수 있다.
    5. 일반 사용자도 프로세스와 스레드 개념을 이해하면 성능 문제를 더 논리적으로 바라볼 수 있다.
      • “어떤 프로세스가 CPU와 메모리를 많이 쓰는지”,
      • “백그라운드 프로그램이 너무 많은지”를 프로세스·스레드 관점에서 이해할 수 있다.

    이제 “한 컴퓨터에서 어떻게 여러 작업이 동시에 돌아가는가”라는 질문에 대해, 단순히 “컴퓨터가 빠르니까 그렇다”가 아니라, 운영체제가 프로세스와 스레드를 관리하고 CPU 시간을 나누어 쓰게 만들기 때문이라고 설명할 수 있다.

    다음 단계에서 자연스럽게 이어질 수 있는 주제로는 예를 들어 다음과 같은 것들이 있다.

    • “프로세스 스케줄링 알고리즘: 어떤 작업을 먼저 실행할지 운영체제가 결정하는 기준”
    • “동시에 실행되는 것처럼 보이게 하는 기술: 동시성과 병렬성의 차이”

    이런 주제를 함께 살펴보면, 전산학에서 중요한 부분인 운영체제와 동시성 프로그래밍의 기본 개념을 더 깊이 있게 이해할 수 있을 것이다.