[질문]socket을 accept하여 thread로 넘겨줄때..
글쓴이: 익명 사용자 / 작성시간: 목, 2001/11/29 - 1:29오후
Client로부터 socket을 accept하여 thread로 작업을 넘겨주는 서버 프로그램
을 하고 있습니다.
그리고 하나의 Client와 socket connection이 이루어 질때마다 새로운 thread
가 생성되어 다음 connection이 이루어질때까지 대기합니다.
즉, Client의 수 만큼 thread의 개수가 증가하는 것이지요.
그런데 연결된 Client의 개수가 340개 정도가 되면 더 이상 socket 연결이 되
지 않습니다. fd의 갯수를 증가시켜도 결과는 마찬가지구요.
thread와 socket을 각각 따로 생성시켜보면 대략 1020개 정도까지 만들어 지는
데 (fd = 1024 일때 ) 함께 생성시키면 왜 그런 결과가 나올까요 ?
정말 궁금합니다. 이 궁금증을 풀어주실 분 안 계신가요 ?
이것저것 모르는것 투성인데 프로그램을 할려니 정말 힘이 드네요.
답변 부탁 드립니다..
Forums:
Re: [질문]socket을 accept하여 thread로 넘겨줄때..
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( .....
.....
}
}
Re^2: [질문]답변 감사합니다...근데 또 궁금한 것이...
답변이 올라오지 않아서 굉장히 답답했었는데
정말 감사드립니다.
그런데 말씀하신 PTHREAD_THREADS_MAX 를 찾을수가 없습니다.
pthread.h 에도 define 되어 있지 않구요.
wowlinux 7.0을 사용하고 있고, 커널 버젼은 업글해서 2.4.9 입니다.
PTHREAD_THREADS_MAX는 어디에 선언되어 있나요 ?
Re^3: [질문]답변 감사합니다...근데 또 궁금한 것이...
(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)로 스레드 수를 줄이시는게 좋을겁니다.
댓글 달기