课程设计1解答.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? CPU 调度函数 swtch() void interrupt swtch(void) { disable(); tcb[old].ss=_SS; tcb[old].sp=_SP; new=find(); _SS=tcb[new].ss; _SP=tcb[new].sp; enable(); } main() { …… create ( 1,(codeptr)f1,1024); create ( 2,(codeptr)f2,1024); swtch(); …… } swtch() 调用过程能被中断吗? flags flags bp di si ds es dx cx bx ax cs cs ? CPU 调度函数 swtch() 当执行 swtch 函数体时: ip f1 的堆栈 bp di si ds es dx cx bx ax tcb[1].ss:tcb[1].sp ip main 的堆栈 SS:SP ? 如果不被中断,那么 CPU 的栈顶 指针将正确地指向线程 f1 的栈顶。 ? 如果在虚线的位置被中断了,那 么栈顶指针将使用 f1 栈的段地址, 但偏移仍然是 main 栈栈顶的偏移 地址,栈顶指针将指向错误的位 置。 tcb[0].ss:tcb[0].sp 错误 正确 ? CPU 调度函数 swtch() void interrupt swtch(void) { disable(); tcb[old].ss=_SS; tcb[old].sp=_SP; new=find(); _SS=tcb[new].ss; _SP=tcb[new].sp; enable(); } main() { …… create ( 1,(codeptr)f1,1024); create ( 2,(codeptr)f2,1024); swtch(); …… } disable() enable() :关中,相当于汇编指令 cli ; :开中相当于汇编指令 sti; Turbo c 提供了两个函数 swtch() 中的 disable() 和 enable() 保证黄色区域内的程序不会被中断 . 代码段 数据段 ? 线程的创建 堆栈 tcb[0] 堆栈 tcb[1] main f1 f2 … current tcb[] … 线程 0 线程 1 ? 如何创建一个线程,让它去运行 f1() ,而且当 f1() 结束时, 该线程能自动终止? 第一步 第二步 第三步 现场 信息 指令计数 器 数据段地 址 :堆栈初始化和 TCB 的初始化 栈顶指针 ? 线程的创建 typedef int (far *codeptr)(void); int create(char *name,codeptr code,int stacklen); 线程的外 部标识符 线程对应 的函数 线程的私 有栈长度 main() { …… create ( 1,(codeptr)f1,1024); create ( 2,(codeptr)f2,1024); swtch(); …… } ? 线程的创建 int create(char *name,codeptr code,int stacklen); ? 创建的过程: ‐ 为新线程分配一空闲的线程控制块; ‐ 为新线程的私有堆栈分配内存空间; ‐ 在堆栈的栈顶存入线程的初始现场信息,即初始化新 线程的私有堆栈, ‐ 初始化线程控制块,即填入线程的外部标识符,设置 好线程私有堆栈的始址、堆栈的段址和栈顶指针,将 线程的状态置成就绪态。 ‐ 最后,返回新线程的内部标识符。 ▲ malloc(stacklen): 申请 stacklen 字节的

文档评论(0)

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

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

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档