µ÷¶È×Óϵͳ1_µ÷¶È×Óϵͳ³õʼ»¯(¶þ)
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