[OS] Ch4. 스레드
Thread
- CPU 이용의 기본 단위이다.
- 스레드 ID, Program Counter, 레지스터, 스택으로 이루어져 있다.
- 같은 프로세스에 속한 스레드들은 data, code를 공유한다.
스레드 사용의 동기
- 기존에는 다중 프로세스를 사용했다.
- 하지만 프로세스 생성 비용, context switching 등 오버헤드가 너무 많이 생성돼 스레드를 사용하게 됐다.
다중 스레드의 장점
- 응답성 (Responsibility)
- 연산을 분산함으로서 사용자 인터렉션 향상
- 자원 공유 (Resource Sharing)
- 자원을 공유함으로서 여러 스레드를 생성할 수 있다.
- 경제성 (Economy)
- 프로세스 관리보다 경제적이다.
- 규모 적응성 (Scalability)
- multi processor에서는 스레드가 병렬로 실행되고
- single processor에서는 단일 스레드로 실행된다.
다중코어 프로그래밍
- 코어가 여러개인 시스템
암달의 법칙
아무리 코어의 수를 늘려도 성능 향상엔 한계가 있다. - 다중스레드는 병행성을 올린다.
- 병행성은 스레드들이 병렬적으로 실행될 수 있다는 것을 의미한다.
- 병행성은 하나 이상의 태스크를 지원한다는 것이고, 병렬성은 하나 이상의 태스크를 동시에 실행 한다는 것이다.
주의해야 할 점
- 태스크 인식 (Identifying Tasks)
- task 단위로 분리 해야 한다.
- 균형 (Balance)
- 균등한 기여도를 가지도록 분배해야 한다.
- 데이터 분리 (Data Splitting)
- 데이터 또한 분리되어야 한다.
- 데이터 종속성 (Data Dependency)
- 데이터 사용 시 종속성이 있는지 검토해야 한다.
- 시험 및 디버깅 (Testing and Debugging)
암묵적 스레딩
스레드 풀
- 스레드 생성에 드는 시간을 줄이기 위해 사용
- 스레드의 동시 실행 수를 제한할 수 있음.
- 무한대이면 자원이 고갈 될 수 있음
- 프로세스를 시작 할 때 일정 수의 스레드를 스레드풀에 만든다.
- 모든 스레드가 일하고 있으면 free한 스레드가 나올 때까지 대기한다.
장점
- 새로 스레드를 생성하는 것보다 빠르다.
- 스레드 갯수에 제한을 둠으로서 많은 스레드의 병렬처리가 힘든 시스템에도 사용 가능하다.
- 태스크 생성을 분리하면 태스크를 일정 시간 후에 실행하거나 주기적으로 실행시킬 수 있음.
Threading Issues
Fork, Exec
fork()
: 모든 스레드를 복제하거나, 하나의 스레드를 복제한다.exec()
: 바로 프로세스 호출 시 하나의 스레드를 복제하고 (어차피 프로세스가 올 때 그 프로세스의 스레드로 덮어 씌워지기 때문에), 아니라면 하나의 스레드만 복제한다.
신호 처리 (Signal Handling)
- UNIX기반의 프로세스에는 signal로 사건을 알린다.
- 동기식 신호와 비동기식 신호로 나뉜다.
- 동기식 신호는 신호를 발생시킨 프로세스에게 전달 되고,
- 비동기식 신호는 외부에서 발생된 경우이기 때문에 외부 프로세스에게 전달된다.
스레드 취소
- 비동기식 취소
- 한 프로세스가 target을 바로 강제 종료시킨다.
- 자원 회수가 완전하지 않을 수 있다.
- 지연 취소
- Target 프로세스가 스스로를 계속 점검함으로서 종료 할지 아닌지를 판단한다.
- 안전 여부를 판단 가능하다.