2011-01-20 2 views
4

프로세서 사용량 측면에서 다음 코드간에 차이가 있습니까? C : while 루프 semaphore_wait 대 while 루프

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    while(someClass->isAsleep) { } 

    someClass->isAsleep = true; 

    //thread execution statements 

    } 
    return argument; 
} 

어디 일부 클래스는 실행 스레드를 필요로 할 때 주기적으로 isAsleep=false을 설정

또는

void *ManageSequencer(void *argument){ 
    SomeClass *someClass = (SomeClass *)argument; 

    while (someClass->ThreadIsAlive()) { 

    semaphore_wait(sem); 

    //thread execution statements 

    } 
    return argument; 
} 

가 실행 스레드를 필요로 주기적 때 someClass이 semaphore_signal(sem);를 호출

.

이 질문은 원 자성과 관련이 없으며, while 루프가 세마포어 솔루션보다 프로세서가 더 많은 원인이되는지 여부입니다. 세마포어는 조건이 충족 될 때까지 블록하는 while 루프를 가지고 있습니까 (세마포어가 0보다 커야합니다)?

답변

3

예, 첫 번째 프로세서는 두 번째 프로세서보다 훨씬 많은 작업을합니다. 기본적으로 첫 번째 예제의 활성 스레드가 예약 될 때마다 스케줄러가 선점하여 다른 스레드 시간을 제공 할 때까지 해당 조건에서 회전하는 모든 프로세서 시간을 소모합니다. 즉, 컨텍스트 스위치가 있고 스레드의 전체 (잠재적) 시간 조각이 매번 100 % 사용되며 실제로 작동하지 않습니다.

두 번째 예는 커널의 스레드를 트랩하므로 커널이 신호를 받고 스레드를 다시 시작할 때까지 프로세서 시간이 전혀 들지 않습니다. 그런 일이 생기면 스케줄러는 처리 시간을 다시 줄 것이지만, 이제는 전체 시간 조각을 사용하여 CPU를 페깅하는 대신 실제로 할 일이 있음을 알게되었습니다.

2

일반적인 세마포 구현은 스레드를 커널에 "주차"시켜 프로세서 시간을 사용하지 않도록합니다. 강하게 그 이유 :

이 권장 (유사하게, 대부분의 뮤텍스 구현이 작업을 수행하지만, 스핀 락은되지 않습니다) someClass->isAsleep이 거짓 인 경우

2

귀하의 첫 번째 예는 외부 루프에 바쁜 스핀 것입니다. 즉, 아무것도하지 않을 때 주어진 모든 프로세서 시간을 소비합니다.

두 번째 예제는 세마포어에서 절전 모드로 전환되며 CPU 시간을 소비하지 않습니다. 즉, 첫 번째 경우는 매우 나쁘고 두 번째 경우는 좋습니다.