幻灯片.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
幻灯片

实 验 时间片轮转调度 实 验 目 的 调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。 为EOS添加时间片轮转调度,了解其它常用的调度算法。 EOS的线程调度 属于低级调度。 线程调度的对象:只包括处于“就绪”状态的线程,不包括处于“阻塞”或者“挂起”状态的线程。 目前EOS实现了基于优先级的抢先式调度。当有比正在执行的线程优先级高的线程进入“就绪”状态时,这种调度方式允许调度程序停止正在执行的低优先级的线程,而将处理器分配给高优先级的线程,使之执行。 TCB中记录了线程的优先级 typedef struct _THREAD { …… UCHAR Priority; // 线程优先级 …… } THREAD; 就绪位图和就绪队列 就绪位图 volatile ULONG PspReadyBitmap = 0; 就绪队列 LIST_ENTRY PspReadyListHeads[32]; 数组中保存了32个链表头用于指向32个双向链表,每个链表都代表一个对应优先级的就绪队列,其中下标为n的链表对应优先级为n的就绪队列。 32位的就绪位图,如果位图的第n位为1,则表明优先级为n的就绪队列非空。通过从高优先级向低优先级(从左向右)扫描这个就绪位图,即可得到优先级最高的非空就绪队列的索引。 线程调度执行的时机—硬中断 线程调度执行的时机—48号软中断 线程主动触发48号软中断 VOID PspThreadSchedule( VOID ) { ULONG HighestPriority; if (KeGetIntNesting() == 0) { if (Running != PspCurrentThread-State) { KeThreadSchedule(); } else if (0 != PspReadyBitmap) { BitScanReverse(HighestPriority, PspReadyBitmap); if (HighestPriority PspCurrentThread-Priority) KeThreadSchedule(); } } } #define KeThreadSchedule( ) __asm(int $48) 调度程序PspSelectNextThread函数 基于优先级的抢先式调度存在的问题 同一个优先级就绪队列中的多个线程,一旦队首线程获得处理器后,队列中的其它线程只有等队首线程被阻塞或者结束后,才能够依次执行。如果已经获得处理器的队首线程是在计算一个小数点后二十位的圆周率,则它有可能会一直占用处理器长达数小时,在这期间,队列中的其它线程有可能是由于刚刚接收到用户的键盘输入而进入就绪状态的,那么用户就必须等待数小时后才能获得这个键盘输入的处理结果,这在一个典型的分时系统中是绝对无法接受的,完全无法保证人机交互的及时性。 时间片轮转调度(Round Robin) 为就绪队列中的每个线程分配一个时间片(Time Slice),当线程调度执行时,把CPU分配给队首线程,待线程的时间片用完后,会重新为它分配一个时间片,并将它移动到就绪队列的末尾,从而让新的队首线程开始执行。 时间片的大小一般从几十毫秒到几百毫秒,这样就可以保证就绪队列中的所有线程,在一给定的时间(人所能接受的等待时间)内,均能获得一个时间片的CPU执行时间,从而保证人机交互的及时性。 定时计数器中断(32号中断)触发时间片轮转调度 PC机上的Intel 8253芯片是一个定时计数器。EOS操作系统在每次启动时,都会将8253初始化为每秒钟向CPU发送100次定时计数器中断,即每隔10ms一次。有些操作系统将一次定时计数器中断称作一个时钟滴答(Tick)。 EOS处理定时计数器中断的过程 KiIsrTimer函数调用PspRoundRobin 函数 VOID KiIsrTimer( VOID ) { // // 依次处理已经注册的各个计时器。 // …… // // 时间片轮转调度。 // IntState = KeEnableInterrupts(FALSE); PspRoundRobin(); KeEnableInterrupts(IntState); } EOS已经做的准备工作 typedef struct _THREAD { …… ULONG RemainderTicks; // 剩余时间片 …… } THREAD; #define TICKS_OF_TIME_SLIC

文档评论(0)

118books + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档