GPT Archiving
프로세스, 스레드, 멀티프로세스, 멀티스레드, synchronized
99duuk
2025. 3. 8. 15:52
프로세스와 스레드 "알잘딱" 요약
프로세스 (Process):
- 정의: 실행 중인 프로그램 하나하나. 운영체제에서 독립적인 실행 단위입니다.
- 특징:
- 각 프로세스는 독립적인 메모리 공간(코드, 데이터, 힙, 스택)을 가집니다.
- 예: 크롬 브라우저 실행 = 한 프로세스, 워드 실행 = 또 다른 프로세스.
- 비유: 공장 하나. 공장마다 자기만의 자재와 설비가 따로 있음.
스레드 (Thread):
- 정의: 프로세스 안에서 실행되는 작업 단위. 프로세스의 자원을 공유하면서 실행됩니다.
- 특징:
- 한 프로세스 안에 여러 스레드가 있을 수 있고, 이들은 프로세스의 메모리(코드, 데이터, 힙)를 공유합니다.
- 하지만 각 스레드는 독립적인 스택(실행 흐름)을 가집니다.
- 비유: 공장 안의 작업자들. 자재(메모리)는 공유하지만 각자 맡은 일(스택)은 따로 함.
차이점 "알잘딱":
- 프로세스: 독립적인 공장 → 서로 메모리 공유 X, 통신하려면 IPC(프로세스 간 통신) 필요.
- 스레드: 공장 안 작업자 → 같은 프로세스 안에서 메모리 공유 O, 가볍고 빠름.
- 질문에서 "스레드가 공유 자원"이라고 하셨는데, 정확히는 스레드가 공유 자원을 사용하는 주체입니다. 공유 자원은 프로세스의 메모리(변수, 데이터 등).
멀티프로세스 vs 멀티스레드
멀티프로세스 (Multi-Processing):
- 정의: 여러 프로세스가 동시에(또는 병렬로) 실행되는 것.
- 특징: 각 프로세스가 독립적이어서 서로 간섭 X, 안정적이지만 자원 소모 큼.
- 예: 크롬 탭마다 별도 프로세스 → 하나 죽어도 다른 탭은 괜찮음.
멀티스레드 (Multi-Threading):
- 정의: 한 프로세스 안에서 여러 스레드가 동시에(또는 병렬로) 실행되는 것.
- 특징: 메모리 공유로 효율적이지만, 공유 자원(변수 등)에 동시에 접근하면 문제가 생길 수 있음.
- 예: 한 프로그램에서 파일 읽기 스레드 + UI 업데이트 스레드.
레이스 컨디션 (Race Condition)이란?
- 정의: 여러 스레드가 공유 자원(예: 변수)에 동시에 접근해서 수정하려 할 때, 실행 순서에 따라 결과가 달라지는 문제.
- 예시:
int count = 0; // 스레드 1: count++ (0 -> 1) // 스레드 2: count++ (0 -> 1) ← 동시에 접근하면 2가 아니라 1이 될 수도 있음!
- 질문에서 "변수를 각 스레드가 접근할 때 값을 보장"하려는 뉘앙스 → 맞습니다! 이게 레이스 컨디션을 방지하려는 목적이에요.
synchronized
와 동시성 제어
네, 질문하신 대로 정리하면:
멀티스레딩에서 레이스 컨디션 방지:
- 여러 스레드가 공유 자원에 접근할 때, 순서가 꼬이면 데이터가 망가질 수 있음(레이스 컨디션).
- 이를 방지하는 방법 중 하나가
synchronized
를 사용하는 겁니다.
synchronized
의 역할:- 동기적으로 실행: 한 번에 한 스레드만
synchronized
블록/메서드 안으로 들어갈 수 있음. - 락(Lock) 걸기: 해당 코드에 접근하려는 스레드는 락을 획득해야 하고, 락을 가진 스레드가 끝날 때까지 다른 스레드는 대기.
- 비유: 화장실 문 잠갔다고 생각하면 됨. 한 명이 들어가서 볼일 보고 나와야 다음 사람이 들어감.
- 동기적으로 실행: 한 번에 한 스레드만
예시:
public class Counter { private static int count = 0; public static synchronized void increment() { count++; // 이 부분을 한 스레드만 실행 가능 } }
- 스레드 1이
increment()
실행 중이면, 스레드 2는 대기 → 레이스 컨디션 방지.
- 스레드 1이
질문 정리
"프로세스와 스레드는 그런 차이가 있고, 멀티스레딩에서 레이스컨디션을 방지하는 방법 중 하나가 synchronized를 사용해 동시성을 제어하는 건가?"
- 네, 딱 맞습니다!
- 프로세스: 독립적인 실행 단위.
- 스레드: 프로세스 안에서 자원 공유하며 실행.
- 멀티스레딩: 여러 스레드가 동시에 돌다가 공유 자원 접근 시 레이스 컨디션 발생 가능.
synchronized
: 락을 걸어 동시 접근을 막고 순차 실행 강제 → 레이스 컨디션 해결.
"synchronized는 동기적으로 사용하는데, 사용할 때 락을 걸어서 다른 스레드가 기다리도록 제어하는거고?"
- 네, 정확해요! 락을 걸어서 한 스레드가 작업 끝날 때까지 다른 스레드는 대기하게 만듭니다.
추가로 기억할 포인트
synchronized
는 클래스 락 vs 객체 락:static synchronized
: 클래스 전체에 락.- 인스턴스 메서드
synchronized
: 특정 객체에 락.
- 한계: 너무 많이 쓰면 성능 저하 → 꼭 필요한 곳에만 사용.