[질문] Multi Thread안에서 시간 지연에서의 usleep...

ksil의 이미지

한개의 프로세스에서 대략 5개의 쓰레드가 돌고 있습니다.

근데 CPU점유율과 스케쥴링을 위해서 각 스레드에서 usleep 을 쓰고 있엇는데요

게시판을 둘러 보다 보니 usleep은 Multi Thread에서 unsafe하기 때문에

select나 nanosleep을 쓰라는 글이 몇개나 보이는군요.

근데 그에 대한 근거및 문제점들은 찾을수 없어서 이렇게 글을 올리게 되었습니다.

일단 제가 아는것은 usleep은 어떤 값을 주더라도 최소 10ms단위로 동작한다는것 이외에는 없습니다 ㅠ.ㅠ

혹시 위와 같은 상황에서 usleep이 문제를 일으키는 이유나 현상에 대해서 알수있는 레퍼런스를 알수 있는곳이 있을까요 ?

부탁 드립니다

xfmulder의 이미지

thread 에서 한놈이 usleep 하면 다른 놈들도 usleep (할 수) 있습니다.

항상 그런것도 아닌듯 하고 항상 안그런다고 장담 못합니다.

mutex 이용해서 Usleep() 같은 함수 만들어 써야 하지 않나요?

내 자식들도 나처럼 !!

김성진의 이미지

usleep는 deprecated된 함수이고,

일반적으로 nanosleep을 사용하라고 권고하고 있습니다.

내부적으로 usleep은 select()함수를 이용하여 구현되었었다고

알고 있고, select를 직접 쓰시는 것과 큰 차이가 없습니다.

그리고, 한 쓰레드가 usleep을 한다고 해서 다른 쓰레드가 모두

정지하는 것이 아니고, 쓰레드의 스케쥴링 스코프가 SYSTEM

(BOUND Thread)일 경우에는 전혀 상관이 없습니다.

물론 PROCESS 스코프일 경우에도 SUN의 경우는 LWP Level을

자동으로 올려 그런 경우가 없도록 구현해 놓았습니다.

그리고, usleep이 Thread unsafe하다는 이야기는 처음 듣는

것이고, Thread unsafe한 함수의 경우 해당 플랫폼의

매뉴얼이나 Thread 프로그래밍 문서에 잘 나와있습니다.

(Signal Unsafe한 경우도 고려해야 합니다.)

nanosleep의 경우 사실상 CPU를 적게쓰기 위해 호출하는

것은 적절하지 않다는 생각이 듭니다.

문맥교환의 기본 시간단위가 mili second인데 nano second

단위로 Sleep을 하려면 CPU를 소모하면서 busy wait을

한 이후에 깨어나는 수 밖에는 없어서 그렇습니다.

개인적으로 테스트해 본 결과, select()보다 nanosleep()의 경우

CPU를 때때로 더 많이 사용하는 경우를 맞닥드린 경우도

있습니다. (물론 개인적인 테스트이기 때문에 편차가 있을 것으로

생각합니다만)

만일 CPU 점유율을 낮추기 위해 sleep을 하시려면

제가 보기에는 select() 관련 함수가 가장 적합해 보입니다.

좋은 결과 있기 바랍니다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

partout의 이미지

위에 글을 올리신 분이 usleep이 select 함수를 이용하여 구현했기때문에, 이들
사이에 별 차이가 없다고 하셨는데,

사실 usleep이 어떻게 구현되었는지... 거기까지는 잘 모르겠습니다.

하지만, 실제로 쓰레드에서 usleep을 썼을 때 segmentaion fault를 내면서
프로그램이 죽는 경우를 몇 번 정도 경험을 했고, 고심한 끝에 usleep함수 대신
select 함수를 쓰도록 구현을 바꾸어서 문제를 해결한 적이 있습니다.
당시 개발 환경이 솔라리스 8였는데,...
솔라리스 8의 메뉴얼에서 usleep 함수의 MT-Level 속성이 Unsafe로 표기
되어 있습니다.

Quote:

Standard C Library Functions usleep(3C)

____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|_____________________________|_____________________________|
| MT-Level | Unsafe |
|_____________________________|_____________________________|

기타 다른 유닉스의 메뉴얼(리눅스 포함)에는 이런 언급이 불분명해서,
섣불리 어떻다라고 말씀드리기는 곤란하네요.

어찌나 졸린지..~~

cinsk의 이미지

매뉴얼을 읽어보시기 바랍니다. :)

info libc "Posix thread" "cancel"

를 보시면 pthread와 cancellation에 대해 자세히 나와 있습니다.
이 글이 도움이 될 거 같군요.

김성진의 이미지

아.그렇군요.

예전에 읽었던 article에 기반해서 글을 쓰다보니..그렇군요.

좀더 공부해야겠습니다.

경험보다 좋은 지식은 없군요. ^^

좋은 날 되시길.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

치우의 이미지

우선 위글의 오류들이 보입니다.
http://man7.org/linux/man-pages/man3/usleep.3.html
는 물온 솔라리스 8과는 다를수 있습니다.

다만 info libc "Posix thread" "cancel" 관련한 글은 해석을 잚소 하신듯 합니다.

내용인즉 uslepp나 nonosleep는 다누이만 다를 뿐
다음의 방법이 없습니다.

여러 사유로 프로세서를 중지 할 경우...
강제로 해당 쓰레드들을 강제로 중지 해야 할 경우가 반드시 발생 합니다...

위 두 함수를 쓰레드 해당 중간에 중지할 방법이 존재 하지 않는다 즉 취소할수 없다는
내용이지 세그먼트 폴트와는 무관한 내용 입니다.

구형의 리눅스 컴파일도 완전하지 않습니다...
언제나... 시대가 지나면서 안정화 됩니다...

그러면서 위와 같은 폴트는 다소 빨라집니다....

이 말의 의미를 곱씹어 보시가 정중히 바랍니다...

저 또한 간홐 하는 실수 입니다.

즉 그것은 정말로 메모리 폴트일 가능성이 큽니다.

주로 usleep 후....
후속 처리하는 데서... 그 후속 처리부가 다른 쓰레드라면 더울 발견하시기 어려울 수도 있지만....

겸허히 보시기 바랍니다...

그러면 발견 할 수 있을 겁니다....

정말로 거의 99% 가깝게 메모리 폴트일 가능성이 있습니다...

예) print("%s,"d,%s,%s",a,b,c);

와 같이 가변 인수에서 개수가 잘못 되었거나..
또는 정수 값에 문자열 값이 연결 되도록 한다는가...

그런데서 폴프가 나는 것 또한 저도 간홐 하는 실수 입니다....

C+V 때문에.. 간혹 저도 모르게..

겸허히 보니... 보이더군요 ㅎㅎㅎ

치우의 이미지

내용인즉 uslepp나 nonosleep는 다누이만 다를 뿐
내용인즉 uslepp나 nonosleep는 단위만 다를 뿐...으로 읽어 주세요 오타!

치우의 이미지

그러면서 위와 같은 폴트는 다소 빨라집니다....
그러면서 위와 같은 폴트는 발견의 시간이 다소 빨라집니다....로 읽어 주시면 더 수월히 읽혀 집니다.

댓글 달기

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