여러개의 쓰레드를 돌리니 성능이 나빠졌어요.

ddedde의 이미지

제가 짜고 있는 프로그램은 메인 프로그램에 3개의 쓰레드가 도는 C++ 프로그램입니다.
우선 semaphore를 이용해서 각 쓰레드에 우선순위를 두어 한 쓰레드가 한 싸이클을 돌고난 다음에야 다른 쓰레드가 실행이 될 수 있는 형태로 실험을 했습니다.
그런데, 이번에는 semaphore를 없애고 쓰레드간의 스케쥴링을 프로세서에게 맡기니 성능이 더 좋아졌습니다.
But, 다른 컴퓨터로 실험환경을 바꾸어, semaphore를 쓰지 않으니 성능이 들쑥날쑥이었습니다. semaphore를 사용해서 각 쓰레드들이 한번에 하나씩만 돌게 하니까 성능이 제대로 나오고요..
앞에 실험에서 봤듯이 원래 semaphore을 쓰지 않아야 성능이 더 잘나오거든요.
그래서 혹시나 뒤에 실험한 환경에서는 이러한 쓰레드를 제대로 지원하지 않는게 아닌지, 혹시나 이 문제를 해결하는 해결책이 있지 않을까해서 물어봅니다.
좀 가르쳐주세요;

ㅡ,.ㅡ;;의 이미지

멀티작업은. 그환경이나.. 작업처리의 특성에따라 성능이 달라질수 있습니다..

무조건 빨라지는건 아니고요..

시퓨가 하나인데.. 멀티로 돌린다면.. 오히려 느려질가능성도 크죠..

또 전체 작업흐름이 어느부분에서 병목현상이 일어나는지도 살펴봐야겠죠.

멀티보다 싱글이 훨씬좋을때가 많습니다.. 특히나 시스템에 많은 작업을 할경우는요..


----------------------------------------------------------------------------

lunarainbow의 이미지

대기시간이 긴 경우가 잦은 경우, 다중 쓰레드의 위력이 발휘됩니다.

가장 간단한 예로, 비디오 재생 프로그램이...;;

하드로부터 읽어오구, 이를 디코딩하는 일련의 작업이 하나의 쓰레드로 진행된다면, 대부분의 시간이 하드로부터 읽어오는 대기 시간으로 소모될 것이고, 결국 재생이 뚝뚝 끊겨버립니다..

그런데 만약 이런 대기시간도 거의 없는.. 일련의 어떤 작업을 굳이 그렇게 만든다면, 오히려 성능은 나빠지겠죠.

bw001730의 이미지

다른 시스템으로 바꾸엇다면..
비슷한 OS 이어야 할 것입니다.
혹시...
커널 레벨의 스레드만 지원하는 시스템(리눅스)에서
User레벨 스레드를 지원하는 시스템(솔라리스)으로
바꿔서 테스트 한 것은 아니었는지..

제가 생각하기에도
프로그래머가 직접 제어하는 것 보다는(세마포를 사용해서)
스레드 라이브러리에 의해 제어되는 것이 더 빠를것 같습니다.
왜냐하면 프로그래머가 직접 제어하는 것은
스레드라이브러리가 제어한 이후에 다시한번 제어를 하는 것일테니깐요
하지만 스레드라이브러리에 의한 제어는
사용자가 원하는 수준으로 제어는 안될것 같은데..
스레드책에서 읽은 내용중에..
"스레드는 가장 최악의 경우를 발생할 수 있는 순서로 동작한다"
는 내용이 생각나네요

어떤 이유에서 스레드의 우선순위를 제어하려고 하는지..
순차적으로 실행하려고 한다면 싱글 스레드가 낫지 않을까요

이건 여담이지만...

개념적으로 봤을때..
세마포는 한번에 진입할 수 있는 스레드의 개수를 제어하기 위한 것이고
뮤텍스는 한번에 한놈만 실행하게 하는 것입니다.

세마포는 자원의 개수가 제한되어 있을때..
그 제한된 개수만큼의 자원을 사용할 수 있는 스레드수를 제어하기 위해
사용하는 것이고

뮤텍스(그리고 조건 변수)는 한번에 한놈만 실행하도록 하기 위한 것이고
님의 말씀처럼 한번에 한놈씩 실행하는 것이라면
뮤텍스가 더 적당한 것이 아닌가 하는 생각이 드네요

nachnine의 이미지

세마포어나 , 뮤텍스같은 동기화 장치가 들어갈 경우
당연히 더 느려지지 않을까요?

===========

멀티쓰레드는 다음과 같은 경우게 사용하는 걸로 알고 있습니다.

1. CPU가 여러개일경우

2. I/O에 의한 병목현상이 일어나는 경우
( 다른 요소에 의한 것도 있겠지만 I/O가 일반적으로 가장 느리니죠)

3. UI BLOCK 방지

예를 들어서 1부터 100까지 더하는데
단일 CPU일때 쓰레드를 10개 만들어서 각 10구간으로 나누고
동기화까지 해준다고 해도 , 그냥 쓰레드없이 1부터 100까지 더하는
것보다 향상이 있기는 커녕 더 느리다는거죠.

써놓고 보니 딴소리군요-_-;

댓글 달기

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