멀티 쓰레드는 순차 수행인가요 동시 수행인가요???

crom007의 이미지

안녕하세요
리눅스에 입문할려고 하는 초보입니다
쓰레드에 대해서 알아보고 있는데요
프로그램은 순차 수행하는걸로 배웠습니다
그렇다면 멀티 쓰레드도 결국은 순차 진행이 아닐까라는게 제 생각인데요 또 그렇게 들었구요
그렇다면 일반적으로 함수 호출하고 별반 틀리지 않을까 라는 생각도 듭니다

#include <stdio.h>
#include <unistd.h>  
#include <pthread.h>  

void* do_loop(void *data)
{    
int i;    
        int me = *((int *)data);    

        for (i = 0; i < 10; i++)    
        {        
                printf("%d - Got %d\n", me, i);    
                usleep(1);  
        }
}
int main()
{    
        int       thr_id;    
        pthread_t p_thread[3];    
        int status;    
        int a = 1;    
        int b = 2;      
        int c = 3;          

        thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);    
        thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);    
        thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);    
        pthread_join(p_thread[0], (void **) &status);    
        pthread_join(p_thread[1], (void **) &status);    
        pthread_join(p_thread[2], (void **) &status);    
        printf("programing is end\n");    
        return 0;
}
위와 의 프로그램 소스를 실행시켜 보았습니다
1 - Got 0
2 - Got 0
3 - Got 0
1 - Got 1
2 - Got 1
3 - Got 1
1 - Got 2
2 - Got 2
3 - Got 2
1 - Got 3
2 - Got 3
3 - Got 3
1 - Got 4
2 - Got 4
3 - Got 4
1 - Got 5
2 - Got 5
3 - Got 5
1 - Got 6
2 - Got 6
3 - Got 6
1 - Got 7
2 - Got 7
3 - Got 7
1 - Got 8
2 - Got 8
3 - Got 8
1 - Got 9
2 - Got 9
3 - Got 9
programing is end
이와 같은 결과가 나왔구요
usleep를 제거 하고 실행시켜보았더니
1 - Got 0
1 - Got 1
1 - Got 2
1 - Got 3
1 - Got 4
1 - Got 5
1 - Got 6
1 - Got 7
1 - Got 8
1 - Got 9
2 - Got 0
2 - Got 1
2 - Got 2
2 - Got 3
2 - Got 4
2 - Got 5
2 - Got 6
2 - Got 7
2 - Got 8
2 - Got 9
3 - Got 0
3 - Got 1
3 - Got 2
3 - Got 3
3 - Got 4
3 - Got 5
3 - Got 6
3 - Got 7
3 - Got 8
3 - Got 9
programing is end
이러한 결과가 나왔습니다 여기서 제가 내린 결론은 끼어들 틈이 없으면 순차 진행이 될 것이고 조금의 끼어들 틈이 있다면 끼어들어서 끼어든다는(?)건데요 차동차의 끼어들기로 비유를 하고 싶습니다.
마지막으로 쓰레드는 실제적으로 멀티는 아니지만 느끼기에는 멀티로 느끼는것뿐 이라고 결론을 내렸는데
제가 이해한게 맞는지 선배님들의 조언이 간절히 필요합니다
감사합니다

ifree의 이미지

멀티코어나 멀티프로세서 시스템에서는 실제로 동시 수행됩니다.
단일 코어라 해도, 시분할 방식으로 번갈아 쓰레드가 실행되므로 순차 실행이라고 할 수 없습니다.

crom007의 이미지

동시 실행은 아니지 않나요???
시분할 방식도 동시 실행은 아닌걸로 알고 있어요
알려고 하면 할수록 머릿속이 복잡해지네요 ㅎㅎ;;

kaeri17의 이미지

소스상에 슬립같은걸 걸지 않아도 운영체제가 스케쥴링에 의해 타이머 인터럽트로 끼어듭니다. 따라서 끼어들 틈이 없으면 순차실행을 계속한다고 말하긴 힘들겠죠.

사실 pthread의 경우 커널에서 동작하는것이 아니기 때문에 동시실행을 하냐고 물으면 그렇다고 답하기는 힘들지만 비순차실행인것은 맞습니다.

crom007의 이미지

스케쥴링이라고 하면 어떤걸 말하는 건지요
스케쥴링도 프로그래머가 미리 짜둔 소스인가요 아니면 운영체제에서 미리 짜여진 틀인가요
타이머 인터럽트로 끼어든다고 해도 쓰레드2가 수행된다는 생각때문에 순차수행이라는 생각을 지울수가 없습니다..ㅠ,.ㅠ

DarkSide의 이미지

순차수행은 아닙니다.
나중에 시작한 쓰레드가 먼저 끝나기도 하니까요.
개념적으로는 복잡할 것도 없습니다.
싱글코어에서는 당연히 동시 수행이 물리적으로 불가능하기 때문에 운영체제가 시간을 쪼개어 쓰레드 작업들을 수행하죠.
즉, 한 쓰레드를 끝마치고 나서 다른 쓰레드를 시작하는 게 아니라는 말씀.

chadr의 이미지

랜덤실행입니다.

절대 스레드는 순차실행도 아니고 비순차실행도 아닙니다. 랜덤실행이라고 보시면 됩니다.

순차실행이 되기 위해서는 의도적으로 동기화객체등을 이용하여 순서를 정해야합니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

kaeri17의 이미지

순차실행이 아니면 비 순차실행이겠죠? 비자는 아닐 非자니까요.... 순차실행도 아니고 비순차실행도 아니라는 말은 좀 이상해 보입니다...

chadr의 이미지

뉘앙스의 문제입니다. 비순차실행은 말 그대로 의도하던 순서가 뒤바뀌어서 1,2,3,4로 의도 한 것이 4,3,2,1로 수행될 수 있다 의도였고
랜덤실행이라고 한 것은 말그대로 2,3,1,4 또는 4,1,2,3 등 어떤 순서로 실행될지 예측이 불가능 하다는 의도였습니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

nthroot의 이미지

이 코드로 확인할 수 있는건 아무것도....

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

jos77의 이미지

computer systems 책 보시면... (가만 이거 원서 번역 되었던가?)
암튼 제가 최고의 교재라고 보는 책 있는데요... 거기서 쓰레드 두개 돌리는 예제나옵니다.
1부터 1000000 까지 loop 는 먼저 실행한 쓰레드가 도는데요.
0 이 8개였던가 하는 좀더 큰 loop 부터는 두개가 동시에 돌아갑니다.
전역변수 하나에 쓰레드 두개가 동시에 ++ 해서 충돌내는 거 보여주는 예제인데...
암튼 왠만하면 순차실행하지만 프로그램 설정 혹은 동작에 따라 동시 실행을 해주는 것이 멀티쓰레드 동작원리로 압니다.

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

mac040의 이미지

잘못된 확인 방법입니다.

이 경우 시스템 내부에서 스케줄러에 의해 쓰레드 실행 순서가 바뀌는데, 근래의 커널 스위칭 시간이 아마 20ms 근처로 되어 있을 겁니다(그렇게 중요치 않은 그냥 일정 시간이 있다고 생각하면 됨) 즉 스위칭이 일어나기 전에 해당 쓰레드가 모두 실행된다면 순차 실행처럼 보일 것이나 실제로는 비순차입니다. 아마도 20ms(정확치 않음)가 넘는 실행 시간을 갖는 쓰레드를 생성하면 비순차 실행으로 보일겁니다

이렇게 구현된 이유는 쓰레드 스위칭 자체가 CPU 퍼포먼스를 소모하므로, 매 명령어마다 수행할 경우 비용이 너무 커지기 때문입니다.

참고로 위에 분이 말씀하신대로, 멀티 코어의 경우 실제로 여러개가 동시에 실행될 수도 있습니다.

댓글 달기

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