자바칩
[Java] 프로세스와 쓰레드 본문
프로세스와 쓰레드는 컴퓨터 프로그램을 실행하는 두 가지 기본 단위이다. 각 단위는 운영 체제에서 독립적으로 관리되며 고유한 특성을 가진다.
프로세스와 쓰레드의 차이점
프로세스
- 정의: 운영 체제에서 실행 중인 프로그램의 인스턴스
- 메모리 관리: 각 프로세스는 독립된 메모리 공간을 가진다. 프로세스 간의 메모리 공유는 기본적으로 불가능하며, IPC(Inter-Process Communication) 기법을 사용해야 한다.
- 오버헤드: 프로세스를 생성하고 관리하는 데는 많은 자원이 소모된다.
- 안정성: 한 프로세스가 실패해도 다른 프로세스에 영향을 미치지 않는다.
쓰레드
- 정의: 프로세스 내에서 실행되는 작은 단위의 작업 흐름
- 메모리 관리: 쓰레드는 프로세스 내의 메모리와 자원을 공유한다. 같은 프로세스의 모든 쓰레드는 동일한 메모리 공간에 접근할 수 있다.
- 오버헤드: 쓰레드를 생성하고 관리하는 데 드는 자원은 프로세스보다 적다.
- 안정성: 한 쓰레드가 실패하면 같은 프로세스 내 다른 쓰레드도 영향을 받을 수 있다.
프로세스와 쓰레드의 메모리 관리 차이점
- 프로세스: 각 프로세스는 독립된 메모리 공간을 가지고 있으며, 이를 통해 다른 프로세스와의 충돌을 방지한다. 프로세스 간 메모리 접근을 불가능하며, 공유 메모리나 메시지 큐와 같은 IPC 방법을 사용해야 한다.
- 쓰레드: 같은 프로세스 내의 쓰레드는 동일한 메모리 공간을 공유한다. 이는 쓰레드 간 통신이 더 빠르고 효율적이지만, 동시에 동기화 문제를 야기할 수 있다.
쓰레드 간의 동기화 문제 해결 방법
쓰레드 간의 동기화 문제는 여러 쓰레드가 공유 자원에 접근할 때 발생할 수 있다. 이를 해결하는 방법에는 다음이 있다.
synchronized 키워드: 메서드나 블록을 동기화하여 한 번에 하나의 쓰레드만 해당 코드 블록을 실행하도록 한다.
Lock 객체: 명시적으로 Lock 객체를 사용하여 더 세밀한 제어를 제공한다.
Atomic 변수: 원자성을 보장하는 클래스(AtomicInteger, AtomicBoolean 등)를 사용하여 동기화 문제를 해결할 수 있다.
volatile 키워드: 변수의 값을 쓰레드 간에 일관되게 유지할 수 있도록 한다.
프로세스 간의 통신 방법
프로세스 간 통신(IPC)은 다음과 같은 방법으로 수행된다.
- 파이프 (Pipes): 단방향 데이터 통신을 위한 방법이다.
- 메시지 큐 (Message Queues): 메시지를 전달하기 위한 큐를 사용한다.
- 공유 메모리 (Shared Memory): 여러 프로세스가 동일한 메모리 영역에 접근할 수 있게 한다.
- 소켓 (Sockets): 네트워크를 통해 프로세스 간 통신을 할 수 있다.
- 시그널 (Signals): 프로세스 간에 간단한 알림을 보낼 수 있다.
멀티쓰레딩의 장단점
장점
- 응답성: 사용자 인터페이스가 있는 응용 프로그램에서 멀티쓰레딩을 사용하면 응답성이 향상된다.
- 자원 공유: 같은 프로세스 내에서 쓰레드는 자원을 공유하므로, 효율적인 자원 사용이 가능하다.
- 다중 처리: 멀티 코어 시스템에서 여러 쓰레드를 병렬로 실행하여 성능을 향상시킬 수 있다.
단점
- 동기화 문제: 쓰레드 간 자원 공유로 인한 동기화 문제를 처리해야 한다.
- 복잡성 증가: 멀티쓰레딩 프로그램은 디버깅과 테스트가 더 어려워진다.
- 안정성: 한 쓰레드의 문제로 인해 전체 프로세스가 영향을 받을 수 있다.
쓰레드 풀(Thread Pool)의 개념과 사용 방법
개념
쓰레드 풀은 미리 생성된 쓰레드 집합으로, 작업 큐에 들어오는 작업들을 처리하기 위해 사용된다. 쓰레드 풀을 사용하면 쓰레드를 필요할 때마다 생성하고 제거하는 오버헤드를 줄일 수 있으며, 시스템 자원을 효율적으로 사용할 수 있다.
사용 방법
위 예제에서는 Executors.newFixedThreadPool(5)를 사용하여 5개의 쓰레드가 있는 쓰레드 풀을 생성한다. 작업은 executor.submit(task)를 통해 쓰레드 풀에 제출된다. 쓰레드 풀은 제출된 작업을 큐에 넣고, 사용 가능한 쓰레드가 작업을 실행한다. 작업이 모두 완료되면 executor.shutdown()을 호출하여 쓰레드 풀을 종료한다.
'Study > Java' 카테고리의 다른 글
[자바의 신] 기말고사, 기말 실습문제 (0) | 2024.05.30 |
---|---|
[자바의 신] 28장. Socket과 Datagram: 문제 풀이 (0) | 2024.05.29 |
[자바의 신] 27장. Serializable과 NIO: 문제 풀이 (0) | 2024.05.26 |
[자바의 신] 26장. I/O: 문제 풀이 (0) | 2024.05.26 |
[자바의 신] 25장. 쓰레드 (Thread): 문제 풀이 (0) | 2024.05.23 |