我想了解負載平衡器如何在Linux內核的多處理器系統上,什麼呢的struct sched_domain代表在在include/linux/sched.h中(在內核調度域)
Linux調度主要採用runques存儲它有下一次運行的任務, 現在採取的多處理器系統 在羅伯特給出load_balancer()的方式實現的解釋的情況下愛書Linux內核開發第二版是繼
首先,LOAD_BALANCE( )調用find_busiest_queue()來確定 最繁忙的runqueue。換句話說,這是其中最大數量的進程的runqueue。如果不存在具有比當前多25%或更多進程的運行隊列,則find_busiest_queue()返回 NULL和load_balance()返回。否則,返回最繁忙的隊列是 。其次,load_balance()決定它想從哪一個最繁忙的運行隊列中取出哪個優先級數組。因爲 這些任務沒有在相對較長的時間內運行,因此大多數 可能不在處理器的緩存中(即它們不是緩存熱點),所以優先使用過期陣列。 如果過期的優先數組是空的,則活動的數組是唯一的選擇 。
接下來,load_balance()查找具有任務的最高優先級(最小值)列表 ,因爲公平分配高優先級任務比低優先級任務更重要。
分析給定優先級的每個任務,找到一個任務,即 未運行,未阻止通過處理器關聯進行遷移,而不是通過 緩存熱門。如果任務符合此條件,則調用pull_task()以 將任務從最繁忙的runqueue拉到當前的runqueue。
只要runqueues保持不平衡,前兩個步驟是 重複和更多的任務從最繁忙runqueue拉動到 電流。最後,當不平衡被解決時,當前運行隊列 被解鎖並且load_balance()返回。
代碼以下
static int load_balance(int this_cpu, runqueue_t *this_rq,
struct sched_domain *sd, enum idle_type idle)
{
struct sched_group *group;
runqueue_t *busiest;
unsigned long imbalance;
int nr_moved;
spin_lock(&this_rq->lock);
group = find_busiest_group(sd, this_cpu, &imbalance, idle);
if (!group)
goto out_balanced;
busiest = find_busiest_queue(group);
if (!busiest)
goto out_balanced;
nr_moved = 0;
if (busiest->nr_running > 1) {
double_lock_balance(this_rq, busiest);
nr_moved = move_tasks(this_rq, this_cpu, busiest,
imbalance, sd, idle);
spin_unlock(&busiest->lock);
}
spin_unlock(&this_rq->lock);
if (!nr_moved) {
sd->nr_balance_failed++;
if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) {
int wake = 0;
spin_lock(&busiest->lock);
if (!busiest->active_balance) {
busiest->active_balance = 1;
busiest->push_cpu = this_cpu;
wake = 1;
}
spin_unlock(&busiest->lock);
if (wake)
wake_up_process(busiest->migration_thread);
sd->nr_balance_failed = sd->cache_nice_tries;
}
} else
sd->nr_balance_failed = 0;
sd->balance_interval = sd->min_interval;
return nr_moved;
out_balanced:
spin_unlock(&this_rq->lock);
if (sd->balance_interval < sd->max_interval)
sd->balance_interval *= 2;
return 0;
}
什麼我不明確的是在上面的代碼結構sched_domain的結構* 這個結構我查 定義SD在include/linux/sched.h中作爲如下: http://lxr.linux.no/linux+v3.7.1/include/linux/sched.h#L895 它是一個很大的結構,所以我剛剛給出了一個簡單的鏈接。 我想知道的是在上面的代碼中使用struct sched_domain是什麼?
爲什麼在調用load_balancer()時這個結構代表什麼?
這裏給出的一些東西可能是 http://www.kernel.org/doc/Documentation/scheduler/sched-domains.txt 爲什麼CPU需要調度域?這些領域代表什麼?