01. 개요
한 종류의 일을 순차적으로 처리하는 프로그램은 작성하기 쉽고 오류도 별로 생기지 않는다. 또 여러 종류 일을 순차적으로 처리하는 프로그램 보다 테스트하기도 쉽다. 종류별 작업마다 또는 시뮬레이션 작업의 각 요소마다 스레드를 하나씩 할당하면 마치 순차적인 작업처럼 처리할 수 있고, 스케줄링, 교차 실행되는 작업, 비동기 I/O, 자원 대기 등의 세부적인 부분과 상위의 비즈니스 로직에 해당하는 부분을 분리할 수 있다. 다시 말해 복잡하면서 비동기적인 작업 흐름을 각기 별도 스레드에서 수행되는 더 단순하고 동기적인 작업 흐름 몇 개로 나눌 수 있다. 이런 작업 흐름에서는 특정한 동기화 시점에서만 상호 작용이 발생한다.
정리하기
스레드는 하나의 Process에서 실행될 수 있는 작업 단위를 뜻한다.
이전에 Process와 Program은 차이가 뭘까?
- Process는
실행 중
인 Program을 뜻한다. - Program은
대기 중
인 코드 및 파일들을 뜻한다.
대기 중 이라는 말이 애매할 수도 있는데, 아직 실행되지 못한 코드 및 파일이고 이 파일들이 메모리에 올라가 실행 중일때 Process
이다.
- 각각의 스레드는 하나의 프로세스 안에서 메모리를 공유할 수 있다.
용어 정리
경쟁 조건 ( Race Condition )
: 병행 프로세스에서의 자원경쟁
데드락 ( deadlock )
: 운영체제 혹은 소프트웨어의 잘못된 자원 관리로 인하여 둘 이상의 프로그램(심하면 운영체제 자체도 포함해서)이 함께 멈추어 버리는 현상을 말한다. 식사하는 철학자 문제를 보는 것도 도움이 된다.
기아 상태 ( starvation )
: 컴퓨터 과학 용어의 하나로, 프로세스가 끊임없이 필요한 컴퓨터 자원을 가져오지 못하는 상황으로, 이러한 자원 없이는 처리를 끝낼 수 없는 병행 컴퓨팅에서 마주치는 문제이다. 기아 상태는 스케줄링이나 상호 배제 알고리즘의 오류에 기인하지만 자원 누수에 의해 일어날 수도 있으며 포크 폭탄과 같은 서비스 거부 공격을 통해 고의적으로 발생할 수도 있다.
책 구조
- 기본 원리 1부 ( 2장 ~ 5장 ): 병렬 프로그램 문제점을 피하는 모든 방법, 스레드 안전한 클래스를 작성하는 방법, 스레드 안전성을 확인할 수 있는 방법 등등..
- 병렬 프로그램 구조 잡기 2부 ( 6장 ~ 9장 ) : 스레드를 어떻게 사용하면 병렬 프로그램의 성능과 응답성을 높일 수 있는지를 다룬다.
- 활동성, 성능, 테스트 3부 ( 10장 ~ 12장 ) : 개발자가 의도한 기능이 병렬 프로그램이 제대로 처리하는지 확인하는 방법. 적당한 시간 이내에 원하는 기능을 처리할 수 있는지의 여부 확인.
- 고급 주제 4부 ( 13장 ~ 16장 ) : 명시적 락, 단일 연산 변수, 넌블로킹 알고리즘, 입맛에 맞는 동기화 클래스 작성법.
- 기본 Java 5에 일부 Java 6 기능 활용.
출처 :브라이언 괴츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬 공저, 『 멀티코어를 100% 활용하는 자바 병렬 프로그래밍』, 에이콘(2008.7.30), 1장 인용.