您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Linux操作系统分析
Linux操作系统分析中国科学技术大学计算机系陈香兰(0512-87161312)xlanchen@ustc.edu.cnAutumn20092020/4/2811/23/09Linux操作系统分析2/92主要内容进程描述符进程切换进程的创建和删除进程调度2020/4/2811/23/09Linux操作系统分析3/92进程的分类不同类型的进程有不同的调度需求第一种分类:I/O-bound频繁的进行I/O通常会花费很多时间等待I/O操作的完成CPU-bound计算密集型需要大量的CPU时间进行运算2020/4/2811/23/09Linux操作系统分析4/92第二种分类交互式进程(interactiveprocess)需要经常与用户交互,因此要花很多时间等待用户输入操作响应时间要快,平均延迟要低于50~150ms典型的交互式程序:shell、文本编辑程序、图形应用程序等2020/4/2811/23/09Linux操作系统分析5/92批处理进程(batchprocess)不必与用户交互,通常在后台运行不必很快响应典型的批处理程序:编译程序、科学计算实时进程(real-timeprocess)有实时需求,不应被低优先级的进程阻塞响应时间要短、要稳定典型的实时进程:视频/音频、机械控制等2020/4/2811/23/09Linux操作系统分析6/92Linux中的进程调度Linux既支持普通的分时进程,也支持实时进程Linux中的调度是多种调度策略和调度算法的混合。什么是调度策略?是一组规则,它们决定什么时候以怎样的方式选择一个新进程运行Linux的调度基于分时和优先级随着版本的变化,分时技术在不断变化2020/4/2811/23/09Linux操作系统分析7/92Linux的进程根据优先级排队根据特定的算法计算出进程的优先级,用一个值表示这个值表示把进程如何适当的分配给CPULinux中进程的优先级是动态的调度程序会根据进程的行为周期性的调整进程的优先级较长时间未分配到CPU的进程,通常↑已经在CPU上运行了较长时间的进程,通常↓2020/4/2811/23/09Linux操作系统分析8/92与调度相关的系统调用nicegetpriority/setprioritysched_getscheduler/sched_setschedulersched_getparam/sched_setparamsched_yieldsched_get_priority_min/sched_get_priority_maxsched_rr_get_interval2020/4/2811/23/09Linux操作系统分析9/92例如2020/4/2811/23/09Linux操作系统分析10/92又如2020/4/2811/23/09Linux操作系统分析11/922020/4/2811/23/09Linux操作系统分析12/922020/4/2811/23/09Linux操作系统分析13/92调度算法Linux2.4的调度算法需要遍历可运行队列,算法O(n)Epoch,基本时间片,动态优先级Linux2.6.17的调度算法(2.6.23之前)采用双队列(Active;expire),按照优先级组队,O(1)Linux2.6.26的调度算法非实时:CFS,vruntime,红黑树实时:优先级队列Linux进程可以指定该进程所采用的调度策略调度算法根据进程的调度策略,采用不同的调度算法2020/4/2811/23/09Linux操作系统分析14/92关于CFS的vruntime理想的调度,所有的任务都是公平的。等速度的运行每个任务。cfs就是通过追踪这个vruntime来进行任务调度的。它总是选vruntime最小的进程来运行。2020/4/2811/23/09Linux操作系统分析15/92Linux2.6.26中的调度策略:Policy,调度类型include/linux/sched.h在task_struct中,使用数据项policy来表达该进程采用的调度策略2020/4/2811/23/09Linux操作系统分析16/92查看linux-2.6.26中各个policy的使用情况2020/4/2811/23/09Linux操作系统分析17/92kernel/sched.c2020/4/2811/23/09Linux操作系统分析18/92调度类型阅读conststructsched_class,调度类rt_sched_classfair_sched_classidle_sched_classrt_sched_classfair_sched_classidle_sched_classkernel/sched_idletask.ckernel/sched_fair.ckernel/sched_rt.c2020/4/2811/23/09Linux操作系统分析19/92阅读2.6.26的schedule函数调度函数的关键:调度算法的关键入列CFS根据vruntime的值入列,其关键在于vruntime值的计算RT根据优先级入列kernel/sched.c,参见函数schedule()kernel/sched_fair.c,update_curr2020/4/2811/23/09Linux操作系统分析20/92Linux-2.6.26中每个CPU的就绪队列2020/4/2811/23/09Linux操作系统分析21/92Linux-2.6.26中进程的调度实体include/linux/sched.h:task_struct2020/4/2811/23/09Linux操作系统分析22/92include/linux/sched.h2020/4/2811/23/09Linux操作系统分析23/922020/4/2811/23/09Linux操作系统分析24/92关于CFS的vruntime理想的调度,所有的任务都是公平的。等速度的运行每个任务。cfs就是通过追踪这个vruntime来进行任务调度的。它总是选vruntime最小的进程来运行。几个关键的vruntime更新之处1.set_task_cpu:进程从原CPU上转移到新CPU上,需根据两个cpu上就绪队列min_vruntime的值的差距进行调整,使得进程的vruntime值能与新的调度队列中的进程具有一定的可比性kernel/sched.c2020/4/2811/23/09Linux操作系统分析25/922.在__update_curr中,3.在yield_task_fair中,4.等等kernel/sched_fair.c2020/4/2811/23/09Linux操作系统分析26/92了解linux-2.6.26中进程的滴答更新调度类中的方法task_tick用来在任务运行时进行滴答更新。每个调度类都有自己的滴答更新方法:task_tick_rt、task_tick_fair和task_tick_idle(为空)。scheduler_tick当前任务所属调度类的task_tick方法update_process_times2020/4/2811/23/09Linux操作系统分析27/92考虑task_tick_fair2020/4/2811/23/09Linux操作系统分析28/92关键内部函数update_curr,参见源代码2020/4/2811/23/09Linux操作系统分析29/92include/linux/sched.h2020/4/2811/23/09Linux操作系统分析30/92考虑task_tick_rt2020/4/2811/23/09Linux操作系统分析31/92Linux2.6.26中的优先级优先数范围为0~139,其中0~99为实时优先数普通任务和批处理任务的优先数在100~139之间优先数越大,优先级越低。2020/4/2811/23/09Linux操作系统分析32/92Linux2.6.26中的nice值Nice值用来调整进程的优先级Nice值的范围在-20~19之间。2020/4/2811/23/09Linux操作系统分析33/92Linux-2.4.18中的调度算法2020/4/2811/23/09Linux操作系统分析34/92Linux-2.4.18的调度策略Linux进程可以指定该进程所采用的调度策略调度算法根据进程的调度策略,采用不同的调度算法先入先出的实时进程循环轮转的实时进程普通的分时进程当一个进程自动放弃运行时设置2020/4/2811/23/09Linux操作系统分析35/92Linux-2.4.18的调度主要基于分时技术允许多个进程“并发”运行CPU的时间被划分成“片”,给每个可运行进程分配一片在单处理器上,任何时刻只能运行一个进程,当一个并发执行的进程时间片用完时(到期)还没有终止,就可以进行进程调度分时依赖于时钟中断,对进程透明2020/4/2811/23/09Linux操作系统分析36/92采用常规分时时,时间片的选择时间片的长短对系统性能非常关键,它既不能太长也不能太短太短:频繁的切换会造成系统开销过大假如切换时间为1ms,时间片设置为1ms,那就没空执行进程了2020/4/2811/23/09Linux操作系统分析37/92太长几乎每个进程都一次运行完并发的概念基本消失普通进程需要等待很长时间才能运行时间片大小的选择总是一种折衷。Linux采取单凭经验的方法,即选择尽可能长的时间片,同时能保持良好的响应时间2020/4/2811/23/09Linux操作系统分析38/92Linux-2.4.18进程的调度优先级Linux在其调度程序中,根据特定的算法计算出进程的调度优先级,用一个值goodness表示,进程根据这个值竞争CPU2020/4/2811/23/09Linux操作系统分析39/92Linux-2.4.18的调度算法(1)epochlinux调度算法把CPU时间划分为时期(epoch)在一个单独的时期内,每个进程有一个指定的时间片一个进程用完它的时间片时,就会被强占只要进程的时间片没有用完,就可以被多次调度运行当所有的进程用完它的时间片的时候,一个时期才结束,此时要重新计算所有进程的时间片,并重新开始一个新的时期2020/4/2811/23/09Linux操作系统分析40/92Linux-2.4.18的调度算法(2)基本时间片(basetimequantum)每个进程有一个基本时间片,通过nice计算时间片/epoch到期时,新时间片的计算公式:可以通过nice、setpriority系统调用调整进程的基本时间片nice缺省为0(在-20到19之间选择)通常,基本时间片的值为6,由于时钟中断大约10ms左右,因此基本时间片的长度大约60ms2020/4/2811/23/09Linux操作系统分析41/92Linux-2.4.18的调度算法(3)当前剩余时间片每个进程使用counter表示当前时期内的剩余时间片每当一个tick过去,就会从当前进程的counter上-1在某个时期内创建的一个新进程,在该时期内的剩余时间片将从父进程那里继承一半2020/4/2811/23/09Linux操作系统分析42/92举例:进程0(INIT_TASK)的时间片:HZ代表了1秒内的tick数因此一个tick就是1/100秒即10ms可以计算出DEF_COUNTER=10个tick即100ms(实际上约105ms)MAX_COUNTER=20个tick即200ms2020/4/2811/23/09Linux操作系统分析43/92Linux-2.4.18中调度程序使用的数据结构进程描述符中:need_resched:是否需要
本文标题:Linux操作系统分析
链接地址:https://www.777doc.com/doc-5098961 .html