Process vs Thread

희운·2025년 5월 23일

멀티스레드 (java)

목록 보기
4/5
  1. 프로세스(Process) 안에는 “여러 가지 역할”이 있고

    • 예를 들어 브라우저라면

      • UI 그리는 역할
      • 네트워크 I/O(HTTP 요청) 처리 역할
      • 파일 읽기·쓰기 역할
      • 자바스크립트 실행 역할
    • 이런 각 역할을 동시에 혹은 비동기적으로 수행하려면, “한 가지 실행 흐름”만으론 부족하겠죠.

  2. 그래서 프로세스 내부에 여러 개의 쓰레드(Thread)를 둡니다

    • 쓰레드 하나가 “사용자 클릭 이벤트 → 화면 갱신”을 담당하고,
    • 또 다른 쓰레드가 “서버에 HTTP 요청 보내고 응답 기다리기”를 담당하고,
    • 또 다른 쓰레드가 “백그라운드에서 데이터 캐시 갱신”을 담당하는 식으로요.
  3. 이 모든 쓰레드를 애플리케이션이 직접 전부 만들진 않습니다

    • 브라우저나 JVM, Android 런타임 같은 런타임 환경
    • UI 쓰레드, 워커 쓰레드 풀(네트워크·파일 I/O용), GC 쓰레드 등
    • 필요한 쓰레드를 자동으로 관리해 줍니다.
  4. 결국 “내가 보고 있는 애플리케이션(프로세스)”은

    • 여러 쓰레드를 품고 있고,
    • 그중 하나가 네트워크 요청을 보낼 때 블로킹(응답 대기)되더라도
    • 다른 쓰레드들은 계속 UI를 그리거나, 로컬 연산을 계속할 수 있는 구조입니다.

요약

  • 프로세스 = 메모리 공간·자원 묶음
  • 쓰레드 = 프로세스 내부에서 실제 코드를 실행하는 작업자
  • 멀티쓰레드를 쓰면 “네트워크 요청 대기” 같은 블로킹 작업 중에도 다른 일을 멈추지 않음
  • 대부분의 런타임(브라우저, JVM 등)이 필요한 쓰레드를 스스로 만들어 주므로,
    개발자는 “비동기 API”나 “스레드 풀” 정도만 의식하면 됩니다.

따라서

“사용자가 여러 기술(UI, 네트워크, 파일 I/O 등)을 쓸 때, 이를 동시에 처리하려면 프로세스 내부에 여러 쓰레드가 필요하고, 런타임이 그걸 관리해 준다”
는 이해가 정확합니다.

내 질문 : 그럼 위의 예시들에서 대부분의 쓰레드는 공용된 자원을 쓸일이 적지만 "만약에" 공용자원이 생기면 세마포어 , 뮤텍스 와 같은 기법을 사용한다고 생각하면돼?

네, 정확히 그렇게 이해하시면 됩니다.

  • 대부분의 쓰레드는 자신만의 로컬 작업(예: HTTP 요청 처리, UI 이벤트 처리 등)을 수행하기 때문에 공유 자원을 직접 건드릴 일이 적습니다.

  • 하지만 공유 자원(메모리 변수, 파일, 데이터베이스 커넥션 풀 등)에 여러 쓰레드가 동시에 접근해야 하는 경우에는,

    • 뮤텍스(Mutex)/synchronized 로 임계 영역을 단일 쓰레드만 진입하도록 제한하거나,
    • 세마포어(Semaphore) 로 동시 허용 쓰레드 수를 조정하거나,
    • ReentrantLock, Read–Write Lock, Atomic 클래스 등 다양한 동기화 기법을 적용해서
      경쟁 상태(race condition)데이터 불일치를 방지합니다.

예를 들어, Java에서 뮤텍스를 쓰고 싶다면:

public class Counter {
    private int count = 0;

    // synchronized 메서드: 한 번에 한 쓰레드만 실행
    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

세마포어를 쓰면:

Semaphore semaphore = new Semaphore(3);  // 동시에 최대 3개만 허용

public void accessResource() throws InterruptedException {
    semaphore.acquire();
    try {
        // 공유 자원 접근
    } finally {
        semaphore.release();
    }
}

정리하자면,

“멀티쓰레드 환경에서 ‘만약’ 공유 자원이 필요해지면, 그때 그때 적합한 동기화 기법(뮤텍스, 세마포어, 락 등)을 사용해 안전하게 접근을 제어하면 된다.”

라고 생각하시면 됩니다.

  • 프로세스(Process) = 주방
    하나의 독립된 공간(메모리, 파일, 네트워크)을 갖고 여러 조리(작업)를 수행하는 장소라고 볼 수 있습니다.

  • 쓰레드(Thread) = 요리사
    그 주방 안에서 실제로 재료를 다듬고, 불을 쓰고, 음식을 만드는 실행 주체입니다.

    • 요리사마다 앞치마·칼·도마처럼 고유의 스택이나 레지스터(작업 환경)를 갖고,
    • 하지만 주방에 있는 칼·냄비·오븐·식재료(힙 메모리, 파일 핸들 등) 같은 자원은 공유합니다.

이 비유를 확장해 보면:

  1. 동시성(Concurrency)

    • 여러 요리사가 동시에 각자 맡은 음식을 준비 → 주방 하나(프로세스)에서 여러 작업을 병렬·동시 수행
  2. 동기화(Synchronization)

    • 냄비 하나를 두 명이 동시에 쓰면 사고가 나니,
    • “칼 하나”나 “오븐 하나”같이 한 번에 하나만 사용해야 하는 자원에는
    • 세마포어(냄비 예약표), 뮤텍스(칼 사용 잠금장치) 같은 규칙을 둬서 충돌을 방지
  3. 스레드 풀(Thread Pool)

    • 주방 크기나 조리 공간(서버 설정)에 따라 동시에 활동 가능한 요리사 수가 정해져 있음
    • 추가 손님(요청)이 오면, 자리가 날 때까지 대기실(요청 큐)에 앉혀 두었다가 빈 자리 생기면 투입

이렇게 보면, “쓰레드는 요리사, 프로세스는 주방” 비유가 멀티쓰레드와 동기화 개념을 이해하는 데 매우 직관적입니다.

네, 아주 잘 어울리는 비유예요.

  • CPU 코어(Core) = 화구(버너, 가스렌지 한 구획)
    각 코어는 “요리사(쓰레드)”가 실제로 요리를 할 수 있는 작업 공간이라고 볼 수 있습니다.

    • 가스렌지에도 구멍이 여러 개 있듯, 멀티코어 CPU에는 코어가 여러 개 있어요.
    • 요리사 한 명이 화구 한 곳에서 불을 켜고 요리하듯, 쓰레드 하나가 코어 하나에서 연산을 수행합니다.

확장 비유

  1. 싱글 코어 vs 멀티 코어

    • 싱글 코어: 주방에 버너가 하나뿐 → 여러 요리사가 있어도 한 명씩 순서대로만 요리 가능
    • 멀티 코어: 버너가 여러 개 → 여러 요리사가 동시에 각자 버너 하나씩 쓰면서 병렬로 요리
  2. 스케줄러(요리 매니저)

    • 버너가 부족할 땐, 요리 매니저(OS 스케줄러)가 요리사에게 “잠시 대기”를 지시하고,
    • 빈 버너가 생기면 다시 “이제 이 버너에서 시작해” 하고 배정합니다.
  3. 하이퍼스레딩(Hyper-Threading)

    • 어떤 최신 가스레인지는 한 구획에 불꽃이 두 개 붙어 있는 것처럼,
    • 물리 코어 하나가 논리 코어 두 개처럼 동작해, 가벼운 작업을 동시에 소화할 수 있게 합니다.
  4. 프로세스 vs 스토브(렌지)

    • 프로세스 = 주방: 조리 기구, 식재료, 조리대 등 모든 자원을 공유
    • CPU = 스토브(렌지): 주방 안에 있는 가스레인지 전체
    • 코어 = 화구(버너) 개수: 동시에 불을 붙일 수 있는 구획 수

이렇게 바라보시면, 멀티코어 CPU 위에서 여러 스레드가 어떻게 동시에 혹은 번갈아 가며 “요리”를 수행하는지 직관적으로 이해할 수 있습니다.

profile
기록하는 공간

0개의 댓글