공룡책 Chaper4 스레드

luckygamza·2022년 4월 13일
0

개발 책 읽기

목록 보기
7/8

웹 서버에서 스레드의 필요성 - 177p

웹 서버는 클라이언트로부터 웹 페이지나 이미지, 소리 등에 대한 요청을 받는다. 하나의 분주한 웹 서버는 여러 개(아마도 수천 개)의 클라이언트들이 병행하게 접근할 수 있다. 만약 웹 서버가 전통적인 단일 스레드 프로세스로 작동한다면, 자신의 단일 프로세스로 한번에 하나의 클라이언트 요청만 처리 할수 있게 되어 클라이언트는 자신의 요구가 처리 될 때까지 매우 긴 시간을 기다려야 한다.

하나의 해결책은 서버가 요청이 들어오면, 프로세스는 그 요청을 수행할 별도의 프로세스를 생성하는 것이다. 사실 이와 같은 방식으로 프로세스를 생성하는 것은 스레드가 대중화되기 전에는 매우 보편적이었다. 하지만, 프로세스 생성작업은 매우 많은 시간을 소비하고 많은 자원을 필요로 하는 것이다. 그런데 새 프로세스가 해야 할 일이 기존 프로세스가 하는 일과 동일하다면 왜 이 많은 오버헤드를 감수하면서까지 새로 만들어야 하는가?

현대의 웹 서버는 다중 스레드화되어있다. 서버는 클라이언트의 요청이 들어오면 요청을 수행할 별도의 스레드를 생성한다. 이후 추가적인 요청을 listen하기위한 작업을 재개한다.

스레드 라이브러리 - 185p

스레드 라이브러리는 프로그래머에게 스레드를 생성하고 관리하기 위한 API를 제공한다.

스레드 라이브러리를 구현하는데에는 주된 두가지 방법이 있다.

1) 커널의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공하는 것이다.(ex. POSIX Pthreads,Java 스레드 API)

이 경우, 라이브러리의 모든 코드와 자료구조는 사용자 공간에만 존재한다. 라이브러리의 함수를 호출하는 것은 시스템 콜이 아니라 사용자 공간의 지역 함수를 호출하게 된다는 것을 의미한다.

2) 운영체제에 의해 지원되는 커널 수준 라이브러리를 구현하는 것이다.(ex . POSIX Pthreads, Windows API)
이 경우, 라이브러리의 모든 코드와 자료구조는 커널 공간에 존재한다. 라이브러리 API를 호출하는 것은 커널 시스템 콜을 부르는 결과를 낳는다.

Pthread는 POSIX가 스레드 생성과 동기화를 위해 제정한 표준 API이다. 이것은 스레드의 동작에 관한 명세일 뿐이지 그것 자체를 구현한 것은 아니다. 이 명세를 가지고 운영체제 설계자들은 그들 나름대로 그것을 구현할 수 있다. Linux와 macOS를 포함한 많은 시스템이 Pthreads 명세를 구현하고 있다.

암묵적 스레딩 - 스레드 풀 - 195~196p

스레드를 무한정 만들면 언젠가는 CPU 시간, 메모리 공간 같은 시스템 자원이 고갈된다. 이러한 문제를 해결해 줄수 있는 방법의 하나가 스레드 풀이다.

스레드 풀의 기본 아이디어는 프로세스를 시작할 때 아예 일정한 수의 스레드들을 미리 풀로 만들어두는 것이다.

스레드 풀은 다음과 같은 장점이 있다.

1) 새 스레드를 만들어주기보다 기존 스레드로 서비스해주는 것이 종종 더 빠르다.

2) 스레드 풀은 임의 시각에 존재할 스레드의 개수에 제한을 둔다. 이러한 제한은 많은 수의 스레드를 병렬처리할 수 없는 시스템에 도움이 된다.

3) 테스크를 생성하는 방법을 테스크로부터 분리하면 테스크의 실행을 다르게 짤 수 있다. 에를 들어, 테스크를 일정 시간 후에 실행되도록 스케줄 하거나 혹은 주기적으로 실행시킬 수 있다.

스레드 취소 - 208~209p

웹 브라우저에서 사용자가 웹 페이지를 더는 적재하지 않기 위해 스톱 버튼을 클릭할 수도 있다. 종종 웹 페이지는 여러 스레드들을 사용하여 적재된다(각 이미지는 별도의 스레드에 의해 적재된다). 사용자가 스톱 버튼을 클릭하면 웹 페이지를 가져오던 모든 스레드가 취소된다.

이처럼 취소되어야 할 스레드를 target thread라고 부른다. target 스레드의 취소는 다음과 같은 2가지 방식으로 발생할 수 있다.

1) 비동기식 취소: 한 스레드가 즉시 target 스레드를 강제 종료시킨다.

2) 지연 취소 : target 스레드가 주기적으로 자신이 강제 종료되어야 할지를 점검한다. 이 경우 target스레드가 질서정연하게 강제종료될수 있는 기회가 만들어진다.

따라서 비동기식 취소의 경우 종종 운영체제는 취소된 스레드로부터 시스템 자원을 다 회수하지 못하는 경우가 있을 수 있다. 따라서 Pthread 문서에서는 비동기 취소를 권장하지 않는다.

Pthread는 스레드가 지연취소로 취소 될 때 정리 핸들러(cleanup handler)라고 하는 함수가 호출되게 할 수 있다. 이 기능을 사용하면 스레드가 종료되기 전에 스레드가 획득한 모든 자원을 해제할 수 있다.

TLS(thread local storage) - 209p

상황에 따라서 각 스레드가 자기만 액세스할 수 있는 데이터를 가져야 할 필요도 있다. 그러한 데이터를 TLS라고 부른다.

TLS를 지역변수와 혼동하기 쉽다. 그러나 지역 변수는 하나의 함수가 호출되는 동안 보이는 반면, TLS는 전체 함수 호출에 걸쳐 보인다.

0개의 댓글