- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
基于DOS的多任务系统的实现;主要任务
线程的创立和撤消
FCFS调度
时间片轮转调度
同步机制的实现
消息缓冲队列通信机制的实现;intcurrent;
main()
{
/*创建0#线程*/
strcpy(tcb[0].name,main);
tcb[0].state=RUNNING;
current=0;
;编程环境
16位的DOS模式:内存地址20位
TurboC2.0
;DOS的内存管理;二维的逻辑地址:
seg:off逻辑地址
seg×24+off物理地址
;‘A’;线程的概念
线程是进程内一个相对独立的运行单位,一个进程可以有一个或多个线程〔至少有一个〕,这些线程共享这个进程的代码、数据及大局部管理信息,但每个线程有自己的程序计数器、堆栈和线程控制块。
拥有资源的根本单位——进程;
执行的根本单位〔即CPU调度和分派的单位)——线程。;intcurrent;
main()
{
/*创建0#线程*/
strcpy(tcb[0].name,main);
tcb[0].state=RUNNING;
current=0;
;;堆栈的概念
堆栈其实是一段内存空间;
堆栈中最后压入数据的那个单元叫栈顶,该单元的地址就是栈顶指针;
CPU执行很多指令时都会用到堆栈,比方:
push指令;
pop指令;
函数调用指令call;
函数返回指令ret和中断返回指令iret;
int指令等等。
函数调用的参数及返回地址,程序的局部变量等信息通常都被保存在进程的堆栈中。;堆栈的概念
传统的进程由PCB、代码段、数据段和堆栈段四局部组成,但很多系统中把堆栈包含在数据段中。
引入线程后,每个线程都必须有自己的私有堆栈。
CPU切换时,要进行堆栈的切换,从而使新进程〔或新线程〕可以把信息保存在自己的堆栈中,而不是老进程〔或线程〕的堆栈中。
CPU正在使用的堆栈被称作现行堆栈,它的栈顶指针存放在CPU的栈顶指针存放器中〔如SS:ESP〕。;bx;线程控制块
#defineNTCB5
structTCB{
unsignedchar*stack;/*线程堆栈的起始地址*/
unsignedss;/*堆栈段址*/
unsignedsp;/*堆栈指针*/
charstate;/*线程状态:执行、就绪、阻塞*/
charname[10];/*线程的外部标识符*/
}tcb[NTCB];/*NTCB是系统允许的最多任务数*/;线程控制块
#defineFINISHED0/*表示线程处于终止态
或TCB是空闲状态*/
#defineRUNNING1/*表示线程处于运行态*/
#defineREADY2/*表示线程处于就绪态*/
#defineBLOCKED3/*表示线程处于阻塞态*/;CPU切换
CPU的指令计数器〔X86中的CS,IP存放器〕中保存有下一条要执行的机器指令的地址;
每次CPU取指令后,指令计数器的值被加上所取指令的字节数,调整为下一条指令的地址;
修改指令计数器的方法:
跳转指令〔如JMP,JNE等〕
函数调用指令
中断。;CPU切换
跳转指令JMP的格式:
JMP操作数
;CPU切换
函数调用指令CALL的格式:
CALL操作数
;CPU切换
中断
-当CPU在执行指令1的期间收到8号中断信号,并在该指令执行完后响应中断时,硬件将完成以下动作:
将flags存放器压栈;
将CS,IP存放器压栈;
从中断向量表的第8个向量中获得8#中断处理程序的入口地址,将它们装入CS,IP中。
-Iret指令将从栈顶依次弹出ip,cs,flags。;CS,IP:指令计数器,用于存放要执行的下一条指令的地址
SS,SP:栈顶指针存放器;
DS:数据段段址存放器;
Flags:标
文档评论(0)