잠시 쉬어 가도록 해요. TCB 얘기가 나왔으니까 말인데, TCB에는 어떤 정보들이 들어 갈런지.. 한번 빠져보시렵니까? 각각의 Task는 자기 고유의 TCB를 가져요. TCB는 Kernel이 Task들을 관리하기 위한 Meta Data*라고 보시면 되지요. 여하간 흔히들 사용하는 TCB는 적당히 아래와 같은 모습이라고 보시면 될 것 같아요.
typedef struct {
struct task_tcb_struct *next_ptr;
struct task_tcb_struct *prev_ptr;
} task_tcb_link_type ;
typedef struct task_tcb_struct {
char task_name[200];
void *sp; /* 스택 포인터 */
uint32 receive_siganl ; /* 받은 Signal */
uint32 wait_signal ; /* 기다리는 Signal */
uint32 pri; /* Task의 Priority */
task_tcb_link_type link; /* for TCB list */
} task_tcb_type ;
아~주 simple한 case의 대표적인 member만 넣어 두었는데요,시스템에 따라 그때그때 들어가야 하는 내용은 다릅니다요. 하나하나 가지고 가볼까요?
ⓐ Task_name : Task의 이름. Kernel은 이 member를 사용 할 리가 만무 하고요, 그냥 사람이 Debugging 목적으로 이름이 있으면 좀더 식별하기 편하니까 넣어놓는 member에요. string으로 넣어 두는 거니까, 심각하게 받아들이지 말아주세요.
ⓑ sp : Stack Pointer, 각각의 Task는 자기 고유의 Stack이 있음을 확인 하셨겠지요. 각각의 task stack의 사용처는 각 task이 실행 될 때 흔히들 아는 local variable등을 저장하는 stack 고유의 용도로 사용되고, 또 하나 중요한 것은 Context Switching시에 해당 task의 context를 저장하는 용도로 사용된다는 거지요. 이런 두 번째 이유 때문에, 각 task가 자기의 stack을 가져야 한다는 거에요.
ⓒ sigs와 wait : 잘 이해하고 있겠지만요, Task끼리 주고 받는 signal들이 들어 있고요, 이를 이용해서 Task의 state를 나타낼 수 있지요.
ⓓ Link Pointer : 이 pointer는 TCB를 Double Linked List로 관리 할 수 있도록 해 주지요. 구현에 따라서 Double Linked List로 관리 안 하는 녀석들도 있을 수 있지만, 가장 편한 방법으로 TCB를 Linked List로 연결해서 관리하면 새로운 TCB를 중간에 끼워 넣기도 편하고, Priority 순으로 정렬하기도 편하고 하는 이유로 이런 구현이 많이 선호되는 거에요.
지금은 아주 간단하고, Simple한 TCB member들만 살펴 보았는데, Task를 다루면서 점점 더 하나씩 더 집어 넣으면서 살펴 보아야 할 것 같아요.
댓글