GPT Archiving

프로세스, 스레드, 멀티프로세스, 멀티스레드, synchronized

99duuk 2025. 3. 8. 15:52

프로세스와 스레드 "알잘딱" 요약

  1. 프로세스 (Process):

    • 정의: 실행 중인 프로그램 하나하나. 운영체제에서 독립적인 실행 단위입니다.
    • 특징:
      • 각 프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가집니다.
      • 예: 크롬 브라우저 실행 = 한 프로세스, 워드 실행 = 또 다른 프로세스.
    • 비유: 공장 하나. 공장마다 자기만의 자재와 설비가 따로 있음.
  2. 스레드 (Thread):

    • 정의: 프로세스 안에서 실행되는 작업 단위. 프로세스의 자원을 공유하면서 실행됩니다.
    • 특징:
      • 한 프로세스 안에 여러 스레드가 있을 수 있고, 이들은 프로세스의 메모리(코드, 데이터, 힙)를 공유합니다.
      • 하지만 각 스레드는 독립적인 스택(실행 흐름)을 가집니다.
    • 비유: 공장 안의 작업자들. 자재(메모리)는 공유하지만 각자 맡은 일(스택)은 따로 함.
  3. 차이점 "알잘딱":

    • 프로세스: 독립적인 공장 → 서로 메모리 공유 X, 통신하려면 IPC(프로세스 간 통신) 필요.
    • 스레드: 공장 안 작업자 → 같은 프로세스 안에서 메모리 공유 O, 가볍고 빠름.
    • 질문에서 "스레드가 공유 자원"이라고 하셨는데, 정확히는 스레드가 공유 자원을 사용하는 주체입니다. 공유 자원은 프로세스의 메모리(변수, 데이터 등).

멀티프로세스 vs 멀티스레드

  1. 멀티프로세스 (Multi-Processing):

    • 정의: 여러 프로세스가 동시에(또는 병렬로) 실행되는 것.
    • 특징: 각 프로세스가 독립적이어서 서로 간섭 X, 안정적이지만 자원 소모 큼.
    • : 크롬 탭마다 별도 프로세스 → 하나 죽어도 다른 탭은 괜찮음.
  2. 멀티스레드 (Multi-Threading):

    • 정의: 한 프로세스 안에서 여러 스레드가 동시에(또는 병렬로) 실행되는 것.
    • 특징: 메모리 공유로 효율적이지만, 공유 자원(변수 등)에 동시에 접근하면 문제가 생길 수 있음.
    • : 한 프로그램에서 파일 읽기 스레드 + UI 업데이트 스레드.

레이스 컨디션 (Race Condition)이란?

  • 정의: 여러 스레드가 공유 자원(예: 변수)에 동시에 접근해서 수정하려 할 때, 실행 순서에 따라 결과가 달라지는 문제.
  • 예시:
    int count = 0;
    // 스레드 1: count++ (0 -> 1)
    // 스레드 2: count++ (0 -> 1) ← 동시에 접근하면 2가 아니라 1이 될 수도 있음!
  • 질문에서 "변수를 각 스레드가 접근할 때 값을 보장"하려는 뉘앙스 → 맞습니다! 이게 레이스 컨디션을 방지하려는 목적이에요.

synchronized와 동시성 제어

네, 질문하신 대로 정리하면:

  1. 멀티스레딩에서 레이스 컨디션 방지:

    • 여러 스레드가 공유 자원에 접근할 때, 순서가 꼬이면 데이터가 망가질 수 있음(레이스 컨디션).
    • 이를 방지하는 방법 중 하나가 synchronized를 사용하는 겁니다.
  2. synchronized의 역할:

    • 동기적으로 실행: 한 번에 한 스레드만 synchronized 블록/메서드 안으로 들어갈 수 있음.
    • 락(Lock) 걸기: 해당 코드에 접근하려는 스레드는 락을 획득해야 하고, 락을 가진 스레드가 끝날 때까지 다른 스레드는 대기.
    • 비유: 화장실 문 잠갔다고 생각하면 됨. 한 명이 들어가서 볼일 보고 나와야 다음 사람이 들어감.
  3. 예시:

    public class Counter {
        private static int count = 0;
    
        public static synchronized void increment() {
            count++; // 이 부분을 한 스레드만 실행 가능
        }
    }
    • 스레드 1이 increment() 실행 중이면, 스레드 2는 대기 → 레이스 컨디션 방지.

질문 정리

"프로세스와 스레드는 그런 차이가 있고, 멀티스레딩에서 레이스컨디션을 방지하는 방법 중 하나가 synchronized를 사용해 동시성을 제어하는 건가?"

  • 네, 딱 맞습니다!
    • 프로세스: 독립적인 실행 단위.
    • 스레드: 프로세스 안에서 자원 공유하며 실행.
    • 멀티스레딩: 여러 스레드가 동시에 돌다가 공유 자원 접근 시 레이스 컨디션 발생 가능.
    • synchronized: 락을 걸어 동시 접근을 막고 순차 실행 강제 → 레이스 컨디션 해결.

"synchronized는 동기적으로 사용하는데, 사용할 때 락을 걸어서 다른 스레드가 기다리도록 제어하는거고?"

  • 네, 정확해요! 락을 걸어서 한 스레드가 작업 끝날 때까지 다른 스레드는 대기하게 만듭니다.

추가로 기억할 포인트

  • synchronized는 클래스 락 vs 객체 락:
    • static synchronized: 클래스 전체에 락.
    • 인스턴스 메서드 synchronized: 특정 객체에 락.
  • 한계: 너무 많이 쓰면 성능 저하 → 꼭 필요한 곳에만 사용.

'GPT Archiving' 카테고리의 다른 글

싱글턴 패턴 - 4가지 구현 방법  (0) 2025.03.08
싱글톤 패턴 - Double-Checked Locking (volatile)  (0) 2025.03.08
ReentrantReadWriteLock  (0) 2025.03.06
volatile, double-checked-lock  (0) 2025.03.06
volatile  (0) 2025.03.06