인프런 커뮤니티 질문&답변

이별을 맺는다님의 프로필 이미지
이별을 맺는다

작성한 질문수

리눅스 시스템 프로그래밍 - 이론과 실습

프로세서 친화 - 라이브 프로그래밍

간단한 C 질문...

작성

·

180

2

안녕하세요 강사님, 강의 너무 잘 듣고 있습니다. 

질문이 한 개 있는데요,

sleep(1) 을 쓰면 1초를 기다리고 그 시간동안 thread 같은 것이 잠시 unexecutable 되는 것으로 알고 있습니다. 

강사님이 sleep(1)을 쓰실 때 "커널이 느리게 동작하실 수 있으므로" 라고 하셨는데 어떻게 잠시 쓰레드를 멈추게 되면 커널이 다시 빨라지는 건가요,,? 

sleep API를 단순히 그냥 인자로 넣어준 것 만큼 기다린다. 이렇게만 알고있어서 이해가 잘 안가네요.   구글링도 해봤는데 해답이 잘 안나와서.. 간단하게나마 알려주실 수 있나요 ㅠㅠ... 

답변 2

1

감사합니다. 이해 100% 완료!

1

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

제 말을 오해하신 듯 합니다.ㅠㅠ

제가 "커널이 느리게 동작할 수 있으므로"라고 하면서 sleep(1)을 주었는데요.. 그 말과 sleep(1)의 의미는 sched_set()을 호출한 직후에 sched_get()을 호출하면 sched_set()에서 내린 명령이 커널에 반영되기 전에(즉, CPU가 변경되기 전에) sched_get()을 호출할 수 있으므로 sleep(1)로 CPU가 변경될 시간을 준 후에 sched_get()을 호출한다는 의미였습니다.

부연 설명을 드리자면, sched_set() 명령과 sched_get() 명령 사이에 충분한 시간을 준 것은 sched_set() 명령이 Synchornous한 기능이 아니기 때문입니다. sched_set() 명령은 '나 이제 이 CPUmask에서 동작할래'라는 의도를 커널에 전달만 하는 것이고, 커널이 내 의도를 스케쥴링에 반영하는 것은 커널 스케쥴러가 판단하기에 적절한 시기에 반영하게 됩니다. 물론 최대한 빨리 적용해주겠지만, 시간 차이는 있을 수 있죠. 따라서 sched_set() 명령이 리턴됐다고 스케쥴러에 반영이 끝난게 아닌거죠. 내 의도를 전달한 상태인 것이지 내 의도가 반영된 것은 아니라는 말입니다. 물론, sched_set() 명령이 리턴됐을 때 이미 반영이 됐을 수도 있습니다. ^^

또 sleep에 대해 약간 오해하신 부분에 대해서도 부연 설명 드릴게요. 내 프로그램이 호출한 sleep()으로 절대 커널이 멈추지 않습니다. 내 프로세스만 SLEEP 상태로 들어갔다가 깨어나게 되는 것이죠. 프로세스가 잠들고 깨고 스케쥴링되고 하는 것은 모두 커널의 스케쥴러에서 담당하는 일 입니다.

또 궁금한점 있으시면 질문 올려주세요~ :)

이별을 맺는다님의 프로필 이미지
이별을 맺는다

작성한 질문수

질문하기