Thread Pooling에 대해서

삼량의 이미지

안녕하세요.

견습 프로그래머 삼량이라고 합니다.

그 Thread Pooling에 의해서 다중접속을 좀 수월하게 처리할 수 있다고

하는데...참고할 페이지나 책, 사이트 같은 곳이 있나요?

고수님들의 자세하고 콤팩트한 강의 또한 환영하죠.

환경은
OS : LINUX 7.3 Paran
LANG : C / CPP
글구 Posix Thread를 기본으로 합니다

제가 고기를 낚는 법을 배울수 있게 도와 주세요!

고통은 감수 해야 겠죠.~

__(__)__

jinyeong의 이미지

수월하게라기 보다는.. 효율적으로라는 말이 맞겠지요.

매 접속마다 thread를 새로 생성하는 부하를 없애자는 것이지요.

자료는 google에서 thread pool이라고 치시면 많이 나올 것 같군요.

apache 2.x 대의 experimental에도 비슷한 코드가 있을 겁니다.

linux를 쓰신다면, kernel은 2.6 이상으로 업데이트 하시고,

glibc도 최신버젼을 사용하셔서 NTPL을 사용하시는게 좋습니다.

1 thread - 1 client의 형태를 원하시는게 아니라면,

epoll (or select, poll)등을 사용하셔야 하겠지요.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

삼량의 이미지

'웃는 남자'님.. 음...요즘 다시 공각기동대 TV 시리즈를 보고 있는데

갑자기 님의 아뒤 보고 미소를 지었다는... ㅋ

님의 조언 일단 감사 드립니다.

근데... 2가지 질문이 있는데요.

1번. NTPL이 뭐하는 건가요?
: 저두 Google 많이 쓰는데...Google에도 안나오네요 ㅠ_ㅠ

2번. 하나의 Thread가 여러개의 Connection을 처리 할 수도 있나요?
:전 하나의 Thread가 하나의 Connection만 처리 하게 만드는줄 알았는데.

암튼...또 귀찮게 해서 죄송합니다만...^^

답변 부탁 드리겠습니다.

三量의 파란세상.
과거는 침묵하고, 현재는 화살처럼. 하지만 미래는 언제나 망설임으로 다가온다는걸 알고 있어!

jinyeong의 이미지

흘.. 실수를... NPTL(Native Posix Thread Library for Linux) 입니다.

다시 검색을.. 원래 리눅스 glibc의 pthread 코드를 대체하게 된 놈입니다.

성능도 좋고, posix 표준에 더 가깝습니다.

그리고 thread : connection의 처리는

부하가 높은 서버 application이라면 더더욱 1 : N 의 처리가 필요합니다..

하나의 thread가 하나의 connection만을 처리하게 되면,

connection이 2000~3000개라면 thread가 2000~3000개가 필요하게 되고,

이들 사이에 scheduling도 필요하게 되고, switching overhead도 적지 않게 되겠지요.

잦은 context switch는 server 설계에서 가장 피해야 할 것 중의 하나입니다.

따라서 하나의 thread가 여러개의 client을 처리하는 방식을 취해야 합니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

bw001730의 이미지

Posix Thread Programming라는 책에 보면
작업큐의 개념이 나오거든요

저는 그 소스 수정해서
스레드풀 쓰는데요
하나의 스레드가 여러 커넥션을 맺든 끊든
그 소스 적당히 머리굴리면 스레드 풀로
사용할 수 있을 거 같습니다.
저는 그렇게 써서 실제 서비스 하고 있습니다
(허접이라 그 정도로도 만족하구요 ㅋ)

익명 사용자의 이미지

삼량 wrote:

....
제가 고기를 낚는 법을 배울수 있게 도와 주세요!

고통은 감수 해야 겠죠.~

__(__)__

고기를 먹는법을 배우는게 아니고, 고기를 잡거나, 기르는 법을 알고 싶으시다면,
http://www.kegel.com/c10k.html
에서 한번 쭉 보시고, 연마를 시도해 보세요.
왜 10K문제 인가?
해결책은?
그중 하나인 "쓰레드>포직스쓰레드> 리눅스"는 왜 많은 솔루션중 1가지에 불과한가?

삼량의 이미지

'웃는남자'님, bw001730님 그리고 '손님'으로

글 남겨 주신분께도 감사 드립니다.

볼게 너무 너무 많아서...웃어야 할지 울어야 될지 모르는 상황이네요.

암튼...열심히 해볼랍니다.

근데 한가지만 더 갈켜 주실래요.

잘 개념이 안서서 그러는데요.

쓰레드가 하나 생성 되었는데...이 하나의 스레드가 어떻게

여러개의 Connection을 유지하게 할 수 있나요.

'웃는 남자'님이 말씀하신 1:N의 방식에서요.

이 N이 각기 다른 Client라면 좀 골치 아픈거 같은데...

이 부분도 좀 설명해 주셨으면 감사 하겠습니다.

__(__)__

三量의 파란세상.
과거는 침묵하고, 현재는 화살처럼. 하지만 미래는 언제나 망설임으로 다가온다는걸 알고 있어!

익명 사용자의 이미지

삼량 wrote:

...
쓰레드가 하나 생성 되었는데...이 하나의 스레드가 어떻게

여러개의 Connection을 유지하게 할 수 있나요.

'웃는 남자'님이 말씀하신 1:N의 방식에서요.

이 N이 각기 다른 Client라면 좀 골치 아픈거 같은데...

이 부분도 좀 설명해 주셨으면 감사 하겠습니다.

__(__)__

TCP/IP에서 한개의 연결(Connection) 은 한개의 소켓디스크립터(socket descriptor)로 표현되며,
유닉스및리눅스에서는 이는 파일로 대변되고 있습니다.
즉, 스페셜 파일로 소켓디스크립터를 다루고 있습니다.

다시 말하자면, 1연결 = 1 파일이다라는 말입니다.
10개의 연결이면 10개의 파일을 다루는 것이고,
10개의 연결에 동일 문자를 보내려면

for (cnt=0; cnt < 10; cnt++)
   write(fd[cnt], "메시지", 6);

와 같은 유형이 되겠지요.
읽는것도 비슷하고.....
그냥 한개의 쓰레드에서 10개의 파일을 읽고 쓰는 것과 동일합니다.
일반 파일과 매우 다르며, 유의해야하는점은 통신라인(개개의)에 따라서,
쓰기와 읽기의 지연시간이(latency)가 아주 상이 하다라는 것입니다.
레귤라파일(로컬 디스크파일)과는 달리 처리해야 하지요.

따라서, 한개의 쓰레드로 다수개의 연결(파일)을 처리할때는,
논블록킹이란 테크닉을 쓰게되며, 이벤트에기반한 프로그래밍을 하게되고(epoll등)
버퍼 및 연결관리가 모두 프로그래머에게 넘어가게 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.