[자바 병렬 프로그래밍 - 1장 개요] 요약 정리
1.1 작업을 동시에 실행하는 일에 대한 간략한 역사
- 병렬 프로그래밍의 중요성
스레드는 멀티프로세서 시스템의 능력을 최대한 끌어낼 수 있는 가장 쉬운 방법
프로세서 개수가 늘어날수록 여러 작업을 동시에 실행하는 일이 더욱 중요함
- 여러 프로그램을 동시에 실행하는 운영체제를 개발하게 된 요인
1. 자원 활용
입출력과 같이 외부 동작 끝나기를 대기하는 경우 자원을 활용할 수 없음
기다리는 동안 다른 프로그램을 실행하도록 하는게 효율적
2. 공정성
여러 사용자와 프로그램이 컴퓨터 내 자원에 대해 동일한 권한을 가질 수 있음
3. 편의성
여러 작업을 처리하는 하나의 프로그램 작성보다 각기 일을 처리하고 조율하는 프로그램을 작성하는 것이 쉽고 바람직함
- 프로세스 개념을 만들어 낸 것과 같은 이유로 스레드가 고안됨
- 스레드로 인해 한 프로세스 안에 여러 개의 프로그램 제어 흐름이 공존 가능
- 스레드는 메모리, 파일 핸들 등 프로세스 내 할당 자원을 공유함
- 스레드는 가벼운 프로세스가 불리움
- 한 프로세스 내 스레드들은 같은 변수에 접근가능, 같은 힙에 객체 할당
=> 프로세스 보다 세밀한 단위로 데이터 공유 가능
but, 공유 데이터 접근 과정을 적절하게 동기화하지 않으면 예상치 못한 결과를 얻을 수 있음
1.2 스레드의 이점
- 스레드를 제대로 사용하면 개발, 유지 보수 비용을 줄이고 복잡한 에플리케이션의 성능 향상 가능
1.2.1 멀티프로세서 활용
- 클럭 주파수를 올리는 일이 점점 힘들어지면서 프로세서 제조 업체는 칩 하나에 점차 더 많은 프로세서 코어를 넣으려고 하고 있음
- 프로세서 스케줄링의 기본 단위는 스레드임
- 프로세서가 두 개인 시스템에서 스레드가 하나뿐인 프로그램을 실행하면 CPU 자원의 50%를 낭비하는 셈
1.2.2 단순한 모델링
- 종류별 작업마다 스레드를 하나씩 할당하면 마치 순차적인 작업 처럼 처리가능
- 스케줄링, 비동기 I/O, 자원대기 등의 부분과 비즈니스 로직을 분리 가능
=> 컴포넌트 개발 작성이 훨씬 단순해짐
1.3 스레드 사용의 위험성
1.3.1 안정성 위해 요소
동기화를 충분히 하지 않으면 연산의 순서를 예측하기 힘들다
@NotThreadSafe
Public class UnsafeSequence {
private int value
/** 유일한 값을 리턴 */
public int getNext() {
return value++;
}
}
- A, B 스레드 2개가 동시에 같은 값을 읽고 각자 1을 더할 가능성이 있음
변수값 1을 증가시키는 연산은 값을 읽고, 1을 더하고 다시 기록하는 3단계로 나뉘어짐
- 스레드간에 데이터가 공유되고 있는지를 명확하게 구분해 줘야 하는 부담을 떠 안아야 함
1.3.2 활동성 위험
어떤 작업이 전혀 진전되지 못하는 상태에 빠질 때 활동성 장애가 발생했다고 함
(예, 무한 루프)
스레드 A에서 스레드 B가 독점하고 있는 자원을 기다기고 있는데 스레드 B가 해당 자원을 절대 놓지 않는다면, 스레드 A는 영영 기다리기만 할 것임 (데드락, 소모상태, 라이브락 등)
1.3.3 성능 위험
잘 설계된 병렬 프로그램은 스레드를 사용해서 성능 향상 가능
but, 스레드가 많은 프로그램에서는 컨텍스트 스위칭이 더 빈번
=> 그에 따른 부하가 생김
실행중인 컨텍스트를 저장하고 다시 읽어들여야 하며, 메모리를 읽고 쓰는 데 있어 지역성이 손실되고, 스레드를 실행하기도 버거운 CPU 시간을 스케줄링하는 데 소모해야함
1.4 스레드는 어디에나
- 프레임워크는 프로그램 컴포넌트를 호출할 때 프레임워크 내부의 스레드에서 호출하기 때문에 자동으로 프로그램이 스레드를 활용하는 것과 동일한 효과를 줌
- 컴포넌트는 언제나 프로그램 내부의 상태에 접근하기 때문에 해당 상태에 접근하는 모든 코드 경로에 해당하는 컴포넌트 역시 스레드 안전해야 함
=> 스레드 안전성에는 전염성이 있다
- 서블릿과 JSP
여러 클라이언트가 동시에 같은 서블릿에 요청을 전송할 수 있음
=> 서블릿은 스레드에 안전해야 하며, 서블릿 간 공유되는 객체에 접근할 때에도 적절한 동기화 작업이 필요함
- 원격 메소드 호출(RMI)
RMI 호출도 RMI가 관리하는 스레드에서 호출되므로 서블릿처럼 스레드 안전하게 작성되야 함
'개발 > 병렬 프로그래밍' 카테고리의 다른 글
자바 병렬 프로그래밍 - 6장 작업실행 (0) | 2016.08.16 |
---|---|
자바 병렬 프로그래밍 - 5장 구성 단위 (0) | 2016.08.12 |
자바 병렬 프로그래밍 - 4장 객체 구성 (0) | 2016.07.31 |
자바 병렬 프로그래밍 - 3장 객체 공유 (0) | 2016.07.31 |
자바 병렬 프로그래밍 - 2장 스레드 안정성 (0) | 2016.07.14 |