join 없이는 동작하지 않는 gnu pth 라이브러리.

hey의 이미지

제가 지금 gnu pth를 써보려고 하고 있는데,
join 없이는 쓰레드에게 cpu 시간이 분할되지 않는 것처럼 보입니다.
pth를 빌드할 때 들어있는 테스트 코드를 실행해보니 잘 되길래
어째서인가 살펴봤더니 join을 하면 돌아가고 join을 안하면 안돌더군요.

man 페이지에 있는 테스트 코드는 join 없이 사용되는 것을 보니
사불인 것 같기는 한데..

혹시 비슷한 경험이 있으신 분이 있으면 조언 부탁합니다.

저는 페도라 코어 1에 2.6 커널을 올려서 사용하고 있고
pth 라이브러리는 페도라 코어 1 stable 에 들어있는 패키지를 썼습니다.
그리고 소스를 가져다 다시 빌드해서 사용해봤구요.
어느 쪽이나 마찬가지였습니다. 어떤 문제가 있을 수 있을까요?

sylphong의 이미지

원래 pth가 그런것으로 알고있습니다..
다른 쓰레드모델과는 달리 비선점형으로 작동한다고합니다..
한 쓰레드가 실행되고 IO가 일어나거나 양보를 하면 다른 쓰레드가 실행되고...pth매뉴얼 제일 처음에 나오는 부분이죠..
이로인해 사용할수있는 범위가 제한되지만 서버 프로그래밍 같은 경우는 context switching이 언제일어날지 예상할수있기때문에 보다 편하고 빠르게 설계가능하다더군요..

bugiii의 이미지

GNU pth는 컨텍스트 전환을 예측할 수 있거나 명시적으로 전환할 수 있는 구조입니다. 이 라이브러리를 일반적인 쓰레드 라이브러리의 선점형 성질이 필요한 어플리케이션에 사용한다면 분명히 문제가 생길 것입니다.

Pth는 이벤트로 구동되는 (대부분) 서버에 적합한 구조를 가지고 있습니다. 앞서 말씀드린 컨텍스트 전환을 예측할 수 있다는 것은 각종 I/O 동작시 내부적으로 (pth_*류 함수를 호출했을 때, 주어진 I/O가 바로 끝나지 않는 상태) 다른 쓰레드로 전환할 수 있는 기회가 생긴다는 것입니다. 아니면 다른 쓰레드에 제어를 넘기는 함수를 명시적으로 사용해야 합니다.

보통 쓰레드를 이용한 서버 프로그램은 각종 뮤텍스나 동기화 객체가 난무하게 마련입니다. 이 이유는 대부분 선점형 쓰레드 구조상 어디에서 컨텍스트 전환이 일어날지 모르기 때문입니다.

만들고자 하시는 프로그램이 어떤 종류인지 잘 모르겠습니다. 어떤 일을 하는 것인지 궁금합니다. 아, 그리고, Pth가 지원하는 System Call Mapping 을 적용시키지 않고 일반 read 나 write 를 사용하면 어떠한 효과도 볼 수 없습니다. pth_* 류 함수를 쓰시는게 여러모로 좋다고 봅니다.

그럼, 이만...

hey의 이미지

그랬군요. :D
답변 고맙습니다.

http://sourceforge.net/projects/xmlrpcpp/
요놈을 쓰레드로 만들어서 두었는데 일을 안하더라구요.
연속 모드로 두지 말고 시간 제한을 두어서 루프를 돌리고
그 안에서 명시적으로 양보를 해야겠군요.

man pth에 보면 join 없이 사용하는 예제가 있길래
제 문제인줄만 알았습니다. (결국 제 문제긴 하지만)

문제가 뭐였는지를 알았으니 어떻게 잘 쓸 수 있을지
좀 더 공부가 필요하겠습니다.


----------------------------
May the F/OSS be with you..


bugiii의 이미지

미약하지만 kldp 위키에 변역을 시작했습니다.

http://wiki.kldp.org/wiki.php/GnuPth

시간되시면 함께 번역하는 것도 좋지 않을까요?

수정: 컥 hey 님이시잖아욧~~~~ -_-;

hey의 이미지

bugiii wrote:

수정: 컥 hey 님이시잖아욧~~~~ -_-;

네 그거 읽다가 궁금해져서 시작해봤어요. ;;


----------------------------
May the F/OSS be with you..


익명 사용자의 이미지

참고로, join은 쓰레드의 동기화에 사용되는것입니다.
각자 나눠서 일하다가 모두 종료된것을 확인하고 다음 단계로 가야할때 쓰는 방법이지요.
barrier synchronization의 구현중 하나로 볼 수 있겠습니다.

다음 종류의 시나리오에 적합한 사용입니다.
1) 일을 나눈다.
2) 나누어진 일을 각각 쓰레드들이 시작한다.
3) 모든 쓰레드가 일을 마쳐야 다음 단계를 진행할 수 있다.
4) 이때, 모든 쓰레드가 일을 마치는 지점에서 join한다.

댓글 달기

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