操作系统的课程设计作业之一,想想当初关于这段代码被老师拷问成了狗,简直是生命不能承受之重啊.如果有学弟选择了周旭老师的操作系统,我唯一能帮助你的就是代码拿过去用.还有他是个好老师.
代码必须在Turbo C2.0环境下运行,因为需要用到interupt关键字.
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
** #include "indos.c"
** #include "exterr.c"
*/
#define GET_INDOS 0X34 /*未公开的34h号系统功能调用,可得到INDOS标志的地址(由ES:BX返回)*/
#define GET_GRIT_ERR 0X5D06
#define NTCB 5 /*系统允许的最多任务数*/
#define NTEXT 20 /*消息字符串的最大长度*/
#define NBUF 5 /*缓冲队列的最大长度*/
/* state code */
/* null 0 not assigned */
#define FINISHED 0 /*线程的状态标志 */
#define RUNNING 1 /*线程的状态标志 */
#define READY 2 /*线程的状态标志 */
#define BLOCKED 3 /*线程的状态标志 */
#define NAME_MAX 10 /*线程外部标识符的最大长度*/
/*
unsigned oldss;
unsigned oldsp;
*/
static int current = 0; /* 当前正在执行程序的内部标志符 */
int multstop = 1; /* */
int timecount = 0; /*记录当前线程从上次调度至今已经运行了多少时钟中断间隔 单位 1/18.2second*/
int TL; /*时间片的大小*/
int n = 0;
int buf1;
char far *indos_ptr = 0 ; /*存放INDOS标志的地址*/
char far *crit_err_ptr = 0 ; /*存放严重错误标志的地址*/
/* the pointer to the process's code */
typedef int (far *codeptr)(void);
typedef struct
{
int value;
struct TCB *wq; /* */
} semaphore;
semaphore mutexfb = {1, NULL}; /* 消息缓冲队列的互斥信号量 */
semaphore sfb = {NBUF, NULL}; /* 消息缓冲队列的计数信号量 */
semaphore mutex = {1, NULL}; /* 接收队列的消息队列的互斥信号量 */
semaphore sa = {1, NULL}; /* */
semaphore sb = {0, NULL};
struct buffer
{
int id;
int size;
char text[NTEXT];
struct buffer *next;
} buf[NBUF], *freebuf; /*freebuf:空闲缓冲队列(是一临界资源)*/
struct TCB
{
int priority; /* 线程的优先级 0~10 */
int id; /* 每个线程的唯一的内部标识符 */
unsigned sp;
unsigned ss;
unsigned int *chan; /* event process is awaiting */
struct buffer *mq;
semaphore mutex;
semaphore sm; /* 接受线程的消息队列的计数信号量,用于实现同步 */
struct TCB *next; /* link pointer */
char name[NAME_MAX]; /* 每个进程的外部标识符 */
unsigned char *stack; /* 堆栈的起始地址 */
char state; /* 线程的状态 */
} tcb[NTCB] ;
/* the registers pushed in the stack after entering an interrupt funtion */
struct int_regs
{
unsigned bp;
unsigned di;
unsigned si;
unsigned ds;
unsigned es;
unsigned dx;
unsigned cx;
unsigned bx;
unsigned ax;
unsigned ip;
unsigned cs;
unsigned flags;
unsigned off;
unsigned seg;
};
void interrupt (*old_int8)(void); /*函数指针*/
void interrupt new_int8(void); /*函数:解决因时间片到时引起的调度*/
int create(char *name, codeptr code, int stck, int priority_num);/*创建一个线程,让其执行code开始的代码*/
void destroy(int id); /*撤销一个线程*/
void over(void);
/*如果是当前线程运行完成而引起现场给你撤销,则系统能自动撤销该线程,并重新进行CPU调度,先调用destroy()*/
void interrupt swtch(void); /*调度程序函数:(原因)1.线程执行完毕 2.阻塞*/
int all_finished(void); /*检查系统中除了0#线程以外的所有其他线程是否都已经运行完成,是返回1,否返回0*/
void free_all(void); /*把TCB数组全部释放掉*/
void tcb_state(void); /*输出所有的线程的当前状态信息*/
void InitTcb(void); /*创建空白的TCB数组并初始化*/
int DosBusy(void); /*判断是否DOS忙*/
void block(unsigned *chan, struct TCB **qp);
void free_all(void);
struct buffer *getbuf(void); /* 获取空闲缓冲区函数 */
void init_buf(void);
void InitInDos(void);
void insert(struct buffer **mq, struct buffer *buff); /* 插入缓冲区到缓冲队列函数 */
void interrupt new_int8(void); /* 调度程序的函数:解决因时间片到时引起的调度(通过截断时钟中断int08)*/
void over(void);
void p(semaphore *sem);
void p(semaphore *sem);
int receive(char *sender,char *b); /* 接受原语 */
void receiver(void);
struct buffer *remov(struct buffer **mq, int sender); /* 获取消息缓冲区队列函数 */
void sender(void);
void interrupt swtch(void);
void wakeup_first(struct TCB **qp);
void f1(void);
void f2(void);
void f3(void);
void f4(void);
void f5(void);
void f6(void);
void cp(void);
void cp1(void);
void iop(void);
void iop1(void);
int main(void)
{
int temp; //这个变量用来存储create函数的返回值,从而判断create是否成功
int sele = -1; //selection:选择对应操作的序号
char name[NAME_MAX];
InitInDos(); /*获得INDOS标志的地址和严重错误标志的地址*/
InitTcb();
old_int8 = getvect(8); /*获取系统原来的INT08H的中断服务程序的入口地址*/
/* 创建 #0# 号进程 */
strcpy(tcb[0].name, "main");
tcb[0].state = RUNNING;
current = 0;
for(; sele;)
{
do
{
clrscr();
printf("\n\n\n\t***********************************************************\n");
printf("\t* 0.退出多任务系统