schdule的工作流程
来源:互联网 发布:c语言中char 编辑:程序博客网 时间:2024/05/22 05:36
schdule的工作流程
①将prev和next设置为schedule最感兴趣的两个进程:其中一个是在调用schedule时正在运行的进程(prev),另外一个应该是接着就給予CPU的进程(next)。注意:prev和next可能是相同的-schedule可以重新调度已经获得cpu的进程.
②中断处理程序运行"下半部分".
③内核实时系统部分的实现,循环调度程序(SCHED_RR)通过移动"耗尽的"RR进程-已经用完其时间片的进程-到队列末尾,这样具有相同优先级的其他RR进程就可以获得CPU了。同时,这补充了耗尽进程的时间片。
④由于代码的其他部分已经决定了进程必须被移进或移出TASK_RUNNING(早先的Linux版本把所有处于TASK_RUNNING状态的进程组织在一个叫做运行队列(runqueue)的链表中;)状态,所以会经常使用schedule,例如,如果进程正在等待的硬件条件已经发生,所以如果必要,这个switch会改变进程的状态。如果进程已经处于TASK_RUNNING状态,它就无需处理了。如果它是可以中断的(等待信号),并且信号已经到达了进程,就返回TASK_RUNNING状态。在所以其他情况下(例如,进程已经处于TASK_UNINTERRUPTIBLE状态了),应该从运行队列中将进程移走。
⑤将p初始化为运行队列的第一个任务;p会遍历队列中的所有任务。
⑥c记录了运行队列中所有进程最好的"goodness"-具有最好"goodness"的进程是最易获得CPU的进程。goodness的值越高越好。
⑦遍历执行任务链表,跟踪具有最好goodness的进程。
⑧这个循环中只考虑了唯一一个可以调度的进程。在SMP模式(SMP(对称多处理)模式)下,只有任务不在cpu上运行时,即can_schedule宏返回为真时,才会考虑该任务。在UP情况下,can_schedule宏返回恒为真.
⑨如果循环结束后,得到c的值为0。说明运行队列中的所有进程的goodness值都为0。goodness的值为0,意味着进程已经用完它的时间片,或者它已经明确说明要释放CPU。在这种情况下,schedule要重新计算进程的counter;新counter的值是原来值的一半加上进程的静态优先级(priortiy),除非进程已经释放CPU,否则原来counter的值为0。因此,schedule通常只是把counter初始化为静态优先级。(中断处理程序和由另一个处理器引起的分支在schedule搜寻goodness最大值时都将增加此循环中的计数器,因此由于这个原因计数器可能不会为0。显然,这很罕见。)在counter的值计算完成后,重新开始执行这个循环,找具有最大goodness的任务。
⑩如果schedule已经选择了一个不同于前面正在执行的进程来调度,那么就必须挂起原来的进程并允许新的进程运行。这时调用switch_to来进行切换。
- schdule的工作流程
- schdule
- struts的工作流程
- Struts的工作流程
- Struts的工作流程
- Struts 的工作流程
- Struts的工作流程
- Struts的工作流程
- struts的工作流程
- struts的工作流程
- WinRunner的工作流程
- struts的工作流程!
- JSP的工作流程
- struts的工作流程
- Struts的工作流程
- Struts的工作流程
- Struts2的工作流程
- Struts的工作流程
- smarty 学习
- Oracle分页优化
- cocos2dx 使用Texturepacker制作纹理相册以及使用
- MySql 数据库导入"Unknown command '\n'."错误解决办法
- python简单学习 if else
- schdule的工作流程
- 【Android】apk破解之“异常”破解
- cocos2d-x——CCLabelTTF(基本文本)
- linux下ifcfg-ethx的配置
- struts配置文件l中使用include 标签 引入另外一个在jar中的struts文件
- Qt中QString,char,int,QByteArray之间的转换
- db2远程连接服务器和本地连接数据库
- "error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
- Android Looper和Handler