[질문]socket을 accept하여 thread로 넘겨줄때..

익명 사용자의 이미지

Client로부터 socket을 accept하여 thread로 작업을 넘겨주는 서버 프로그램
을 하고 있습니다.
그리고 하나의 Client와 socket connection이 이루어 질때마다 새로운 thread
가 생성되어 다음 connection이 이루어질때까지 대기합니다.
즉, Client의 수 만큼 thread의 개수가 증가하는 것이지요.
그런데 연결된 Client의 개수가 340개 정도가 되면 더 이상 socket 연결이 되
지 않습니다. fd의 갯수를 증가시켜도 결과는 마찬가지구요.
thread와 socket을 각각 따로 생성시켜보면 대략 1020개 정도까지 만들어 지는
데 (fd = 1024 일때 ) 함께 생성시키면 왜 그런 결과가 나올까요 ?

정말 궁금합니다. 이 궁금증을 풀어주실 분 안 계신가요 ?
이것저것 모르는것 투성인데 프로그램을 할려니 정말 힘이 드네요.
답변 부탁 드립니다..

익명 사용자의 이미지

PTHREAD_THREADS_MAX의 값을 확인 하셔야 되겠네요.

조언을 드린다면 그렇게 무지하게 프로그램은 안하는 것이
좋을듯 합니다. 그렇게되면 시스템은 무지하게 많은 리소스를
사용하게 되니까요.
n개 socket을 block으로 thread로 관리하면 효율적일 겁니다.
그리고 입력상태를 check하는것은 select나, poll을 사용하면
됩니다.

ex)

int fds[1024], fdptr=0;

move_fd(int fd)
{
fds[fdptr++] = fd;
}

accept_thread()
{
for( ; ; ) {
fd = accept ....
move_fd(fd);
...
}
}

block_thread(int ch)
{
fd_set sfd
for( ; ; ) {
FD_ZERO(&sfd);
for(k=0; k < fdptr; k++) FD_SET(fds[k], &sfd);
select( .....
.....
}
}

익명 사용자의 이미지

답변이 올라오지 않아서 굉장히 답답했었는데
정말 감사드립니다.
그런데 말씀하신 PTHREAD_THREADS_MAX 를 찾을수가 없습니다.
pthread.h 에도 define 되어 있지 않구요.
wowlinux 7.0을 사용하고 있고, 커널 버젼은 업글해서 2.4.9 입니다.
PTHREAD_THREADS_MAX는 어디에 선언되어 있나요 ?

익명 사용자의 이미지


(FreeBSD, LINUX에서 확인 했습니다.)

man pthread_create 로 참조하세요.

#define PTHREAD_THREADS_MAX ULONG_MAX

찾기가 힘드시면

sh#] find /usr/include -type f | xargs grep "PTHREAD_THREADS_MAX"
/usr/include/pthread.h#define PTHREAD_THREADS_MAX ULONG_MAX
이렇게 있는 곳을 친절히 가르켜 줍니다.

근데 너무 많은 스레드를 생성하면 아마 곤란한 경우를 당할 겁니다.
그러니 mqueue나 select(poll)로 스레드 수를 줄이시는게 좋을겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.