스레드 풀
스레드 풀에 대한 이해
스레드 풀이 필요한 이유
스레드 생성은 쉬운 작업이 아니다. 그래서 매번 요구되는 일에 대해 스레드가 새로 생성되고 할당되면 굉장히 부담스럽다. 또한 요구된 일들을 동시에 처리되는 게 아니라 시간적인 텀을 두고 처리해도 된다면 하나의 스레드를 생성하고 이 스레드가 요구된 일들을 다 처리한다면 스레드를 또 만들 필요가 없다.
그래서 미리 스레드를 만들어두고 이 스레드를 스레드 풀에 저장해 두다가 요청이 오면 스레드 풀에서 스레드를 꺼내서 요청에 스레드를 할당한다. 요청한 작업이 완료되면 해당 스레드를 풀에 반환한다. 즉 적정한 수의 스레드를 미리 생성해서 풀에 저장하고 일이 들어올 때마다 스레드를 꺼내 사용하고 다 사용하면 다시 반환한다. 이러한 작업을 통해 성능을 향상할 수 있다.
스레드 풀의 구현
일을 어떻게 할당하느냐?
스레드 관리를 어떻게 할 거냐?(풀에 저장해 뒀다가 가져오고 반환하는 작업)
WorkerThread
- 스레드 핸들과 id정보만 저장하는 구조체
스레드 풀에는 할당된 일에 대한 정보와 스레드 정보가 배열로 있다.
스레드가 풀에 들어가 있으면 스레드가 일을 하고 있지 않다는 소리다 스레드가 일을 하지 않고 있다면 스케줄러에 의해 스케줄링이 되면 안 된다. 스레드가 스레드 풀에 나와서 요청에 할당이 되면 그때는 스케줄러에 의해 스케줄링이 돼야 하지만 스레드 풀에 존재하면 스케줄링이 되면 안 된다. 그래서 스레드 풀에 존재하는 스레드는 이벤트 오브젝트를 가지고 있다.
스레드는 생성이 되면 기본적으로 이벤트 오브젝트에 대해 WaitForSingleObject() 함수를 호출한다.
근데 스레드 생성과 동시에 이벤트 오브젝트는 nonsignaled 상태에 있기에 WaitForSingleObject 함수를 호출한 스레드는 blocked 상태가 된다. 스레드는 blocked 상태가 되면 스케줄러에 의해서 스케줄링이 되지 않는다. 하나의 work가 등록되면 이 work에 할당할 스레드를 스레드 풀에서 가져와야 된다 그래서 blocked 상태에 있는 스레드들 중 하나를 가져오면 된다. 어떻게 가져오냐면 가져올 스레드의 이벤트 오브젝트의 상태를 nonsignaled 상태에서 signaled 상태로 바꾸면 된다.
- WaitForSingleObject 함수 호출하면 스레드가 스레드 풀에서 대기 중
- 이벤트 오브젝트의 상태를 signaled 상태로 바꾸면 스레드가 대기 상태가 풀림
- work list에서 work을 하나 얻어낼 수 있는 함수를 호출해서 스레드에 work 할당
- 할당된 작업이 끝나면 다시 스레드 풀로 들어가야 하니 WaitForSingleObject 함수 호출
- 1 ~ 4 반복
'운영체제 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
뇌를 자극하는 윈도우즈 시스템 프로그래밍 18장 (0) | 2024.09.22 |
---|---|
뇌를 자극하는 윈도우즈 시스템 프로그래밍 16장 (5) | 2024.09.22 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 14장 (0) | 2024.09.21 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 13장 (1) | 2024.09.21 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 12장 (0) | 2024.09.07 |