스레드와 동기화
스레드와 동기화에 대해 1. 스레드란? 스레드(Thread)는 프로세스 내에서 실행되는 가장 작은 작업 단위입니다.
하나의 프로세스는 한 개 이상의 스레드를 가질 수 있으며, 이들은 같은 메모리 공간(코드, 데이터, 힙 영역 등)을 공유하면서 각각 독립적으로 실행됩니다.
- 프로세스(Process) : 운영체제에서 실행 중인 프로그램의 인스턴스. 독립된 메모리 공간을 갖음. - 스레드(Thread) : 프로세스 내에서 실행되는 흐름의 단위. 같은 프로세스 내 다른 스레드와 메모리를 공유. 예를 들어, 웹 브라우저 하나가 프로세스라면, 한 프로세스 내에서 웹페이지 렌더링, 사용자 입력 처리, 네트워크 통신 등을 각각 스레드로 처리할 수 있습니다.
2. 멀티스레딩의 장점 - 병렬 처리 : 여러 작업을 동시에 처리하여 성능 향상 가능(특히 멀티코어 CPU 환경에서). - 반응성 향상 : UI 스레드는 사용자 입력을 처리하면서 백그라운드 스레드가 무거운 작업을 수행할 수 있음. - 자원 공유 : 같은 프로세스 내에서 메모리와 자원을 공유하여 효율적. 3. 동기화(Synchronization)란? 서로 다른 스레드가 동시에 같은 자원(공유 변수, 파일, 데이터 구조 등)에 접근할 때, 데이터의 일관성 및 무결성을 보장하기 위해 접근을 조절하는 메커니즘을 동기화라고 합니다.
왜 동기화가 필요한가? 멀티스레드 환경에서는 여러 스레드가 동시에 공유 자원에 접근해 읽기/쓰기 작업을 수행할 수 있는데, 이때 불일치나 충돌이 발생할 수 있습니다.
예를 들어, 두 스레드가 하나의 은행 계좌 잔액을 동시에 업데이트할 때 동시 접근을 제어하지 않으면 잔액이 비정상적으로 변경될 수 있습니다.
4. 동기화 기법 1) 뮤텍스(Mutex, 상호배제) - 한 번에 하나의 스레드만 공유 자원에 접근하도록 잠금을 건다. - 다른 스레드는 락이 해제될 때까지 대기. 2) 세마포어(Semaphore) - 지정된 개수만큼 스레드의 자원 접근을 허용. - 이진 세마포어(값이 0 또는 1)는 뮤텍스와 유사. 3) 모니터(Monitor) - 일정한 범위의 코드에 락을 걸어 임계구역(Critical Section)을 만든다. - Java의 `synchronized` 키워드가 대표적인 예. 4) 조건 변수(Condition Variable) - 스레드가 조건을 기다리거나 대기하다가 특정 신호를 받으면 실행하도록 한다.
5. 임계 구역(Critical Section) 스레드가 동시 접근할 때 문제를 일으킬 가능성이 있는 코드 부분 또는 자원 접근 영역을 임계 구역이라고 합니다.
임계 구역은 반드시 동기화 기법으로 보호해야 합니다.
6. 데드락(Deadlock) 동기화 과정에서 두 개 이상의 스레드가 서로가 점유한 자원을 기다리며 무한 대기 상태에 빠지는 현상입니다.
데드락 상태가 되면 프로그램이 멈출 수 있으므로 주의를 기울여야 합니다.
7. 정리 | 용어 | 설명 | |-------------|---------------------------------| | 프로세스 | 독립된 메모리 공간을 가진 실행 단위 | | 스레드 | 프로세스 내에서 독립적으로 실행되는 흐름 단위 | | 동기화 | 멀티스레드 환경에서 자원 충돌을 방지하기 위한 조절 기법 | | 뮤텍스 | 하나의 스레드만 자원에 접근하도록 잠그는 방법 | | 세마포어 | 여러 스레드가 제한된 수만큼 자원에 접근 가능하도록 제어 | | 임계 구역 | 동시에 여러 스레드가 접근하면 문제를 일으키는 코드 구간 | | 데드락 | 스레드들이 서로 자원을 기다리며 무한 대기하는 상태 | --- 스레드와 동기화는 현대 소프트웨어 개발에서 성능 최적화와 안정성을 위해 매우 중요합니다.
올바른 동기화 없이는 데이터 손상이나 예기치 않은 버그가 발생하기 쉬우므로, 충분한 이해와 신중한 설계가 필요합니다.