杭电操作系统实验-基于DOS的多任务系统的实现精选.doc

杭电操作系统实验-基于DOS的多任务系统的实现精选.doc

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
杭电操作系统实验-基于DOS的多任务系统的实现精选

操作系统课程设计报告 小组编号: 小组成员: 一 题目:基于DOS的多任务系统的实现 实现内容 设计思路(主要算法描述、程序流程图等): 1、程序的设计思想: 该程序主要是分5大块内容:线程的创建和撤销,线程的调度,线程的同步与互斥,线程的阻塞与唤醒,利用消息缓冲队列的线程间的通信。由这五大块功能来完成的基于DOS的多任务系统的实现。在这个系统中,首先先由main函数进行一些初始化工作,然后直接创建0#线程对应于main函数,再由0#线程调用create创建1#,2#线程分别对应与函数f1(),f2(),最后将系统的中断服务程序设置为new_int8,并把控制交给1#线程,启动多个线程的并发执行。 0#线程是一个比较特殊的线程,它在创建的时候没有使用create来创建,而是在系统初始化后直接创建的,因它对应的程序段为main函数中的一段,所以也直接使用整个系统的堆栈,而不再创建时为私有堆栈分配额外的空间;同样,撤销的时也不需要释放私有堆栈的空间,所以也没有over()函数而是直接撤销,从这方面来看,它是一个系统线程。 此外,在启动多个线程并发执行过程后,0#线程将系统控制权转交出去,直至系统中其他进程都不具备执行条件时,它才有可能重新得到CPU,从这方面看,0#线程相当于是一个空转线程,最后,0#线程还担负着一个特别的使命:等待系统中所有其他的线程的完成,此时,它将直接撤销自己并恢复原来的时钟中断服务程序,从此终止整个多任务系统。 主要算法描述 /* null 0 not assigned */ #define FINISHED 0 /*表示线程处于终止态或TCB是空白状态*/ #define RUNNING 1 /*表示线程处于运行态*/ #define READY 2 /*表示线程处于就绪态*/ #define BLOCKED 3 /*表示线程处于阻塞态*/ struct TCB{ unsigned char *stack; /* 线程堆栈的起始地址 */ unsigned ss; /* 堆栈段址 */ unsigned sp; /* 堆栈指针 */ char state; /* 线程状态 ,取值可以是FINISHED、RUNNING、READY、BLOCKED*/ char name[10]; /* 线程的外部标识符 */ } tcb[NTCB]; /*NTCB系统允许的最多任务数*/ Swtch()的设计如下 void interrupt swtch(void) { disable(); /*关中断*/ /* 保存现行堆栈的段址和栈顶指针供下次切换时用 */ ss1=_SS; /* ss1保存线程1的堆栈段址 */ sp1=_SP; /* sp1保存线程1的堆栈栈顶指针 */ /* 切换堆栈 */ _SS=ss2; /* ss2是线程2的堆栈段址 */ _SP=sp2; /* ss2是线程2的堆栈的栈顶指针 */ enable(); /*开中断*/ } /* 如果返回值是1,表示dos忙;*/ /* 如果返回值是0,表示dos不忙;*/ /* 如果返回值是-1,表示还没有调用InitDos() */ int DosBusy(void) { if (indos_ptr crit_err_ptr) return(*indos_ptr || *crit_err_ptr); else return(-1); /* InitDos() hasnt been called */ } 创建线程 int create(char *name, codeptr func, int stack_len) { int i; unsigned char *fp; struct int_regs *regs; for (i = 0; i NTCB; i++) { if (tcb[i].state =

您可能关注的文档

文档评论(0)

gz2018gz + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档