본문 바로가기
C++ 200제/코딩 IT 정보

윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)

by vicddory 2018. 3. 17.

윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)


윈도우 CE의 스레드 스케줄링은 선점형 방식이다. 스레드는 퀀텀(quantum)이나 타임 슬라이스(time slice)라고 부르는 시간 동안 실행된다.


해당 시간이 지난 후 스레드가 실행 중인 상태라면 그 스레드는 일시 중단되고 다른 스레드가 실행된다. 예외적으로 실행을 마칠 때까지 계속되는 스레드도 있다. 윈도우 CE는 우선순위 스키마(scheme)에 따라 실행할 스레드를 고른다. 높은 우선순위 스레드는 낮은 우순선위 스레드 이전에 스케줄링 된다.

윈도우 CE가 스레드 간에 시간을 배분하는 규칙은 다른 윈도우 운영체제와는 꽤 다르다. 윈도우 CE 프로세스에는 우선순위 클래스가 없다.


데스크탑용 윈도우에서는 스레드 우선순위와 부모 프로세스 우선순위 클래스에 기반을 둬 스케줄링 된다. 윈도우 비스타에서는 높은 우선순위 클래스의 스레드를 낮은 우선순위 클래스보다 먼저 실행한다. 프로세스 내의 상대적 스레드 우선순위를 조정할 수도 있다.


윈도우 CE는 우선순위 클래스가 없으므로 모든 프로세스는 동등한 취급을 받는다. 개별 스레드는 서로 다른 우선순위를 가질 수 있지만 스레드를 실행하는 프로세스는 우선순위에 영향을 끼치지 못한다.


또한, 일부 데스크탑용 윈도우와는 달리 포그라운드 스레드는 우선순위 조절을 할 수 없다.

윈도우 CE가 처음 개발됐을 때 스케줄러(Scheduler)는 8단계의 우선순위 레벨을 지원했다. 윈도우 CE 3.0부터는 256단계를 지원한다.


윈도우 CE 시스템 스케쥴러에 대해 (WinCE Scheduler)윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)


그러나 대부분 애플리케이션은 여전히 종래의 8단계 우선순위를 사용한다. (제조업체가 시스템 우선순위 256단계 중 하위 8단계로부터 다른 레벨 우선순위를 설정하는 것은 가능하긴 하지만 실제로 사용하는 경우는 드물다) 상위의 248단계는 일반적으로 디바이스 드라이버나 시스템 레벨 스레드에서 사용한다.


이는 애플리케이션이 높은 수준 우선순위를 사용할 수 없다는 것을 의미하지는 않는다. 그러나 높은 수준 우선순위를 사용하려면 별도의 API가 필요하다.


윈도우 CE 애플리케이션 우선순위 스케줄링(스케줄러) 8단계는 다음과 같다.


THREAD_PRIORITY_TIME_CRITICAL - 보통 우선순위보다 3포인트 높음


THREAD_PRIORITY_HIGHEST - 보통 우선순위보다 2포인트 높음


THREAD_PRIORITY_ABOVE_NORMAL - 보통 우선순위보다 1포인트 높음


THREAD_PRIORITY_NORMAL - 보통 우선순위. 모든 스레드는 이 순위로 생성됨


THREAD_PRIORITY_BELOW_NORMAL - 보통 우선순위보다 1포인트 낮음


THREAD_PRIORITY_LOWEST - 보통 우선순위보다 2포인트 낮음


THREAD_PRIORITY_ABOVE_IDLE - 보통 우선순위보다 3포인트 낮음


THREAD_PRIORITY_IDLE - 보통 우선순위보다 4포인트 낮음


높은 우선순위 스레드는 낮은 우선순위 스레드보다 먼저 실행된다. 이는 어떤 스레드가 실행되려면 그보다 높은 우선순위의 스레드가 모두 블록 되어야 한다는 뜻과 같다. 블록 된 스레드는 특정 시스템 리소스나 동기화 객체에서 대기 상태로 존재한다.


동등한 우선순위의 스레드는 라운드로빈(round-robin) 방식으로 스케줄링 된다. 한 스레드가 스스로 타임 슬라이스를 포기하거나 블록되거나 타임 슬라이스를 모두 사용했다면 동등한 우선순위의 다른 모든 스레드에 실행이 허용되고 그 후에 원래 윈도우 CE 스레드의 실행이 재개된다.


높은 우선순위 스레드가 블록 상태에서 해제되고 낮은 우선순위 스레드가 실행 중인 상태라면 낮은 우선순위 스레드는 즉시 일시 중지 상태가 되고 높은 우선순위 스레드가 스케줄링 된다. 낮은 우선순위 스레드는 자신보다 높은 우선순위 스레드보다 절대로 먼저 실행될 수 없다.


스케줄링 규칙에 예외가 하나 있다.


높은 우선순위 스레드가 대기 중인 리소스를 낮은 우선순위 스레드가 소유하고 있는 경우에 발생한다.


윈도우 ce 스케쥴러윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)


이런 우선순위 역전 현상(priority inversion deadlock)을 피하려면 낮은 우선순위 스레드에 임시적으로 높은 우선순위 스레드와 같은 우선순위를 주는 기법으로 낮은 우선순위 스레드가 재빨리 작업을 마치고 필요한 자원을 해제하는 방식을 사용한다.


이런 방식을 사용하면 낮은 우선순위 스레드가 실행될 기회를 절대 가지지 못할 것처럼 보이지만 대부분의 스레드는 스케줄링 되기 전까지 블록 된 상태다. (윈도우 CE 내부에서 해결) 스레드는 항상 THREAD_PRIORITY_NORMAL로 생성되므로(INHERIT_CALLER_PRIORITY 플래그로 주 스레드를 생성하는 예외가 있다) 우선순위를 변경하기 전까지는 모두 같은 우선순위로 존재한다.


보통 우선순위에서는 스레드가 대부분 블록 상태다. 예를 들어 애플리케이션의 주 스레드는 일반적으로 메시지를 대기하는 블록 상태다. 그 밖의 스레드는 여러 동기화 객체 중 하나를 사용해 블록 대기 상태로 있게 설계되어야 한다.


<< WinCE 더 읽기 >>


. WinCE 저전력 모드 프로그래밍 주의 사항 (윈도우 CE 스케줄링)

. WinCE(윈도우 CE) 메모리 아키텍처와 메모리 구조

. [윈도우API] DIB 섹션 프로그래밍 (WinCE 기준)

. MFC WinCE 유니코드 환경에서 파일 생성, 읽기(CFile, CStdioFile)

. [MFC강좌] 메모리 맵 파일 소스, WinCE(windows embedded compact)


출처 : 윈도우 임베디드 CE 6.0 프로그래밍, 더글라스 볼링

윈도우 CE 시스템 스케줄링에 대해 (WinCE Scheduler 스케줄러)

댓글