【操作系统】Dos下的多任务系统

这篇博客回顾了作者在操作系统课程设计中实现Dos下多任务系统的过程,特别提到了使用Turbo C2.0和interupt关键字。文章还提及了课程导师周旭老师的教学,并表达了对学弟们的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作系统的课程设计作业之一,想想当初关于这段代码被老师拷问成了狗,简直是生命不能承受之重啊.如果有学弟选择了周旭老师的操作系统,我唯一能帮助你的就是代码拿过去用.还有他是个好老师.


代码必须在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.退出多任务系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值