사실 pthread_create() 직후에 호출한 스레드를 실행할 것인지 새로 생성된 스레드를 실행할 것인지는 스레드 라이브러리(혹은 운영체제)의 구현에 의존하는 문제입니다. (간단하게 샘플 코드를 짜서 테스트 해보면 제 리눅스 박스에서는 자식 스레드가 먼저 실행됩니다:)) 단, 이는 기본 스케줄링 정책을 사용한다는 가정 하에 그렇습니다.
자식 스레드가 먼저 실행되도록 하기 위한 가장 명쾌한 방법은 자식 스레드의 우선순위를 부모 스레드보다 높게 해주는 게 아닐까요?
스케줄링을 임의로 조절하시는 것은,
보통 스케줄링이 fair하게 배분되지 못하다고 생각하셔서들 그러시는 것 같은데,
그건 thread가 process scope로 실행될때 그렇습니다
system scope로 실행되면 아주 fair하게
thread간에 cpu 가 분배가 됩니다.
man pthread_set_scope를 참조하셔서
create 하실때 attribute에 system scope로 지정해주세요.
* 간단한 설명
process scope는 process의 n개의 thread가
하나의 kernel thread(혹은 2-3개, OS에 따라서) 에
매핑이 되는 것이고,
system scope는 n개의 thread가 n개의 kernel thread에 매핑이 됩니다.
따라서,
process scope는
user level library 내에서 context switch가 되기 때문에
컴퓨터 기본의 context switch 방식을 따르지 못하고
프로그래밍 적으로 context switch를 해주게 됩니다.
따라서, IO나 sleep같은 system call 경우에 switch 되는 경우가 많습니다. (OS따라 다르긴 하지만)
system scope는 OS가 보통의 process나 thread에게 CPU를 배분해주는 메커니즘을
그대로 따라서 배분되기 때문에 매우 fair하게 배분됩니다.
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
음. 실마리가 될 지는 모르겠지만..
pthread_create로 스레드를 생성한 후,
과 같은 함수들을 이용하여
메인 스레드를 아주 잠깐이라도 멈춰주면 생성된 스레드가 실행되는 것 같습니다.
하지만 그다지 보기 좋은 방법은 아닌데,
좀 명쾌한 방법없을까요?
정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.
확인을 어떻게 하셨죠?pthread_create를 호출한쪽의 CPU시
확인을 어떻게 하셨죠?
pthread_create를 호출한쪽의 CPU시간이 다 차면 넘어가게 되어 있습니다.
또, 쉬게 하시려면 sleep(0)나 sched_yield를 사용하세요.
---
http://coolengineer.com
사실 pthread_create() 직후에 호출한 스레드를 실행할 것인지
사실 pthread_create() 직후에 호출한 스레드를 실행할 것인지 새로 생성된 스레드를 실행할 것인지는 스레드 라이브러리(혹은 운영체제)의 구현에 의존하는 문제입니다. (간단하게 샘플 코드를 짜서 테스트 해보면 제 리눅스 박스에서는 자식 스레드가 먼저 실행됩니다:)) 단, 이는 기본 스케줄링 정책을 사용한다는 가정 하에 그렇습니다.
자식 스레드가 먼저 실행되도록 하기 위한 가장 명쾌한 방법은 자식 스레드의 우선순위를 부모 스레드보다 높게 해주는 게 아닐까요?
$PWD `date`
pthread_cond_어쩌구.. 하는 것들(일명 조건변수)를 써서 생성
pthread_cond_어쩌구.. 하는 것들(일명 조건변수)를 써서 생성 즉시 포커스를 넘겨주고, 초기화가 끝난 다음 돌려받게 하는건 어떤가요?
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
Re: 음. 실마리가 될 지는 모르겠지만..
sleep으로 쉬게 하는 것보다는
세마포어나 mutex등으로 동기화를 맞춰준다고 생각하면 더 깔끔하리라 생각합니다.
물론 코드는 좀 더 복잡해지죠. --;
------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!
음...thread 스케줄링에 대해서는 좀더 확실한 방법이 있습니다.
음...thread 스케줄링에 대해서는 좀더 확실한 방법이 있습니다.
스케줄링을 임의로 조절하시는 것은,
보통 스케줄링이 fair하게 배분되지 못하다고 생각하셔서들 그러시는 것 같은데,
그건 thread가 process scope로 실행될때 그렇습니다
system scope로 실행되면 아주 fair하게
thread간에 cpu 가 분배가 됩니다.
man pthread_set_scope를 참조하셔서
create 하실때 attribute에 system scope로 지정해주세요.
* 간단한 설명
process scope는 process의 n개의 thread가
하나의 kernel thread(혹은 2-3개, OS에 따라서) 에
매핑이 되는 것이고,
system scope는 n개의 thread가 n개의 kernel thread에 매핑이 됩니다.
따라서,
process scope는
user level library 내에서 context switch가 되기 때문에
컴퓨터 기본의 context switch 방식을 따르지 못하고
프로그래밍 적으로 context switch를 해주게 됩니다.
따라서, IO나 sleep같은 system call 경우에 switch 되는 경우가 많습니다. (OS따라 다르긴 하지만)
system scope는 OS가 보통의 process나 thread에게 CPU를 배분해주는 메커니즘을
그대로 따라서 배분되기 때문에 매우 fair하게 배분됩니다.
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
bizzare 님이 오래 작업을 하신 것 같아,쓰신 글을 쭉 봤더니
bizzare 님이 오래 작업을 하신 것 같아,
쓰신 글을 쭉 봤더니
제가 해왔던 작업하고 비슷하네요.^^;;
(쓰레드를 사용한 멀티 OS 라이브러리,데먼)
머 작업이 거의 끝나셨다니
드릴 말씀은 없지만,
window쪽에 posix thread 라이브러리를 wrapping해놓은
라이브러리가 인터넷에 있더라구요.
(mutex, cond 포함)
저는 그거써서 posix thread쪽 포팅은 좀
쉽게 한 편이었습니다.
그냥 호기심에 무슨 작업하시는지
궁금하네요.^^
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
정말 많이들 관심가져 주셔서 감사합니다. ^^
정말 많은 분들이 정성껏 올려주신 답변을 보면
힘이 납니다!
저도 이 곳에 빨리 답변을 올릴 수 있는 내공이 쌓이면 좋을텐데말입니다.. :-)
정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.
댓글 달기