從代碼上看,程序控制塊就是一個結構體.例如:數組
typedef struct tcb{ char * tast_name; //任務名字 int p; //任務重要級別 int v_number; //版本號 void (*fun)(void); //指向存儲任務代碼空間地址 }TCB;
操做系統能夠經過這個結構體控制與之相關聯的代碼,所以把這種結構叫作程序控制塊.
例子:函數
#include <stdio.h> #include <string.h> //TCB定義 typedef struct tcb{ char * task_name; //任務名字 int p; //任務重要級別 int v_number; //版本號 void (*fun)(void); //指向存儲任務代碼空間地址 }TCB; //任務1 void Task1() { int i; for (i=0; i<10; i++) printf("1111111111\n"); } //任務2 void Task2() { int i; for (i=0; i<10; i++) printf("222222222222\n"); } //任務3 void Task3() { int i; for (i=0; i<10; i++) printf("3333333333333\n"); } //建立控制塊函數 TCB GreatTCB(char *name, int pp, int vnum, void (*f)()) { TCB tcb; tcb.task_name = name; tcb.p = pp; tcb.v_number = vnum; tcb.fun = f; return tcb; } //主任務 int main() { char name_buf[10]; int t, i; //定義TCB數組大小 TCB tcbTbl[3]; //建立task tcbTbl[0] = GreatTCB("task1", 2, 1, Task1); tcbTbl[1] = GreatTCB("task2", 3, 4, Task2); tcbTbl[2] = GreatTCB("task3", 4, 4, Task3); printf("Input task name: "); gets(name_buf); t = 0; //seek for (i=0; i<3; i++) { if (strcmp(tcbTbl[i].task_name, name_buf) == 0) { tcbTbl[i].fun(); t = 1; } if (i == 2 && t == 0) printf("No %s\n", name_buf); } return 0; }
爲了方便管理和組織程序控制塊,一版在TCB中再定義兩個指針,一個前指針, 一個後指針,用於把TCB組織起來,方便管理; 而且當程序控制塊數組過大時,還會單獨定義一個數組,數組的各個元素分別按照順序指向程序控制塊鏈表,這樣作的目的是爲了提升程序運行速度,由於鏈表查詢很耗時.操作系統