SW 개발

WinCE / Kernel / 기본개념 / Thread Quantum의 개념과 변경

. . . 2009. 5. 12. 01:35
반응형

Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : [출처] [강좌]Thread Quantum|작성자 글루미
- 기타사항 : 틀린사항은 댓글로 달아주세여~

 

요즘은.. 사람들이 참 많은 것을 요구합니다.  네비게이션만 돌리면 될 것이지, 네비 돌리면서 DMB가 보고싶어용네비 돌리면서 얏옹 *-_ -* 을 비롯한 동영상도 같이 보고 싶어요~ 하악 하악..물론 MP3 백그라운드로 도는건 기본..거기에 이것저것 추가되는 덩어리 커져가는 프로그램들..임베디드 시스템이라는 걸 모르는건지..... 특화된 기능이 아닌 완전 PC사양을 요구하는 요즘입니다. 각설하고, 위에서 넋두리를 한 것처럼 시장에선 여러가지 프로그램이 동시에 돌아가는 것을 요구합니다.

그말은 곧 OS에서 멀티태스킹.. MultiTasking을 요구한다는거죠.

Windows CE라는 OS는 멀티태스킹을 지원합니다. 이 말은 아주 짧은 시간에 Context Switching이 일어나면서 사람에게는 여러가지 프로그램들이 동시에 구동되는거처럼 보이게 한다. 는 겁니다. 여기서 각각의 Process들은 Priority (우선순위) 에 따라서 돌아가구요. 그리고 같은 우선순위는 Round Robin방식으로 스위칭을 합니다. 여기서 간단하게 정리하고 갈 것은 우선순위 입니다. Priority 죠. Windows CE에서 우선순위는 1 ~ 255까지 정의되어 있습니다. 값이 작을수록 높은 우선순위를 갖게됩니다. 아무리 멀티태스킹 환경의 OS라고 해도 우선순위 높은 프로그램 하나가 계속 잡고있게 되면 그놈만 줄창 돌아갑니다. ㅎㅎ 이건 어쩔 수 없죠. ㅡ,ㅡ;;;; 정말 그럴까? 라고 궁금하신 분은.. 그냥 보통 APP보다 우선순위가 높은것이 드라이버니까요 구동되는 디바이스 드라이버안에다가 While(1); 하나 넣어보시기 바랍니다.

어플리케이션들 멈춥니다. ㅋㅋㅋ 이 상황은 어쩔 수 없다 치고.. 본래의 이슈로 돌아와서..

그럼 같은 우선순위의 프로그램들은 어떻게 될까요?? 누가잡고, 어떻게 동작할지에 대해서 말이죠.. Windows CE는 같은 우선순위의 프로그램이 있을 경우 Round Robin 방식으로 골고루 CPU를 분배합니다. 예를 들어 ㄱ, ㄴ, ㄷ 의 세개의 APP이 있다면 ㄱ 10초 돌면 ㄴ 10초 돌게 해주고 다음 ㄷ 10초 돌게 해주는거죠.  물론 10초안에 끝나면 Process는 알아서 다음 놈에게 CPU를 내놓습니다.

여기서 말하는 10초. 라는 개념이 Thread Quantum입니다. 정확한 의미는

Thread Quantum이란 같은 우선순위의 Process들의 구동될 경우
하나의 Process에 최소한의 CPU점유 시간을 보장한다. 

이 시간을 Thread Quantum이라 합니다. .

사이좋게 나눠쓰게 해준다는거죠 ㅎㅎ Windows CE에서는 기본적으로 이 시간은 100ms 입니다.

엄~~청나게 큽니다. -_-; 이 값은 보통 임베디드 시스템에서는 그닥 영향을 끼치지 않습니다. 같은 우선순위의 Process들이 여러개 도는 상황은 별로 없으니까요.. 하지만 제일 위에 쓴 글처럼 NAVI에 PIP로 동영상 돌고, 뒤에선 MP3가 흘러나온다고 생각해봅시다. 보통 APP은 같은 우선순위를 갖고 있습니다. 이런 상황이라면.. 네비게이션이 길한번 찾기 시작하면.. 100ms를 잡아먹고.. 그 사이엔 동영상이나 mp3는 상큼하게 기다려야 합니다.

그렇게 되면.. 동영상 화면은 알흠답게 끊기고, mp3음악도 간혹 끊길 수도 있겠죠. 이걸 어떻게 극복할 수 있을까요? 100ms - 100ms - 100ms 이렇게 나눠쓰는거보다 10ms - 10ms - 10ms - 10ms - 10ms - 10ms - 10ms - 10ms 이런식으로 나눠쓰는것이 각각의 Process에게 이득입니다.  100ms의 시간을 보장해주다보니 이 개념없는 Process들이 쓰잘때기 없게도 그 시간만큼 필요하지 않으면서도 다 채우려는 욕심을 갖고있거든요 -_-;;

짬있을 때마다 놀고싶은 우리 개발자들과 매우 비슷합니다. ㅎㅎ 그래서 이 시간을 줄여서 각각의 Process들이 고루고루 빠르게 일을 할 수 있도록 변경한다면 같은 우선순위의 Process들이 잘 돌 수 있는 환경이 조성되겠죠?

그럼 한번 바꿔볼까요?

Thread Quantum은 KERNEL에서 변경할 수 있습니다.

Windows CE 5.0을 기반으로 설명합니다.  KERNEL\OAL\init.cpp  내의 OEMInit() 함수에서 변경할 수 있습니다. 변수의 이름은 dwDefaultThreadQuantum 입니다.

//------------------------------------------------------------------------------
//
//  Function:  OEMInit
//
//  This is Windows CE OAL initialization function. It is called from kernel
//  after basic initialization is made.
//
extern
"C"
extern
DWORD dwDefaultThreadQuantum;

void OEMInit()
{
...

     dwDefaultThreadQuantum = 넣고싶은 값;
...
}

이렇게 해주면 됩니다.  dwDefaultThreadQuantum 은 PRIVATE 내부에서 선언되어 있습니다. 그리고 이 값의 초기값은 100입니다. ms 단위인거죠. 이 변수를 extern으로 받아와서 값을 변경해버리면, KERNEL 에서 그것을 적용시킵니다. 1로해도 되고 5로해도되고 1000으로 해도 됩니다.  이 값을 변경하면 이후부터는 변경한 값을 이용하여 같은 우선순위 Context Switching을 하게 됩니다.

그럼 MSDN에서 나오는 설명을 봅시다.


Windows CE Features > Core OS Services > Core OS Design Development > Kernel Overview > Real-Time Performance > Real-Time Performance Functionality > Timer and Scheduling Management

As a preemptive multitasking operating system, Windows CE bases preemption solely on the priority of the thread; that is, Windows CE schedules threads with a higher priority to run first. Threads at the same priority level run in a round-robin fashion with each thread receiving a quantum, or slice, of execution time.

Because Windows CE enables an application to set the quantum on a thread-by-thread basis, you can adapt the scheduler to the current needs of your application. To adjust the quantum, Windows CE provides two functions:

Altering the quantum for a specified thread does not affect threads with a higher priority. You can set the default thread quantum for the system with the dwDefaultThreadQuantum OAL variable. It must be set during the OEMInit phase of OAL initialization and must be greater than zero; otherwise, it is ignored. Setting this value too low or too high can have dramatic effects on OS performance. When the system starts, dwDefaultThreadQuantum is set to a default value of 100 milliseconds. If you want to change the default value, you must declare the value and change the default. The following code example shows this.

아주 잘 설명되어 있네요. ^^ 제가 여태까지 헛소리 한 것을 일목요연하게 간단한 글로 설명해놓았습니다. -_- 젝일.. 이것을 이용한다면, 시스템을 구축하는 여러분들에게 약간의 도움이 될 수 있겠죠? ^^ 한가지 주의할 것은 있습니다. 만약 이 값을 변경하실거라면, 변경 후 모든 시스템 테스트를 다시 하시기 바랍니다. 이 값의 변경으로 인해 어떤 다른 Process.. 디바이스 드라이버같은.. 에서 문제를 발생시킬 수도 있기 때문입니다.

정리해보면

1. Thread Quantum은 우선순위가 다른 Process에는 영향이 없다.
2. Thread Quantum은 같은 우선순위의 Process간의 시간보장(?)이다.
3. 이 값을 커널에서 변경할 수 있다.
4. 값을 변경했다면, 꼭 전체 시스템 테스트를 해야 한다.
5. 별로 변화가 안보일 수도 있으므로 실망하지 말자 -_-;

반응형