1. 개요
1.1 작업을 동시에 실행하는 일에 대한 간략한 역사
- 초창기 컴퓨터는 운영체제 없이 하나의 프로그램만을 실행, 모든 하드웨어 자원에 직접 접근
- 이런 방식은 프로그램 작성이 어렵고, 컴퓨터 자원을 비효율적으로 사용
- 현대 운영체제는 여러 프로그램을 각자의 프로세스로 동시 실행
- 프로세스는 격리된 상태로 독립적 실행, 자원을 할당 받음 (메모리, 파일 핸들, 보안 권한)
- 여러 프로그램을 동시에 실행할 수 있는 운영체제를 개발하게 된 요인
- 자원 활용 : 프로그램은 입출력과 같이 외부 동작이 끝나는 걸 기다려야 하는 경우가 많음. 하나의 프로그램이 기다리는 동안 다른 프로그램을 실행하도록 지원하는 게 효율적
- 공정성 : 한 번에 하나의 프로그램을 실행, 종료 이후에 다른 프로그램을 시작하는 것보다는 작은 단위로 컴퓨터를 공유하는 게 바람직함
- 편의성 : 일을 하나씩 처리하고 프로그램 간 조율하는 프로그램 여러 개를 작성하는 게 더 쉽고 바람직함
- 스레드 : lightweight process
- 자원 활용, 공정성, 편의성 등 프로세스 개념을 만들어내게 된 것과 같은 동기를 갖고 고안됨
- 스레드로 인해 프로세스 안에 여러 개의 프로그램 제어 흐름이 공존할 수 있음
- 프로세스에 할당된 자원을 공유하고, 스레드 각기 별도의 프로그램 카운터, 스택, 지역 변수를 가짐
- 현대 운영체제는 프로세스가 아닌 스레드를 기본 단위로 CPU 자원의 스케줄을 정함
- 프로세스만 사용할 때보다 더 세밀한 단위의 데이터 공유가 가능해짐
- 공유 데이터 접근을 적절하게 동기화하지 않으면 다른 스레드에서 공유 데이터를 순간적으로 수정해 예상치 못한 결과를 얻을 수 있음
1.2 스레드의 이점
1.2.1 멀티프로세서 활용
- 프로세서 스케줄링의 기본 단위는 스레드
- 스레드 하나로 동작하는 프로그램은 한 번에 하나의 프로세서만 사용
- 멀티스레드 프로그램
- 여러 개의 스레드를 사용하여 1개의 프로세서 처리 속도를 높임
- 스레드 하나가 I/O가 때문에 대기 상태에 들어가도 다른 스레드로 동작시켜 애플리케이션이 계속 실행될 수 있음
1.2.2 단순한 모델링
- 순차적으로 처리하는 프로그램은 작성하기도, 오류도 별로 생기지 않음
- 작업 요소마다 스레드를 하나씩 할당하면 순차적인 작업처럼 처리할 수 있음
- 복잡하면서 비동기적인 작업 흐름을 각기 별도 스레드에서 수행되는 더 단순하고 동기적인 작업 흐름 몇개로 나눌 수 있다
- 작업 흐름은 특정한 동기화 시점에서 상호 작용이 발생
- 이러한 장점은 서블릿이나 RMI와 같은 프레임워크에서 활용됨
- 프레임워크는 요청 관리, 스레드 생성, 로드 밸런싱 그리고 작업 흐름 내에 적절한 시점에 적절한 애플리케이션 컴포넌트에게 요청을 분배하는 등 상세한 부분을 처리