由于操作系统具有与普通软件不同的任务, 因此它就有些不同的特点, 包括一些不同的数据结构, 常用数据结构如下
一. 程序控制块
typedef struct tcb
{
char* code_name; //代码名称
int p; //重要性级别
int V_num; //版本号
void (*fun)(void); //指向被管理代码的函数指针
}TCB;
为了把这个结构与被管理代码关联起来, 该结构包含了一个指向被管理代码的指针(函数指针), 如下图所示
例2-8代码:
/*
* @Author: FourLeafClover
* @Date: 2018-10-13 10:52:38
* @Last Modified by: FourLeafClover
* @Last Modified time: 2018-10-13 11:48:56
*/
#include
#include
/*TCB结构体定义*/
typedef struct tcb
{
char* code_name; //代码名称
int p; //重要性级别
int V_num; //版本号
void (*fun)(void); //指向被管理代码的函数指针
}TCB;
/*
* @Fuction: fun1
* @Description: 代码块一服务函数
* @param: 无
* @return: 无
*/
void fun1(void)
{
printf("I am fun1\n");
}
/*
* @Fuction: fun2
* @Description: 代码块二服务函数
* @param: 无
* @return: 无
*/
void fun2(void)
{
printf("I am fun2\n");
}
/*
* @Fuction: fun3
* @Description: 代码块三服务函数
* @param: 无
* @return: 无
*/
void fun3(void)
{
printf("I am fun3\n");
}
/*
* @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
* @Description: 创建代码块函数
* @param name: 代码块的名字
* @param pp: 代码块重要性
* @param vnum: 代码块版本号
* @param f: 代码块的执行函数
* @return: tcb: 初始化的代码块结构体
*/
TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
{
TCB tcb; //创建程序控制块结构体
tcb.code_name = name; //控制块代码块名字赋值
tcb.p = pp; //重要性级别赋值
tcb.V_num = vnum; //版本号赋值
tcb.fun = f; //控制函数赋值
return tcb;
}
int main(void)
{
char code_name[3] = {0};//定义代码块名字
char i = 0;
char t = 0; //定义查询标志
TCB tcb[3]; //创建TCB结构体数组
tcb[0] = GreateTCB("F1", 2, 1, fun1); //定义代码块一的初始值
tcb[1] = GreateTCB("F2", 3, 1, fun2); //定义代码块二的初始值
tcb[2] = GreateTCB("F3", 4, 1, fun3); //定义代码块二的初始值
/*用户查询需要的函数名, 并输入*/
printf("Please select fun_name:");
scanf("%s", code_name);
/*在tcb结构体中查询用户寻找的函数名*/
for (i = 0; i < 3; i++)
{
/*对比结构体中的名字书否与用户输入的名字一样*/
if(strcmp(tcb[i].code_name, code_name) == 0)
{
tcb[i].fun(); //一样则调用相应的函数
t = 1; //置标志位为1
}
/*没有查询相应的函数*/
if((t == 0)&&(i == 2))
{
/*打印提示信息*/
printf("No code_name: %s\n", code_name);
}
}
return 0;
}
/*
* @Author: FourLeafClover
* @Date: 2018-10-13 10:52:38
* @Last Modified by: FourLeafClover
* @Last Modified time: 2018-10-13 18:21:30
*/
#include
#include
/*TCB结构体定义*/
typedef struct tcb
{
struct tcb *pre; //指向前一个结构体的指针
struct tcb *next; //指向下一个结构体的指针
char* code_name; //代码名称
int p; //重要性级别
int V_num; //版本号
void (*fun)(void); //指向被管理代码的函数指针
}TCB;
/*
* @Fuction: fun1
* @Description: 代码块一服务函数
* @param: 无
* @return: 无
*/
void fun1(void)
{
printf("I am fun1\n");
}
/*
* @Fuction: fun2
* @Description: 代码块二服务函数
* @param: 无
* @return: 无
*/
void fun2(void)
{
printf("I am fun2\n");
}
/*
* @Fuction: fun3
* @Description: 代码块三服务函数
* @param: 无
* @return: 无
*/
void fun3(void)
{
printf("I am fun3\n");
}
/*
* @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
* @Description: 创建代码块函数
* @param pre: 前一个控制块结构体地址
* @param next: 后一个控制块结构体地址
* @param name: 代码块的名字
* @param pp: 代码块重要性
* @param vnum: 代码块版本号
* @param f: 代码块的执行函数
* @return: tcb: 初始化的代码块结构体
*/
TCB GreateTCB(TCB *pre, TCB *next, char*name, int pp, int vnum, void(*f)(void))
{
TCB tcb; //创建程序控制块结构体
tcb.pre = pre; //设置前一个控制块的地址
tcb.next = next; //设置后一个控制块的地址
tcb.code_name = name; //控制块代码块名字赋值
tcb.p = pp; //重要性级别赋值
tcb.V_num = vnum; //版本号赋值
tcb.fun = f; //控制函数赋值
return tcb;
}
int main(void)
{
char str_number = 0;//定义代码块名字
char i = 0;
char t = 0; //定义查询标志
TCB tcb[3]; //创建TCB结构体数组
TCB *(tcb_array[3]) = {NULL}; //定义三个指针的指针数组
tcb[0] = GreateTCB(NULL, &tcb[1], "F1", 2, 1, fun1); //定义代码块一的初始值
tcb[1] = GreateTCB(&tcb[0], &tcb[2], "F2", 3, 1, fun2); //定义代码块二的初始值
tcb[2] = GreateTCB(&tcb[1], NULL, "F3", 4, 1, fun3); //定义代码块二的初始值
/*给指针数组赋值*/
for (i = 0; i < 3; i++)
{
tcb_array[i] = &tcb[i];
}
/*用户查询需要的函数, 并输入*/
printf("Please select number struct:");
scanf("%d", &str_number);
/*查找相应的结构体*/
if(NULL == tcb_array[str_number]->pre)
printf("the pre struct is NULL\n");
else
(tcb_array[str_number] -> pre) -> fun();
tcb_array[str_number] -> fun();
if(NULL == tcb_array[str_number]->next)
printf("the next struct is NULL\n");
else
(tcb_array[str_number] -> next) -> fun();
return 0;
}
三 位图
看到位图, 想起了做智能的时候, 对图像进行二值化, 这个原理也差不多. 做个小实验吧, 把上面的三个结构体控制块分别设一个已经被占用, 两个个未被占用, 让程序找出未被占用的控制块.代码如下:
/*
* @Author: FourLeafClover
* @Date: 2018-10-13 10:52:38
* @Last Modified by: FourLeafClover
* @Last Modified time: 2018-10-13 18:50:35
*/
#include
#include
/*TCB结构体定义*/
typedef struct tcb
{
struct tcb *pre; //指向前一个结构体的指针
struct tcb *next; //指向下一个结构体的指针
char* code_name; //代码名称
int p; //重要性级别
int V_num; //版本号
void (*fun)(void); //指向被管理代码的函数指针
char UsingFlag; //定义是否正在使用, 0-未使用 1-正在使用
}TCB;
/*
* @Fuction: fun1
* @Description: 代码块一服务函数
* @param: 无
* @return: 无
*/
void fun1(void)
{
printf("I am fun1\n");
}
/*
* @Fuction: fun2
* @Description: 代码块二服务函数
* @param: 无
* @return: 无
*/
void fun2(void)
{
printf("I am fun2\n");
}
/*
* @Fuction: fun3
* @Description: 代码块三服务函数
* @param: 无
* @return: 无
*/
void fun3(void)
{
printf("I am fun3\n");
}
/*
* @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
* @Description: 创建代码块函数
* @param pre: 前一个控制块结构体地址
* @param next: 后一个控制块结构体地址
* @param name: 代码块的名字
* @param pp: 代码块重要性
* @param vnum: 代码块版本号
* @param f: 代码块的执行函数
* @param UsingFlag: 是否使用标志位
* @return: tcb: 初始化的代码块结构体
*/
TCB GreateTCB(TCB *pre, TCB *next, char*name, int pp, int vnum, void(*f)(void), char UsingFlag)
{
TCB tcb; //创建程序控制块结构体
tcb.pre = pre; //设置前一个控制块的地址
tcb.next = next; //设置后一个控制块的地址
tcb.code_name = name; //控制块代码块名字赋值
tcb.p = pp; //重要性级别赋值
tcb.V_num = vnum; //版本号赋值
tcb.fun = f; //控制函数赋值
tcb.UsingFlag = UsingFlag;//对标志位赋值
return tcb;
}
int main(void)
{
char str_number = 0;//定义代码块名字
char i = 0;
char t = 0; //定义查询标志
TCB tcb[3]; //创建TCB结构体数组
TCB *(tcb_array[3]) = {NULL}; //定义三个指针的指针数组
tcb[0] = GreateTCB(NULL, &tcb[1], "F1", 2, 1, fun1, 0); //定义代码块一的初始值
tcb[1] = GreateTCB(&tcb[0], &tcb[2], "F2", 3, 1, fun2, 0); //定义代码块二的初始值
tcb[2] = GreateTCB(&tcb[1], NULL, "F3", 4, 1, fun3, 0); //定义代码块二的初始值
/*给指针数组赋值*/
for (i = 0; i < 3; i++)
{
tcb_array[i] = &tcb[i];
}
/*用户查询需要的函数, 并输入*/
printf("Please select Using tcb number:");
scanf("%d", &str_number);
/*置相应的控制块为使用标志*/
tcb[str_number].UsingFlag = 1;
/*查找证被使用的控制块*/
for (i = 0; i < 3; i++)
{
if (1 == tcb[i].UsingFlag)
{
tcb[i].fun();
break;
}
}
if(3 == i)
{
printf("can not find!\n");
}
return 0;
}
完结!!!