리눅스 쓰레드.. 정말 답답하네요..
글쓴이: 익명 사용자 / 작성시간: 수, 2001/11/07 - 6:19오후
쓰레드 프로그래밍을 하고 있는데여.. 아래 증상이 이렇네요..
총 3개의 프로그램을 돌려 보고 있는데
하나는 단순하게 pthread_crate 함수를 이용해서 쓰레드를 만들구여(1번)
하나는 pthread.h 에 있는 pthread 함수들로 클래스화 해서 만들구여(2번)
( 예를들어 PThread->Run() 이런식의..)
나머지 하나는 2번과 흡사 한데.. 쓰레드 클래스가 맴버도 많고 메소드도 많아
여..
덩치가 좀 크져...
그런데 각각 프로그램 마다 최대 만 들수 있는 쓰레드의 제한이 다르군요..
1번은 1000 개 까지 만들고 더 이상 만들지 못하구여..
2번은 500 개 정도 만드네여..
3번은 300개 정도 만들고 더 이상 쓰레드를 만들지 못하네여..
문제가 뭘까여 ?? 한 프로그램에서 사용 할수 있는 제한이 있나 싶기두 하구
여..
이상해서리 2번 프로그램을 여러개 돌려 봤더니 (각각 3개의 프로그램이500개
씩)
1500개 정도 만들 구 못 만들더라구여..
ulimit -a 해서 보니까 최대 프로세스는 2048 이구여..
정말 감이 잡히질 않는군여...
답변 부탁 드릴께여.. 감사합니다.
Forums:
Re: 리눅스 쓰레드.. 정말 답답하네요..
원래의 pthread는 127개로 제한을 두는 것으로 되어있습니다
리눅스에서는 _clone 이라 더 될ㅈ 몰라도\
127개 이상쓰지 마시길...
Re: 리눅스 쓰레드.. 정말 답답하네요..
http//www.ezdoum.com/_data/thread.jpg
그림처럼 쓰레드가 만들어지 지면
쓰레드 별로 스택공간이 할당이 되는데,
이것이 차이가 프로그램 마다 쓰레드를 갯수가
차이가 생기는 것이 아닐지 싶네요..
그런데, 쓰레드를 1000개씩 만들면..
스케쥴링에 문제가 생기지 않나요?
컨텍스트 스위치 오버헤드 때문에 역효과가 생길듯 하네요..
^^;
Re: 저 그게 말이죠..
서버 사이드 프로그램을 하고 있는데 한 유저당 쓰레드 하나를 할당해야 하는
구조 거든요..
그래서 지금 현제 프로그램 구조상으로는 한 유저당 하나의 쓰레드를 붙일수
밖에 없는 상황이구여..
ㅋㅋ
지금 현제 커널이 2.2.X 인데 2.4.X 로 업그래이드 하면 어떨까요 ??
그리고 하나의 프로그램당 스택 사이즈를 어떻게 제어 하죠 ??
원래 지금이 프로그램이 윈2000 adv svr 에서 작업 한건데 리눅으로
포팅 했거덩요.. 근데 윈도2000 쓰레드가 2001 개 까지 생기던데..
음.. 다들 쓰레드를 많이 쓰지 말라구 그러시네요..
어떻게 하면 좋을런지.....
프로그램 구조를 몽땅 바꿀순 없을듯 싶거든요.. 지금으로썬..
Re^2: 저 그게 말이죠..
Unix Network Programming 2ed, volume1
p613.
each system supports a limited number of
thread-specific data items. Posix.1 requires
this limit be no less then 128(per process),
...
그런데 쓰레드는 100개 이상 생성하면 좋지 않다고
들었는데 )
Re^2: 저 그게 말이죠..
# 스택 사이즈에 관련된 pthread 함수
/* Add information about the minimum stack size needed for the thread
to be started. This size must never be less than PTHREAD_STACK_SIZE
and must also not exceed the system limits. */
extern int pthread_attr_setstacksize __P ((pthread_attr_t *__attr,
size_t __stacksize));
/* Return the currently used minimal stack size. */
extern int pthread_attr_getstacksize __P ((__const pthread_attr_t *__attr,
size_t *__stacksize));
각 쓰래드별 스택 사이즈 뿐만 아니라 프로세스 전체의 스택 사이즈도 제한이 되고
한 프로세스가 열수 있는 최대의 파일수도 제한 되어 있습니다.
그리고 아래의 문서를 한번 참고해보세요
http//kldp.org/KoreanDoc/Ulimit-KLDP
http//kldp.org/pipermail/tip/2001-September/000288.html
그리고 smp환경이라면 2.4.* 훨씬더 효율이 좋을 껍니다.
프로세스 생성의 제한도 없구요...
아마 스택사이즈문제가 아니면 사용가능한 fd가 바닥이 나서
그럴것 같군요...
좋은 결과 있기를 바랍니다.
댓글 달기