OS분석(2) picoKernel

OS 2007. 12. 17. 23:56
1.3 picoKernel의 thread 생성
picoKernel에서 함수는 thread로 등록할 수 있다.
thread의 생성은 threadCreate()함수로 처리한다.
thread의 관리는 thread entry structure로 처리한다.

아래는 thread하나의 entry structure이다.
----------------------------------------------------------------------
typedef struct threadEnt {
    struct threadEnt *tNext;        // point to next thread entry

    enum threadState tState;        // thread state
    int tPrio;              // thread priority

    int (*tStart)(int);         // start function address
    int tArg;               // argument of tStart()

    char *tStack;           // stack base address
    int tStackSize;         // stack size in bytes

    unsigned long tContext;     // address of context area

#ifdef KERNEL2 // .........
    // fields for signal operation
    void (*tSigTab[NUM_SIGNAL])(int);   // handler functions
    unsigned short tSignals;        // signal bits
#endif // KERNEL2 .........

#ifdef PROCESS
    struct procEnt *tProc;      // the process of this thread
    struct threadEnt *tSibling;     // threads of the same process
#endif

} threadEntT;
----------------------------------------------------------------------

threadCreate()는 3개의 매개변수를 받는데
첫번째 매개변수가 우선순위, 두번째 매개변수가 함수의 주소, 세번째 매개변수가
함수의 매개변수이다.
threadCreate()가 실행되면 threadEntT 를 하나 만들고 넘어온 thread의 정보를
threadEntT에 저장하고 context정보를 할당한다. context정보가 있어야
다른 thread가 동작하다가 context switch가 일어나도 상태를 유지할 수 있다.
tContext에 이 정보가 저장된다.

context정보는 스택에 저장되는데 처음 threadInit()함수에서 영역을 할당하고
threadCread함수에서 해당 context정보를 스택에 저장한다. 그리고 context의 위치정보를
tContext가 가지고 있다.
context정보를 담는 stack은 여러 thread의 context를 담고 있는 stack이다.
하나의 블록이 하나의 thread의 문맥정보를 가지고 있으며
각 thread는 이 위치를 알아야 문맥교환이 가능하다.

일련의 과정이 끝나면 thread가 스케줄러에 등록이 되면서
등록되어 있는 thread목록중에서 가장 우선순위가 높은 thread가 실행된다.
다른 thread가 동작하고 있다가도 새로운 thread가 등록되었을 때
새로 등록한 thread의 우선순위가 높다면 새로운 thread가 실행되게 된다.
(schedRunHighest())

threadExit()는 현재 동작하고 있는 thread를 종료하겠다는 의미이다.
현재 동작하고 있는 thread의 제어권을 다른 thread로 넘기고
thread의 리스트에서 자신의 목록을 제거하고
schedRunHighest()로 우선순위가 가장 높은 thread를 실행한다.

threadYield()는 동작하던 일을 멈추고 다른 thread에게 제어권을 양보하는 것이다.
제어권을 다른 thread에게 넘기고 자신의 정보를 스케줄러의 ready list에 등록한다.

대략 정리하자면
thread를 생성하려면 thread의 정보를 가진 구조체에 thread의 내용을 저장해야한다.
이 내용에는 자신의 함수 주소, 매개변수, 우선순위, context의 위치, thread의 상태
를 저장하고 스케줄러에 자신을 등록한다.

1.4 picoKernel scheduling
picoKernel에서는 thread의 리스트를 Running, Ready, Free 3개로 나타낸다.
3개의 포인터 모두 thread의 리스트를 가리키고 있다.
scheduling의 시작은 thread의 생성부터 시작된다.
thread를 생성하게 되면 상태를 ready상태로 두고 스케줄러의 Ready리스트에 등록하고
우선순위가 가장 높은 thread를 실행하게 한다.

schedInsertReady()함수가 thread를 생성할 때 ready 리스트에 등록하는 함수인데
링크드리스트로 되어 있는 ready 리스트에 우선순위 순서대로 등록된다.

schedRunHighest()함수는 현재 우선순위가 가장 높은 thread로 문맥교환하게 된다.
만약 현재 동작하고 있는 thread와 readlist에 있는 첫번째 thread의 우선순위가
같다면 문맥교환을 하지 않는다. 문맥교환을 하게 되면
현재 동작하고 있는 thread는 readlist로 이동하게 된다.
AND