LISTORY

[윈도우즈 시스템 프로그래밍] 쓰레드 풀에 대한 이해 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 쓰레드 풀에 대한 이해

LiStoryTeller 2018. 9. 29. 21:06


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.


오늘 정리할 내용은 쓰레드 풀에 대한 이해 부분이다.


YouTube 주소 : 쓰레드 풀에 대한 이해



쓰레드 풀링


이번 시간에 설명할 것은 쓰레드 풀이다.


쓰레드 풀을 알기 위해선 일단 프레임워크가 무엇인지 알아야 한다.


프레임워크란?

- 개발자가 프로그래밍을 하기 위한 하나의 구조물

- 프로그램을 이렇게 구현해라 그럼 너에게 부가적인 기능을 제공해 주겠다. 


개발자는 이렇게 프레임워크에 따라 제공되는 모델로 프로그램을 구현한다.


프레임워크의 예를 들면 J2EE, EJB 등이 있다.


즉, 프레임워크는 하나의 명세이다. 


그 명세에 의해 프로그램이 구현이 되었을 때 프레임워크는 다양한 기능이 제공해주는데, 대표적인 것이 쓰레드 풀이다.


개발자들 중에서는 쓰레드 풀이 뭔지는 알지만 실제로 구현할 수 있는 사람은 그다지 많지 않다.


사실, 그렇다고 쓰레드 풀을 굳이 직접 구현하는 것은 좋지 않다.


이미 잘 구현되어 있는 것은 잘 가져다 쓰는 것이 더 편리하고 성능도 좋다. 


잘 구현되어 있는 것을 재활용 하자는 객체지향적 측면이다.


하지만 성능에 상관없이 직접 구현해보면 개발자가 볼 수 있는 측면은 넓어질 수 있다.


여하튼 이번 장에서 다룰 것은 다음과 같다.


1. 쓰레드 풀을 이해하는 것

2. 쓰레드 풀을 직접 구현해보는것



⊙ 쓰레드 풀은 왜 필요할까?



오른쪽에 위치한 쓰레드 풀에 쓰레드들을 단순히 커널 오브젝트로 보자


커널 오브젝트는 대상이 무엇이든 간에 생성과 소멸에 상당히 많은 리소스를 필요로 한다. 


즉, 커널 오브젝트를 생성하는 것은 살짝 부담스럽다.


일단 메모리의 할당과 반환은 둘째 치더라도 커널 모드에서 유저 모드로의 이동도 상당히 빈번하다.


또한 새로운 리소스를 할당하고 운영체제에 그를 등록하는 것도 많은 시간이 소요된다.


이는 다른 리소스에 비해 상당히 많은 시간 소요된다.


특히 쓰레드는 더하다.


운영체제 입장에서 쓰레드는 스케줄러의 관리 대상이다.


이말은 곧 쓰레드는 단순히 운영체제가 정보를 갖고 있는 것 뿐만이 아니라 스케줄러에 의해 감지가 되어야 한다는 뜻이다.


그렇기에 그 자체도 부담이 될 수 있다.


결과적으로 쓰레드의 생성은 상당히 많은 시간을 요한다. 



이제 쓰레드 풀을 설명하기 위한 하나의 예시를 제시해보겠다.


처리해야 할 일이 10가지가 있다.


이 일들은 동시에 처리되어야 하는게 아니라 시간적인 텀을 두고 접근을 해야하는 것이다.


그럼 굳이 10개의 쓰레드를 만드는게 아니라, 하나의 쓰레드가 10개의 일을 다 처리할 수만 있다면 나머지 9개의 쓰레드를 생성 소멸하는 일을 하지 않아도 된다.


상황을 바꿔서 이야기해보자


몇개의 일이 들어오는진 모르겠는데, 동시에 처리해야할 일이 밀어닥치고 있다.


최대 5개까지 들어온다고 해보자.


일반적으로 생각해보면, 2개의 일이 닥쳤을 경우 2개의 쓰레드 생성하고 소멸한다.


3개의 일이 닥쳤을 경우엔 3개의 쓰레드들이 생성 및 소멸된다.


5개의 일이 닥쳤을 경우엔 5개의 쓰레드들이 생성 및 소멸된다.


이렇게만 해도 총 10개의 쓰레드들이 생성 및 소멸된다.


이제 이걸 이렇게 하지말고, 요구되는 최대 5개라 하면 5개의 쓰레드 만들어 놓고 이 쓰레드들을 어딘가에 저장해두자.


어딘가? 이는 SW적인 은행이라 생각하면 된다. 보통 이걸 풀이라고 한다.


그 다음에 두개의 일이 들어왔을 때, 쉬고있는 쓰레드 2개를 할당해주자.


아직 처리가 안끝난 상태에서 3개의 일이 등장했을 경우엔, 풀에 남은 3개의 쓰레드가 있으므로 이들을 꺼내 일을 하도록 할당해준다.


그 와중에 2개의 일이 끝났다. 그럼 이 쓰레드들을 소멸하지 않고 풀에 넣어두자.


3개의 일도 마찬가지이다.


그리고 나서 5개의 일이 동시에 들어왔을땐? 풀에 있는 5개의 쓰레드를 제공해주자.


이렇게 적당한 개수의 미리 생성하여 쓰레드를 풀에 저장해두고, 일을 해야할 때는 풀에서 써내서 할당하도록 한다.


이렇게 했을 경우에 이점은 분명히 존재한다.


1. 쓰레드의 생성과 소멸을 줄임

2. 성능

- 속도 향상


즉, 쓰레드 풀이라는 것은 쓰레드를 미리 만들어 두고 일이 들어올때마다 할당하고 일이 끝나면 풀에 다시 반환하는 것이다.


이 쓰레드 풀을 당장 구현하라고 하면 가장 부담스러운것은 어떻게 일을 할당하고 어떻게 쓰레드를 저장할 것인지 부분일 것이다.


왜냐면 우린 쓰레드에게 일을 주는 법은 알지만 기존에 생성된 쓰레드를 가져오는 법, 이미 작업하고 있는 쓰레드에게 별도로 일을 할당하는 것도 모르기 때문이다.


이 부분은 다음 시간에 정리하도록 하겠다.






Comments