(C)程序控制塊(TCB)

程序控制塊

1. 程序控制塊

從代碼上看,程序控制塊就是一個結構體.例如:數組

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;
    }

2. 控制塊鏈表

爲了方便管理和組織程序控制塊,一版在TCB中再定義兩個指針,一個前指針, 一個後指針,用於把TCB組織起來,方便管理; 而且當程序控制塊數組過大時,還會單獨定義一個數組,數組的各個元素分別按照順序指向程序控制塊鏈表,這樣作的目的是爲了提升程序運行速度,由於鏈表查詢很耗時.操作系統

相關文章
相關標籤/搜索