티스토리 뷰

운영체제

[MicroC/OS-II] TCB Management

머어하지 2017. 4. 16. 16:23

  MicroC/OS-II 를 알아보기에 앞서 Process에 관한 것들을 알아보았습니다.


1. 프로세스(Process)란 무엇일까?

2. 프로세스(Process)의 Lifetime과 Process State

3. 프로세스(Process)의 주소 공간(Address Space)

4. Process Management & Process Metadata

5. PCB(Process Control Block) & Process Management


  마지막으로 알아보았던것이 PCB(Process Control Block)에 관한 내용이였습니다. MicroC/OS-II 에서는 Process를 사용하지 않고 유사한 Task라는 놈을 사용합니다. 따라서 앞에서 알아보았던 Process 들이 다 MicroC/OS-II 에서는 Task로 이름만 바뀐다 생각하시면 됩니다.

(PCB -> TCB(Task Control Block) 처럼 바뀌게 됩니다.)


  MicroC/OS-II에 대해 간단히 알아봅시다.

  MicroC/OS-II 는 uC/OS-II라고도 쓰이며 OS지만 Size가 작고 함수가 제한되어있어 주로 임베디드 시스템에서 사용되어집니다. 이러한 특성을 간단히 보겠습니다.


1) Task는 64개가 최대입니다.

2) 각각의 Task는 다른 우선권(Priority)를 가지고 있습니다.

  - 각각 다른 Priority를 가지고 있기 때문에 ID처럼 활용할 수 있습니다.

  - 앞서 64개가 최대였으므로 0~63 까지의 Priority를 가질 수 있습니다.

3) Task의 Metadata는 TCB에 저장이 됩니다.


TCB에 대해 알아봅시다.

  PCB는 Structure 구조로 되어있다고 알아보았습니다. TCB도 마찬가지 입니다. 코드를 통해 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct os_tcb {
 OS_STK *OSTCBStkPtr;
 struct os_tcb *OSTCBNext;
 struct os_tcb *OSTCBPrev;
#if ((OS_Q_EN > 0&& (OS_MAX_QS > 0)) ||
(OS_MBOX_EN > 0|| (OS_SEM_EN > 0||
(OS_MUTEX_EN > 0)
 OS_EVENT *OSTCBEventPtr;
#endif
#if ((OS_Q_EN > 0&& (OS_MAX_QS > 0)) ||
(OS_MBOX_EN > 0)
 void *OSTCBMsg;
#endif
 INT16U OSTCBDly;
 INT8U OSTCBStat;
 INT8U OSTCBPrio;
 INT8U OSTCBX;
 INT8U OSTCBY;
 INT8U OSTCBBitX;
 INT8U OSTCBBitY;
#if OS_TASK_DEL_EN > 0
 BOOLEAN OSTCBDelReq;
#endif
} OS_TCB;
cs


  우선 제일 눈에 띄는 #if문 같은 구조를 보겠습니다. 일반적으로 사용하면 if만 쓰면 되지만 #을 붙여주게되면 만약 compile시 if문을 만족을 하지 않으면 해당 코드가 제거됩니다. 따라서 코드가 가벼워 질 수 있습니다. 다음으로 선언 부분을 보시겠습니다.


1
2
 struct os_tcb *OSTCBNext;
 struct os_tcb *OSTCBPrev;
cs


  OSTCBNext와 OSTCBPrev가 아직 먼지는 모르겠지만 * 즉 포인터(Pointer) 형태로 되어있습니다. 앞서 '5. PCB(Process Control Block) & Process Management' 에서 말씀드렸지만 PCB를 관리하는 Linked List를 사용할 때 화살표가 포인터를 의미한다고 알아보았습니다. 따라서 Next와 Prev는 양쪽을 포인트 하고있는 주솟값이라 생각하시면 됩니다. 다음 부분을 보시겠습니다.


1
2
3
4
5
6
7
 INT16U OSTCBDly;
 INT8U OSTCBStat;
 INT8U OSTCBPrio;
 INT8U OSTCBX;
 INT8U OSTCBY;
 INT8U OSTCBBitX;
 INT8U OSTCBBitY;
cs


  INT16U, INT8U에 대해서 보겠습니다. INT는 말그대로 int 형을 의미합니다. 16, 8은 bit를 U는 Unsign을 의미합니다. 따라서 INT8U = int형인 8bit unsign인 변수라는 뜻이됩니다. 표를 통해 각각이 의미를 살펴보겠습니다.


형태 

선언 

뜻 

INT16U

OSTCBDly 

Delay

INT8U

OSTCBStat 

Task의 Current State 

INT8U

OSTCBPrio 

Task의 Priority 

INT8U

OSTCBX 

 CPU Scheduling에 사용

INT8U

OSTCBY 

INT8U

OSTCBBitX 

INT8U

OSTCBBitY 


  MicroC/OS-II에서 Process대신 사용되는 TCB라는 개념에 대해서 알아보았습니다. 그럼 어떤식으로 TCB를 다루는지 알아보겠습니다.


TCB Management

  TCB와 PCB는 거의 같은 개념이라 생각된다고 알아보았습니다. 따라서 PCB와 마찬가지로 TCB도 다음과 같은 특성을 가지게 됩니다.


1) Task가 생성(Creation)되면 TCB가 생성됩니다.

2) Task가 제거(Termination)되면 TCB도 제거(Destroy)됩니다.


  MicroC/OS-II에서 사용되는 개념이기 때문에 PCB와 다른점은 다음과 같습니다.


1) MicroC/OS-II에서 최대 Task의 수는 64개이므로 TCB도 최대 64개 입니다.

2) 최대 64개이므로 그 수가 많지 않습니다. 따라서 생성되는 TCB마다 memory 할당을 해주는게 아니라 미리 Free TCB를 다 만들어 놓고나서 Task가 생성되면 Free TCB를 할당해 줍니다. ( 미리 만들어놓은 것을 주는 것이므로 속도가 더 빠릅니다. )

3) Task가 제거되면 해당 TCB도 다시 Free TCB로 돌아가게됩니다.


  이러한 Free TCB와 TCB관리를 위해서 MicroC/OS-II에서는 OSTCBFreeList와 OSTCBList를 사용하고있습니다. 둘의 비교를 살펴보겠습니다.


 OSTCBFreeList

 Free TCB들이 Single Linked List 형태로 연결되어있다.

OSTCBFresList가 list의 header이다.(Pointer)

 OSTCBList

TCB들이 Doubly Linked List 형태로 연결되어있다. 

 OSTCBList가 list의 header이다.(Pointer)


  이제 OSTCBFreeList부터 그림을 통해 살펴보겠습니다.

  앞서 보았던 PCB의 Linked List와 거의 유사합니다. 다만 화살표가 양쪽이 아닌 한쪽으로 되어있는 Single Linked List방식 입니다. OSTCBFreeList가 Header로 있는것을 보실 수 있으며, 그림에는 다 나와있지 않지만 초기에 64개 까지 다 만들어져 있습니다. 이는 앞에서 알아보았던 대로 64개 밖에 안되기 때문에 미리 만들어 두어도 부하가 크지 않으며 속도 면에서의 이득이 더 크기 때문입니다. 그리고 Task가 생성이 되면 Free TCB는 정보를 얻은 채로 OSTCBList에 붙게 됩니다. 다음으로 OSTCBList를 보겠습니다.


  PCB의 List와 첫 OSTCBList를 제외하면 똑깥습니다. OSTCBList는 Free List에서 나온 값을 가지고 있는 TCB들이 들어오므로 정확한 숫자는 알 수 없습니다.(실행 중인 Task에 따라 다르겠지요!) Task가 생성이 되면 TCB가 list에 삽입(insert)되게 됩니다.  그리고 Task가 제거되면 해당 TCB는 list에서 사라지고(unlinked) OSTCBFreeList로 삽입되게 됩니다.


  간단한거 같으면서도 복잡한듯! PCB와 유사한 MicroC/OS-II에서 사용되는 TCB에 대해 알아보았습니다. PCB를 복습한 느낌 + 약간의 TCB만의 개념이 들어갔습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday