select() 형 서버에서 각각의 작업에 timer를 걸어주려면...
글쓴이: indizarm / 작성시간: 수, 2003/12/24 - 4:04오후
select() 형 서버에서 각각의 작업에 timer를 걸어주려면
어떻게 해야 할까요?
그러니까 그냥 CPU clock처럼 동기화되어서 진행되는 작
업이 아니라, 각 작업의 시작 부분에 timer를 걸어서 처리
되지 않은 작업을 n회, 또는 i회 (성공 시. i<=n) 재수행하
는 것을 원합니다.
그리고 그 timer의 resolution이 microsec 정도가 되었
으면 하는 생각입니다.
문제는 select()가 SIGALRM을 사용하기 때문에, alarm()
gettimeofday(), 또는 또다른 select()를 사용할 수 없다
는 것입니다.
현재는 select()에 timeout을 걸어두어서 단순하게 CPU
clock처럼 timeout이 발생했을 때, 처리하도록하고 있습
니다만, select()가 새로운 client의 연결 역시 처리하고 있
기 때문에 최악의 경우에는 timeout이 발생하지 않고,
처리되지 않은 작업이 그냥 날아가게 되는 경우가 아주 많
습니다.
(현재의 대략적인 구조) while(1) { select(,,,,tv); (timeout 발생시) (아직까지)저장되어 있는 작업 중 일부에 대해서 재처리 accept(); (timeout을 위한 간단한 setting) 작업; } - 작업은 client에서 하며, server와는 blocking sock, TCP로 통신합니다. - '재처리', '작업' 등등은 client와 server의 send(), recv()등을 포함합니다.
Forums:
작업 초기 상태시라면 GNU 의 pth 를 강력하게 권해드립니다. sel
작업 초기 상태시라면 GNU 의 pth 를 강력하게 권해드립니다. select 의 난해한 문제를 깨끗하게 해결해 줄 수 있는 한가지 방법입니다.
pth는 일단 작업을 쓰레드 (사용자 레벨) 로 나눌 수 있고 각 행동별 (i/o) 타임아웃을 줄 수 있으며 쓰레드 컨텍스트 전환도 예측할 (대부분 i/o) 수 있습니다. 그러므로 전통적인(?) 쓰레드의 동기화 문제도 피해갈 수 있으면서 상태를 유지해야 하는 문제도 해결할 수 있습니다. (물론 동기화가 조금 필요한 경우도 있습니다.)
select 는 완전한 어떤 작업을 위해 각 상태변수를 유지해야 하고 전체 작업을 잘게 나누어야 합니다. 이것을 안에서 바깥으로 확 뒤집어 까서 -_-; 일련의 작업을 순서대로 프로그래밍할 수 있도록 pth 가 도와줍니다.
한번 고려해보시기를...
답변 감사드립니다. 지금 얼핏 살펴봤는데, pth 쓸만한듯 합니다
답변 감사드립니다.
지금 얼핏 살펴봤는데, pth 쓸만한듯 합니다. 다음에 써 봐
야겠군요.
그런데 지금하려고하는 것이 최대한 process/ thread의
수를 줄이려고 하는 것이기 때문에, 조금 힘들겠군요.
(그래서 select()를 썼지만 말입니다.)
즐거운 크리스마스되세요.
What a Cool Days!!!
pth 는 가벼운 쓰레드에 속합니다. 내부에서는 select 를 사용하구
pth 는 가벼운 쓰레드에 속합니다. 내부에서는 select 를 사용하구요. 컨텍스트 전환도 setjmp 로 해서 그리 큰 부하가 걸리지 않습니다. 그냥 select 를 사용해서 이리저리 상태 감시하고 이 함수 저 함수 부르는 것보다 보기도 좋고 (생산성/유지보수성) 그렇다고 많이 느리지 않는 서버를 만들 수 있다고 생각합니다.
쓰레드마다 스택 메모리가 약간씩 낭비되지만 이것은 상태저장에 드는 메모리 공간/속도와 크게 차이나지 않으리라 보고 쓰레드 스택도 잘만 사용하면 낭비되는 공간을 줄일 수 있습니다.
pth 쓰레드... 잘 쓰면 select 보다 훨씬 편하고 좋습니다. 물론 select 의 단점과 동일한 SMP 에서는 크게 효과를 못본다는 것이 있지만 나머지 노는 CPU 도 일정량은 도움을 주리라 봅니다. (실질적인 i/o 같은...)
결국 pth 는 전통적인 process 기반 서버의 단점을 극복하고 일반 thread 기법의 장점을 취해서 이벤트로 구동되는 어플리케이션에서 요구되는 입출력 다중화를 동기화의 어려움없이 일련의 흐름으로 쉽게 프로그래밍하게 해주는 쓰레드 라이브러리라고 볼 수 있습니다.
급하시지 않다면 꼭 한번 적용해보시기 바랍니다... (조금만 더 꼬시면 넘어갈 듯... :wink: )
[quote="bugiii"](조금만 더 꼬시면 넘어갈 듯... :wi
윽, 뜨끔 -_-?;
PC가 아니라 보드에 올릴꺼라서 말이죠. thread가 1개
이상이 되면 왠지...
What a Cool Days!!!
보드에 올리실거라면 더욱 더 생산/유지보수성을 신경쓰셔야... 커널 쓰레
보드에 올리실거라면 더욱 더 생산/유지보수성을 신경쓰셔야... 커널 쓰레드하고는 비교가 안되는.... 커널에서 본다면 쓰레드 하나의 프로세스이니까 걱정 안하셔도 됩니다...
(결국 pth 쓰시게 될겁니다... 8)
[quote="bugiii"](결국 pth 쓰시게 될겁니다... 8)[
헉 >,< 왠지 속으로는 '안돼!' 하면서도 저절로 손이 가는
그런 상황입니다.
bugiii님은 부업으로 '영업'을 하셔도 잘 하실 듯...
What a Cool Days!!!
bugiii의 마수가 뻗쳐가는.. :-)참고로 joinc.co.kr에
bugiii의 마수가 뻗쳐가는.. :-)
참고로 joinc.co.kr에 pthread와 그외 필요한 부차적인 것들에 대한 아티클이 있으니 참고해보세요. (한 문장에 참고라는 말을 두번이나 썼군요 ^^)
^_^ 답변 감사드립니다.음... '마수'. 적절한 표현이군요.
^_^ 답변 감사드립니다.
음... '마수'. 적절한 표현이군요. '정곡'을 찌르셨습니다.
두분 모두 즐거운 크리스마스되세요.
What a Cool Days!!!
확실하게 하기위해서 조금 작업을 해보았습니다. 이 문서는 조만간 완전히
확실하게 하기위해서 조금 작업을 해보았습니다. 이 문서는 조만간 완전히 번역되어서 docbook 으로 제출되겠지만, 현재 번역 완료된 부분만을 텍스트로 해서 올립니다. 원본은 gnu pth 메뉴얼이고, 번역 목적은 indizarm 님의 완전한 pth 전향을 위함입니다. :wink: 힘들었습니다....
--수정-- 위키로 링크를 걸었습니다.
http://wiki.kldp.org/wiki.php/GnuPth
원하시는 답변일지 모르겠지만, 작업이 send(), recv() 라면
원하시는 답변일지 모르겠지만,
작업이 send(), recv() 라면 아래처럼 생각하면 안되나요??
-> send 처리가 필요한 작업이 있으면 잠깐 수행하는
구조는 어떤지요??
-> gettimeofday 를 사용하여, 정밀도를 조절할수 있습니다.
- 그럼, 도움이 되셨길 바랍니다. 새해복많이 받으세요.. ^_^;;
gettimeofday() 등은 내부적으로 SIGALRM을 사용하고 있다
gettimeofday() 등은 내부적으로 SIGALRM을 사용하고 있다고
어디서 봤는데요. 제가 잘못알고 있는 것인지... -_-?
send가 필요하면 잠깐 처리하는 작업, 그 '작업'의 timeout을
관리해야 하거든요. 좋은 생각이 있으시면 좀... ^o^
헉! @,2 럴수. 오늘 보니 이런 답글이 있었군요. 감사합니다.
이런 수고까지...
답변해주신 세 분 모두 '새해 복 많이 받으세요'
지금 번역하신 문서 읽고 있습니다. (지금 당장은 아니더라도 '꼭'
pth를 사용하겠습니다. ㅜ,ㅠ)
What a Cool Days!!!
gettimeofday 는 msec 정밀도의 시간을 가져오는 함수입니다.
gettimeofday 는 msec 정밀도의 시간을 가져오는 함수입니다.
select 를 이용해서, 약 10 msec 정도 쉰다음에,
gettimeofday 를 해서 원하는 간격이면 다음을 수행하고,
그렇지 않으면 더 쉬게 하면 되죠...
send 에서 timeout 을 관리한다는 말은
많은 양의 데이타를 보낸다는 뜻 같은데요...
fd 를 non-block 로 만든다음에, 쪼개서 보내면 되지 않을까요...
네트웍입장에서도 그렇게 하는 것이 좋습니다.
그럼,, 도움에 되시기를...
한가지 방법은... pth 나 state thread 내부에서 사용하는
한가지 방법은... pth 나 state thread 내부에서 사용하는 기법입니다만...
select 에 주어지는 timeout 별 우선순위 큐를 만든 다음에 가장 짧은 대기시간의 것을 인자로 주는 것입니다. 이 큐에는 각 작업을 구분할 수 있는 요소도 있어야 하고 시간이 우선순위의 비교 요소가 됩니다. 시간을 시간차로 저장할 수도 있고 절대 시간으로 설정해도 됩니다. 어차피 큐에 집어 넣을 때와 빼고 나서 처리를 어떻게 하냐의 차이니까요.
이렇게 했을 때 select 에서 타임 아웃이 나면 그 작업의 타임 아웃이라고 볼 수 있고 타임 아웃이 아니면 그에 해당하는 작업을 합니다. 물론 이때 같은 타임아웃에 해당하는 작업 모두가 필요할 수도 있구요.
만약 큐에 시간차로 넣었다면 select 후에 그 우선순위 큐 내부의 모든 값을 select 전후의 시간 차이를 잘 얻어서 감소시킵니다.
하여튼 select 에서 넘어오고 타임아웃이나 작업을 한 다음에 다시 최소값을 select의 타임아웃에 사용해서 반복 작업을 합니다.
이렇게 하면 원하시는 동작별 타임아웃을 수행하실 수 있지만서도... 흠흠...
그리고 다른 방법도 있습니다. pth :idea:
이정도면 넘어가실만도 한데요...
답변 감사드립니다. ^_^좋은 오후되세요.
답변 감사드립니다. ^_^
좋은 오후되세요.
What a Cool Days!!!
댓글 달기