드라이버나 커널코드에 종종

preempt_disable() 함수와  몇라인 후에 preempt_enable() 함수를 보게된다.

선점금지, 선점허락 이런 함수인데...


만일 preempt_disable() 함수만을 호출한 후   preempt_enable() 함수를 호출하지 않으면 어떻게 될까?


preempt_disable() 함수를 따라가 보면 현재의 current_thread_info()->preempt_count 변수를 1 낮추게 된다.

커널 전체의 선점을 막는게 아니라 현재 테스크의 선점을 비활성화 하는것을 알수 있다.

즉 현재 활성화된 테스크의 스케줄 시간동안 보장한다는 것으로 해석된다.


리눅스 커널의 경우 인터럽트가 발생한 이 후 인터럽트 발생시점의 테스크가 다시 시작하는것이 아니라 상황에 따라

다른 테스크가 실행될수 있다. 스케줄러 입장에서 현재 발생한 인터럽트를 오랜시간동안 기다려온 테스크가 있다면 이를

실행하기 때문이다.

이런것을 막기위해 preempt_disable() 함수가 있는것이 아닌가 추측해본다.ㅇㅇ

위의 추측이 맞던 안맞던 preempt_disable() 함수가 호출된면 내 스케줄 시간만큼은 방해를 받지 않는다.