(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组织起来,方便管理; 而且当程序控制块数组过大时,还会单独定义一个数组,数组的各个元素分别按照顺序指向程序控制块链表,这样作的目的是为了提升程序运行速度,由于链表查询很耗时.操作系统

相关文章
相关标签/搜索