µ÷¶È×Óϵͳ1_µ÷¶È×Óϵͳ³õʼ»¯(¶þ)

2014-11-24 02:49:03 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 9
ned long nr_load_updates; //ÓÃÀ´ÀÛ¼Ó´¦ÀíÆ÷½øÐÐcontext switchµÄ´ÎÊý£¬»áÔÚº¯Êýscheduleºô½Ðʱ½øÐÐÀÛ¼Ó£¬²¢¿ÉÒÔͨ¹ýº¯Êý //nr_context_switchesͳ¼ÆÄ¿Ç°ËùÓд¦ÀíÆ÷×ܹ²µÄcontext switch´ÎÊý£¬»òÊÇ¿ÉÒԲ鿴/proc/statÖеÄctxt //»ñȡĿǰÕû¸öϵͳ´¥·¢context switchµÄ´ÎÊý¡£ u64 nr_switches; //¹«Æ½µ÷¶È¶ÓÁÐ struct cfs_rq cfs; //ʵʱµ÷¶È¶ÓÁÐ struct rt_rq rt; //Ö§³Ögroup cfs tasksµÄ»úÖÆ #ifdef CONFIG_FAIR_GROUP_SCHED //ÔÚÖ§³Öfair group scheduling µÄ»·¾³Ï£¬ //¿ÉÒÔ½«cfs rqÖÐÈô¸Étask×éÖ¯³ÉÈô¸Étask group£¬¼´×Ócfs_rq£¬ÊôÓÚÕâgroupµÄtaskËùʹÓõ½µÄ´¦ÀíÆ÷ʱ¼ä¾Í»á //ÒÔ¸ögroup×ܹ²Ëù·ÖµÄµÄʱ¼äΪÉÏÏÞ¡£ //»ùÓÚcgroupµÄfair group scheduling ¼Ü¹¹£¬¿ÉÒÔ´´Ôì³öÓнײãÐÔµÄtask×éÖ¯£¬¸ù¾Ý²»Í¬taskµÄ¹¦ÄÜȺ×黯¡£ //ÔÚÅäÖøø¸ÃȺ×é¶ÔÓ¦µÄ´¦ÀíÆ÷×ÊÔ´£¬ÈÃÊôÓÚ¸ÃȺ×éϵÄtask¿ÉÒÔͨ¹ýrq»úÖÆÊ¹ÓÃÊôÓÚ¸ÃȺ×éϵÄ×ÊÔ´¡£ //¿ÉÒÔͨ¹ýº¯Êýlist_add_leaf_cfs_rq°ÑÒ»¸ögroup cfs rq¼ÓÈëµ½listÖУ¬»òͨ¹ýº¯Êýlist_del_leaf_cfs_rq //°ÑÒ»¸ögroup cfs rqÒÆ³ý,²¢¿ÉÒÔ͸¹ýfor_each_leaf_cfs_rq°Ñ±éÀúrqÉϵÃËùÓÐleaf cfs_rq struct list_head leaf_cfs_rq_list; #endif #ifdef CONFIG_RT_GROUP_SCHED //ÀàËÆleaf_cfs_rq_list£¬Ö»ÊÇÕâÀïÊÇÕë¶ÔÊôÓÚreal-timeµÄtask,¶ÔÓ¦µÄ²Ù×÷º¯ÊýÓÐlist_add_leaf_rt_rq, //list_del_leaf_rt_rq, for_each_leaf_rt_rq. struct list_head leaf_rt_rq_list; #endif //ͳ¼ÆÄ¿Ç°rqÖÐÓжàÉÙtaskÊôÓÚTASK_UNINTERRUPTIBLEµÄ״̬. unsigned long nr_uninterruptible; //Ö¸ÏòĿǰ´¦ÀíÆ÷ÕýÔÚÖ´ÐеÄtask; ûÓпÉÔËÐÐtaskʱ£¬ÔËÐÐidle task. struct task_struct *curr, *idle; //»ùÓÚ´¦ÀíÆ÷µÄjiffiesÖµ£¬ÓÃÒԼǼϴνøÐд¦ÀíÆ÷balancingµÄʱ¼äµã. unsigned long next_balance; //ÓÃÒÔ´æ´¢context-switch·¢Éúʱ£¬Ç°Ò»¸ötaskµÄmemory management½á¹¹. struct mm_struct *prev_mm; //ÓÃÒԼǼĿǰrqµÄclockÖµ£¬»ù±¾ÉϸÃÖµ»áµÈÓÚµ÷ÓÃsched_clock_cpu(cpu_of(rq))µÄ·µ»ØÖµ£¬²¢»áÔÚ //ÿ´Îµ÷ÓÃscheduler_tickʱͨ¹ýº¯Êýupdate_rq_clock¸üÐÂĿǰrq clockÖµ. u64 clock; //ÓÃÒԼǼĿǰrqÖÐÓжàÉÙtask´¦Óڵȴýi/oµÄsleep״̬ÔÚʵ¼ÊµÄʹÓÃÉÏ£¬ÀýÈçµ±driver½ÓÊÜÀ´×ÔtaskµÄµ÷Ó㬵«´¦Óڵȴýi/o //½×¶Îʱ£¬ÎªÁ˳ä·ÖÀûÓô¦ÀíÆ÷µÄÖ´ÐÐ×ÊÔ´£¬Õâʱ¾Í¿ÉÒÔÔÚdriverÖе÷Óú¯Êýio_schedule£¬´Ëʱ¾Í»á°ÑĿǰrqÖеÄnr_iowait¼ÓÒ»£¬ //²¢É趨ĿǰtaskµÄio_waitΪ1, È»ºó´¥·¢scheduling ÈÃÆäËûtaskÓлú»á¿ÉÒԵõ½´¦ÀíÆ÷Ö´Ð
Ðʱ¼ä¡£ atomic_t nr_iowait; #ifdef CONFIG_SMP //root domainÊÇ»ùÓÚ¶àºËÐļܹ¹ÏµĻúÖÆ£¬ //ÆäÖаüÀ¨ÁË: // cpu mask(°üÀ¨span,online,rt overload), // reference count // cpupri //1.µ±root domain±»rqÒýÓÃʱ£¬refcount¼ÓÒ»£¬·´Ö®¾Í¼õÒ»¡£ //2.cpu mask span±íʾrq¿ÉÔËÐеÄcpu mask¡¢ nolineΪÒѾ­±»rq°²ÅÅÁ˽ø³ÌµÄcpu //3.µ±rqÖÐreal-timeµÄtaskÖ´ÐÐÍê±Ïʱ£¬»áµ÷Óú¯Êýpull_rt_task´Ó¸Ãrq rto_maskÖбêʶµÄcpuÉÏ£¬ // ²éÕÒÊÇ·ñÓд¦ÀíÆ÷ÓдóÓÚÒ»¸öÒÔÉϵÄreal-time task£¬ÈôÓоͻáÇ¨ÒÆµ½±¾cpuÖ´ÐС£ //4.cpupri²»Í¬ÓÚtaskµÄÓÅÏȼ¶£¬cpupri±¾ÉíÓÐ102¸öÓÅÏȼ¶£º // -1 invalid, // 0 idle // 1 normal // 2-101¶ÔÓ¦real-time priority 0-99 //²Î¿¼convert_prio, task priorityÈç¹ûÊÇ140¾Í»á¶ÔÓ¦µ½cpu idle£¬Èç¹ûÊÇ´óÓÚµÈÓÚ100¾Í»á¶ÔÓ¦µ½cpu normal, // ÈôÊÇtask priority½éÓÚ0-99Ö®¼ä,¾Í»á¶ÔÓ¦µ½cpu real-time priority 101-2 Ö®¼ä¡£ //ÔÚʵ¼ÊµÄ²Ù×÷ÉÏ, ¿ÉÒÔµ÷ÓÃcpupri_find´«ÈëÒ»¸öreal-time task½á¹¹£¬´Ëʱ¾Í»áÒÀ¾ÝcpupriÖÐpri_to_cpuÑ¡Ôñ // Ò»¸öĿǰִÐÐreal-time taskÇÒ¸ÃtaskµÄÓÅÏȼ¶±ÈĿǰҪ²åÈëµÄtask¸üµÍµÄ´¦ÀíÆ÷, ²¢Í¨¹ýcpu mask(lowest_mask) // ·µ»ØÄ¿Ç°¿ÉÒÔÑ¡ÔñµÄ´¦ÀíÆ÷mask¡£ //²Î¿¼ kernel/sched_cpupri.c. //ÔÚ³õʼ»¯µÄ¹ý³ÌÖÐ,ͨ¹ýsched_initµ÷ÓÃinit_defrootdomain¶Ôroot domainÓëcpu priority»úÖÆ½øÐгõʼ»¯¡£ struct root_domain *rd; //schedule domainÊÇ»ùÓÚ¶àºËÐļܹ¹ÏµĻúÖÆ¡£ //ÿ¸ö´¦ÀíÆ÷¶¼»áÓÐÒ»¸öĬÈϵÄscheduling domain£¬scheduling domain¿ÉÒÔÓнײãÐԵļܹ¹,ͨ¹ýparent //¿ÉÒÔÕÒµ½ÉÏÒ»²ãµÄdomain,»òÊÇͨ¹ýchildÕÒµ½ÏÂÒ»²ãµÄdomain(NULL±íʾ½áβ)£¬Í¨¹ýspanÑÚÂ룬±íʾÕâ¸ödomainËùÄÜ //º­¸ÇµÄ´¦ÀíÆ÷·¶Î§¡£ //ͨ³£base domain»áº­¸ÇϵͳÖÐËùÓд¦ÀíÆ÷, ¶øchild domainËùÄܺ­¸ÇµÄ´¦ÀíÆ÷²»Äܳ¬¹ýËüµÄparent domain¡£ //ͬʱ£¬Ã¿¸öschedule domain¶¼»á°üÀ¨Ò»¸ö»òÒ»¸öÒÔÉϵÄcpu groups(½á¹¹Îªstruct sched_group),²¢Í¨¹ýnextÖ¸Õë°Ñ //cpu groups´®ÁªÔÚÒ»Æð(³ÉΪһ¸öµ¥ÏòµÄcircular linked list)¡£ //ÿ¸öcpu group¶¼Í¨¹ýcpumaskÀ´¶¨ÒåÆäËùº­¸ÇµÄ´¦ÀíÆ÷£¬²¢ÇÒcpu groupËù°üÀ¨µÄ´¦ÀíÆ÷·¶Î§±ØÐ躭¸ÇÔÚËùÊôµÄschedule domain //´¦ÀíÆ÷·¶Î§ÖС£ //µ±scheduling domainµÄbalancingʱ,»áÒÔÆäϵÄcpu groupsΪµ¥Î»,ͨ¹ýcpu_power(¸ÃgroupËùº­¸ÇµÄ´¦ÀíÆ÷µÄtasks loading //×ܺÍ)À´±È½Ï²»Í¬µÄcpu groupsµÄ¸ººÉÀ´½øÐÐtasks