杭电操作系统实验-基于dos的多任务系统的实现

杭电操作系统实验-基于dos的多任务系统的实现

ID:6791314

大小:190.50 KB

页数:24页

时间:2018-01-25

杭电操作系统实验-基于dos的多任务系统的实现_第1页
杭电操作系统实验-基于dos的多任务系统的实现_第2页
杭电操作系统实验-基于dos的多任务系统的实现_第3页
杭电操作系统实验-基于dos的多任务系统的实现_第4页
杭电操作系统实验-基于dos的多任务系统的实现_第5页
资源描述:

《杭电操作系统实验-基于dos的多任务系统的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、操作系统课程设计报告小组编号:小组成员:一、课程设计概述1、题目:基于DOS的多任务系统的实现2、实现内容(1)用C语言完成线程的创建和撤消,并按先来先服务方式对多个线程进行调度。(2)将线程调度算法修改为时间片轮转算法,实现时间片轮转调度。(也可以结合优先权,实现优先权加时间片轮转算法的线程调度。)(3)改变时间片的大小,观察结果的变化。思考:为什么时间片不能太小或太大。(4)假设两个线程共用同一软件资源(如某一变量,或某一数据结构),请用记录型信号量来实现对它的互斥访问。(5)假设有两个线程共享一个可存放5个整数的缓冲,其中一个线程不停地计算1至50的平方,并将结果放入缓冲中

2、,另一个线程不断地从缓冲中取出结果,并将它们打印出来,请用记录型信号量实现这一生产者和消费者的同步问题。(6)实现消息缓冲通信,并与4、5中的简单通信进行比较。二、设计思路(主要算法描述、程序流程图等):1、程序的设计思想:该程序主要是分5大块内容:线程的创建和撤销,线程的调度,线程的同步与互斥,线程的阻塞与唤醒,利用消息缓冲队列的线程间的通信。由这五大块功能来完成的基于DOS的多任务系统的实现。在这个系统中,首先先由main函数进行一些初始化工作,然后直接创建0#线程对应于main函数,再由0#线程调用create创建1#,2#线程分别对应与函数f1(),f2(),最后将系统的

3、中断服务程序设置为new_int8,并把控制交给1#线程,启动多个线程的并发执行。0#线程是一个比较特殊的线程,它在创建的时候没有使用create来创建,而是在系统初始化后直接创建的,因它对应的程序段为main函数中的一段,所以也直接使用整个系统的堆栈,而不再创建时为私有堆栈分配额外的空间;同样,撤销的时也不需要释放私有堆栈的空间,所以也没有over()函数而是直接撤销,从这方面来看,它是一个系统线程。此外,在启动多个线程并发执行过程后,0#线程将系统控制权转交出去,直至系统中其他进程都不具备执行条件时,它才有可能重新得到CPU,从这方面看,0#线程相当于是一个空转线程,最后,0

4、#线程还担负着一个特别的使命:等待系统中所有其他的线程的完成,此时,它将直接撤销自己并恢复原来的时钟中断服务程序,从此终止整个多任务系统。2、主要算法描述用C语言来描述,一个最简单的TCB的数据结构可以表示如下:/*状态码常量定义*//*null0notassigned*/#defineFINISHED0/*表示线程处于终止态或TCB是空白状态*/#defineRUNNING1/*表示线程处于运行态*/#defineREADY2/*表示线程处于就绪态*/#defineBLOCKED3/*表示线程处于阻塞态*/structTCB{unsignedchar*stack;/*线程堆栈的

5、起始地址*/unsignedss;/*堆栈段址*/unsignedsp;/*堆栈指针*/charstate;/*线程状态,取值可以是FINISHED、RUNNING、READY、BLOCKED*/charname[10];/*线程的外部标识符*/}tcb[NTCB];/*NTCB系统允许的最多任务数*/Swtch()的设计如下voidinterruptswtch(void){disable();/*关中断*//*保存现行堆栈的段址和栈顶指针供下次切换时用*/ss1=_SS;/*ss1保存线程1的堆栈段址*/sp1=_SP;/*sp1保存线程1的堆栈栈顶指针*//*切换堆栈*/_S

6、S=ss2;/*ss2是线程2的堆栈段址*/_SP=sp2;/*ss2是线程2的堆栈的栈顶指针*/enable();/*开中断*/}/*如果返回值是1,表示dos忙;*//*如果返回值是0,表示dos不忙;*//*如果返回值是-1,表示还没有调用InitDos()*/intDosBusy(void){if(indos_ptr&&crit_err_ptr)return(*indos_ptr

7、

8、*crit_err_ptr);elsereturn(-1);/*InitDos()hasn'tbeencalled*/}创建线程intcreate(char*name,codeptrfunc,

9、intstack_len){inti;unsignedchar*fp;structint_regs*regs;for(i=0;i

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。