Minix 进程调度代码详解.docxVIP

  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文档。上传文档
查看更多
Minix 进程调度代码详解

1.Minix3中为每个进程分配的时间片,当进程的时间片用完后,将进行进程调度。进程的时间片以时钟滴答为单位进行分配。每次时钟中断,中断处理程序将减少当前进程的时间片。当时间片减小到0时,进行进程调度,选择一个合适的进程来拥有CPU。Minix3以每秒钟60次的频率进行时钟中断,即时钟中断处理程序每秒执行60次。每次执行,减少当前进程的时间片: /* Get number of ticks and update realtime. */ ticks = lost_ticks + 1;/* lost_ticks为BIOS中断所花费的时间 */ lost_ticks = 0;/* lost_ticks清0 */ realtime += ticks;/* 更新时间 */ proc_ptr-p_user_time += ticks;/* 更新当前进程的user_time */ if (priv(proc_ptr)-s_flags PREEMPTIBLE) { /* 如果进程可被抢占,则减少时间片 */ proc_ptr-p_ticks_left -= ticks; } if (! (priv(proc_ptr)-s_flags BILLABLE)) { /* 如果当前进程能付费,则修改sys_time及减少时间片 */ bill_ptr-p_sys_time += ticks; bill_ptr-p_ticks_left -= ticks; } 如果时间片用完,则向clock_task发送通知。因为该进程的时间片用完,需要重新调度,所以该进程就成为了上一个执行的进程。 if((next_timeout = realtime)||(proc_ptr-p_ticks_left= 0)) { /* 如果定时器到期或者进程时间片用完,则进行调度 */ prev_ptr = proc_ptr;/* 当前进程成为上一次执行的进程 */ lock_notify(HARDWARE, CLOCK);/* send notification */ /* 时间到期时发送通知给clock_task,由该函数进行后续处理 */ } 2.clock_task为时钟任务的主程序,用一个无限循环等待并处理时钟中断处理程序发来的通知。没有通知发来时,处于阻塞状态。 while (TRUE) { /* 获取消息 */ receive(ANY, m);/* 无消息时则阻塞 */ /* 检查消息类型,只处理时钟中断处理程序发来的消息 */ switch (m.m_type) { case HARD_INT:/* 这个消息由时钟中断处理程序(clock_handler)发出 */ result = do_clocktick(m);/* 处理该消息,检查时间片是否到期等 */ break;/* result变量没有实际意义 */ default:/* illegal request type */ kprintf(CLOCK:illegal request %d from %d.\n, m.m_type,m.m_source); } }3.当通过消息检查后,调用do_clocktick函数处理该消息。首先,检查是否是进程的时间片到期。如果时间片到期,则重置该进程的时间片,并插入到就绪队列的适当位置。将进程移出、移入就绪队列,就能完成为进程重新分配时间片和插入适当位置的任务。 if(prev_ptr-p_ticks_left=0 priv(prev_ptr)-s_flags PREEMPTIBLE) { lock_dequeue(prev_ptr);/* 将进程移出队列 */ lock_enqueue(prev_ptr);/* 在将进程移入队列 */ }lock_dequeue函数将屏蔽中断,然后调用函数dequeue将进程移出就绪队列。而函数lock_enqueue同样将屏蔽中断,然后调用函数enqueue。下面详细讨论enqueue函数。4.enqueue首先调用函数sched,计算函数的优先级和应分配的时间片。如果该进程为前一次运行过的进程,即进程连续运行过两次,则降低进程的优先级。否则该进程可能无限期的占用CPU。 if ( ! time_left) {/* 时间片是否用完 */ rp-p_ticks_left = rp-p_quantum_size; /* 分配完整的时间片? */ if (prev_ptr == rp) penalty ++;/* 是否要降低进程优先级? */ else penalty --; /* 进程都没执行过,则增加进程的优先级 */ prev_ptr = rp;/* 该进程刚运行过 */ }接下来,确定进程的优先级。Minix3中,

文档评论(0)

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

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

1亿VIP精品文档

相关文档