스레드(Thread).
스레드(Thread)는 독립적으로 실행되는 작업의 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 각 스레드는 동시에 실행될 수 있습니다. 스레드를 사용하여 동시에 여러 작업을 수행하면 시스템의 자원을 효율적으로 활용할 수 있습니다.
스레드의 개념을 이해하기 위해서는 다음과 같은 개념들을 알아야 합니다:
프로세스(Process).
프로세스는 실행 중인 프로그램을 의미합니다.
각 프로세스는 독립된 메모리 공간을 가지며, 프로세스 간에는 메모리가 분리되어 있습니다.
각 프로세스는 최소한 하나의 스레드(메인 스레드)를 가지고 있습니다.
멀티스레딩(Multithreading).
멀티스레딩은 하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 것을 의미합니다.
멀티스레딩을 사용하면 여러 작업을 병렬로 실행하여 시스템의 성능을 향상시킬 수 있습니다.
메인 스레드(Main Thread).
메인 스레드는 프로그램이 시작되면 자동으로 생성되는 기본 스레드입니다.
메인 스레드는 프로그램의 진입점(main() 메서드)에서 시작되며,
다른 스레드를 생성하고 관리하는 역할을 수행합니다.
스레드 생성.
Java에서는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하여 새로운 스레드를 생성할 수 있습니다.
Thread 클래스를 상속받은 경우, run() 메서드를 오버라이딩하여 스레드의 동작을 정의합니다.
Runnable 인터페이스를 구현한 경우, run() 메서드를 구현하여 스레드의 동작을 정의하고, Thread 객체를 생성하여 실행합니다.
스레드 실행.
스레드는 start() 메서드를 호출하여 실행합니다.
start() 메서드를 호출하면 스레드가 생성되고, run() 메서드가 실행됩니다.
run() 메서드는 직접 호출하지 않고, start() 메서드를 통해 실행되어야 합니다.
스레드 상태.
스레드는 여러 가지 상태를 가질 수 있습니다.
주요 상태에는 준비(Ready), 실행(Running), 일시 정지(Blocked 또는 Waiting), 종료(Terminated) 등이 있습니다.
스레드는 상태 간의 전이를 경험하며, 이는 스케줄링 알고리즘에 따라 결정됩니다.
동기화(Synchronization).
멀티스레드 환경에서 여러 스레드가 공유된 자원에 동시에 접근할 때 문제가 발생할 수 있습니다.
동기화는 스레드 간의 실행 순서를 조절하거나 공유 자원의 접근을 제어하여 일관성을 유지하는 메커니즘을 말합니다.
스레드를 사용하면 병렬로 작업을 처리할 수 있으므로, 시간이 많이 소요되는 작업이나 동시에 처리해야 하는 작업을 효율적으로 다룰 수 있습니다. 하지만 멀티스레딩은 동기화, 경합 조건(Race Condition), 교착상태(Deadlock) 등의 문제에 대한 주의가 필요합니다. 적절한 스레드 관리와 동기화 기법을 사용하여 이러한 문제를 예방하고 해결할 수 있습니다.
스레드의 장단점.
장점.
동시성(Concurrency): 스레드를 사용하면 여러 작업을 동시에 실행할 수 있습니다. 이를 통해 시스템 자원을 효율적으로 활용하고 작업을 병렬로 처리할 수 있습니다.
반응성(Responsiveness): 스레드를 사용하면 응용 프로그램이 사용자 입력에 신속하게 응답할 수 있습니다. 장기 실행 작업이 메인 스레드를 차단하지 않고 백그라운드에서 실행될 수 있기 때문입니다.
자원 공유(Shared Resources): 스레드는 같은 프로세스 내에서 메모리를 공유할 수 있습니다. 이를 통해 데이터 공유 및 통신이 용이해지며, 여러 스레드 간의 협력적인 작업이 가능합니다.
경제성(Economy): 스레드는 프로세스의 생성 및 관리 비용보다 적은 비용으로 생성하고 관리할 수 있습니다. 이로 인해 자원 효율성이 향상되고 시스템 부하가 감소합니다.
단점.
동기화 문제(Synchronization Issues): 여러 스레드가 공유된 자원에 동시에 접근할 때 동기화 문제가 발생할 수 있습니다. 경합 조건(Race Condition)이나 교착상태(Deadlock)와 같은 문제를 해결하기 위해 적절한 동기화 메커니즘을 구현해야 합니다.
복잡성(Complexity): 멀티스레드 프로그래밍은 단일 스레드 프로그래밍보다 복잡합니다. 스레드 간의 상호작용, 공유 데이터의 동기화, 스레드 스케줄링 등 다양한 요소를 고려해야 합니다.
성능 저하(Performance Overhead): 스레드 간의 전환 및 동기화 작업은 오버헤드를 발생시킬 수 있습니다. 스레드 간의 경합이나 블로킹 작업은 성능을 저하시킬 수 있으며, 스레드의 수가 많을수록 오버헤드가 증가할 수 있습니다.
버그 발생 가능성(Bug Prone): 스레드 간의 상호작용은 버그 발생 가능성을 높일 수 있습니다. 경쟁 조건이나 동기화 오류 등에 주의해야 하며, 디버깅이 어려울 수 있습니다.
스레드를 사용하는 것은 병렬 처리와 반응성을 향상시킬 수 있지만, 동기화 문제와 성능 오버헤드를 고려해야 합니다. 스레드 사용 시 적절한 설계와 동기화 메커니즘, 디버깅 기술을 적용하여 장단점을 고려하고 문제를 해결할 수 있습니다.
데드락, 스타베이션(교착상태, 기아상태)
데드락(Deadlock)과 스타베이션(Starvation)은 멀티스레드 환경에서 발생할 수 있는 문제입니다.
데드락(Deadlock).
데드락은 두 개 이상의 스레드가 서로가 점유한 자원을 기다리며 무한히 대기하는 상태를 말합니다.
데드락은 네 가지 필요 조건이 동시에 충족될 때 발생합니다.
- 상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 스레드만이 점유할 수 있습니다.
- 점유와 대기(Hold and Wait): 스레드가 자원을 점유한 상태에서 다른 자원을 기다리고 있습니다.
- 비선점(No Preemption): 스레드가 점유한 자원을 다른 스레드가 강제로 빼앗을 수 없습니다.
- 순환 대기(Circular Wait): 스레드 간에 자원을 순환 형태로 대기하고 있습니다.
데드락은 시스템이 정지 상태에 빠질 수 있으며, 데드락 상태에 있는 스레드들은 진행할 수 없게 됩니다.
데드락을 해결하기 위해서는 데드락 발생 조건 중 하나를 제거하거나,
데드락 탐지 및 회피 등의 알고리즘을 사용해야 합니다.
스타베이션(Starvation).
스타베이션은 한 스레드가 자원을 영구적으로 기다리며 실행이 제한되는 상태를 말합니다.(우선순위)
스타베이션은 공정한 자원 할당이 이루어지지 않을 때 발생할 수 있습니다.
예를 들어, 우선순위가 낮은 스레드가 항상 우선순위가 높은 스레드에게 자원이 할당되는 경우 스타베이션 문제가 발생합니다.
스타베이션을 해결하기 위해서는 공정한 자원 할당을 위한 우선순위 스케줄링, 대기 시간 제한, 우선순위 상호 변경 등의 방법을 사용할 수 있습니다.
데드락과 스타베이션은 멀티스레드 환경에서 자원 관리와 스케줄링에 대한 주의가 필요한 문제입니다. 이러한 문제를 방지하고 해결하기 위해서는 적절한 동기화 기법, 자원 관리 전략, 스레드 스케줄링 알고리즘 등을 적용하여 안정적인 멀티스레드 프로그램을 개발해야 합니다.
'COMPUTER SCIENCE' 카테고리의 다른 글
파일 시스템 개념과 inode 작동 방식 이해 (0) | 2023.06.11 |
---|---|
물리 메모리와 가상메모리, MMU와 TLB, 가상메모리 알고리즘 (0) | 2023.06.11 |
멀티 프로세서의 프로세스 커뮤니케이션(IPC) 이해 (0) | 2023.06.08 |
프로세스 구조와 콘텍스트 스위치 이해하기 (0) | 2023.06.08 |
CPU 스케쥴링 및 스케쥴링 알고리즘 (0) | 2023.06.07 |