- 論壇徽章:
- 0
|
在cfs調(diào)度中,對(duì)調(diào)度實(shí)體vruntime的更新放在下面這個(gè)函數(shù)里:
__update_curr(cfs_rq,curr,delta_exec)
關(guān)于這個(gè)函數(shù)的計(jì)算細(xì)節(jié),我在之前一篇小文里介紹過。
有許多模糊的地方,請(qǐng)大家一起討論。
第一個(gè)問題,就是關(guān)于delta_exec這個(gè)參數(shù):
/*
* Get the amount of time the current task was running
* since the last time we changed load (this cannot
* overflow on 32 bits):
*/ 這段注釋,怎么理解比較好呢?
delta_exec = (unsigned long)(now - curr->exec_start);
其中now,代表運(yùn)行隊(duì)列當(dāng)前的時(shí)間,curr->exec_start有兩個(gè)設(shè)置的地方:
1)在更新cfs_rq->curr的函數(shù)set_next_entity()里,會(huì)調(diào)用update_stats_curr_start()
將exec_start設(shè)置為當(dāng)前運(yùn)行隊(duì)列的時(shí)間:
se->exec_start = rq_of(cfs_rq)->clock;
照comment的解釋,將開始一個(gè)新的運(yùn)行周期
2)即在上面__update_curr()完成后,exec_start被設(shè)置為rq的時(shí)間
那這個(gè)delta_exec是代表進(jìn)程兩次被調(diào)度到的時(shí)間間隔么?
還是兩次更新update_curr()之間的間隔?
第二個(gè)問題,關(guān)于我的猜測(cè)
從兩個(gè)設(shè)置exec_start()的點(diǎn)來看,design基于兩種考慮:
1) 任務(wù)a被調(diào)度,cfs_rq->curr=a, 此時(shí)exec_start設(shè)置。調(diào)用update_curr()時(shí),計(jì)算a從被調(diào)度到現(xiàn)在的時(shí)間,
作為a的運(yùn)行時(shí)間。這是比較好理解的。
2) update_curr()調(diào)用的位置比較多,沒有仔細(xì)研究連續(xù)兩個(gè)update_curr()調(diào)用之間的關(guān)系。有可能兩次update_curr()
調(diào)用之間curr并沒有變,這時(shí)候需要更新任務(wù)的vruntime,只能計(jì)算從上次update到現(xiàn)在的時(shí)間了。
恰好找到了這么種情況,一搜今天有哥們還提了個(gè)patch,真是太巧了(http://www.gossamer-threads.com/ ... l/1058728?page=last)
呵呵 ,歡迎大家討論 |
|