為在客戶(client)群體中共享的某一資源(比如多個應用程式共享同一cpu),一套公平且高效的分配規則必不可少,而佇列結構則非常適於定義和實現這樣的一套分配規則。
具體地,可以借助佇列q實現乙個資源迴圈分配器,其總體流程大致如下所示:
輪值演算法:首先令所有參與資源分配的客戶組成乙個佇列q,接下來是乙個反覆輪迴式的排程過程:取出當前位於隊頭的客戶,將資源交予該客戶使用;在經過固定的時間之後,**資源,並令該客戶重新入隊。得益於佇列「先進先出」的特性,如此既可在所有客戶之間達成一種均衡的公平,也可使得資源得以充分利用。
roundrobin
}
這裡,每位客戶持續占用資源的時間,對該演算法的成敗至關重要。一方面,為保證響應速度,這一時間值通常都不能過大。另一方面,因佔有權的切換也需要耗費一定的時間,故若該時間值取得過小,切換過於頻繁,又會造成整體效率的下降。因此,往往需要通過實測確定最佳值。
反之,在單一客戶使用多個資源的場合,佇列也可用以保證資源的均衡使用,提高整體使用效率。針式印表機配置的色帶,既是這樣的乙個例項,環形色帶收納於兩端開口的色帶盒內。在列印過程中,從一端不斷捲出的色帶,在經過列印頭之後,又從另一端重新捲入盒中,並如此反覆。可見,此處色帶盒的功能等效於乙個佇列,色帶的各部分按照「先進先出」的原則被均衡地使用,整體使用壽命因而得以延長。
以下是乙個銀行地典型場景,天線佇列結構實現顧客服務地排程與優化。
通常,銀行都設有多個視窗,顧客按到達的次序分別在各視窗排隊等待辦理業務。為此,可首先定義顧客類customer如下,以記錄顧客所屬的佇列及其所辦業務的服務時長。
struct customer
;// 顧客類:所屬視窗(佇列)、服務時長
顧客在銀行中接受服務的整個過程,可由如下所示的simulate()函式模擬。
void
simulate
(int nwin,
int servtime)
for(
int i =
0; i < nwin; i++
)// 分別檢查if(
!windows[i]
.empty()
)// 各非空佇列if(
--windows[i]
.front()
.time <=0)
// 隊首顧客的服務時長減少乙個單位
windows[i]
.dequeue()
;// 服務完畢的顧客出列,由後繼顧客接替
}delete
windows;
// 釋放所有佇列
}
首先,根據銀行所設視窗的數量相應地建立多個佇列。以下以時間單位為間隔反覆迭代,直至下班。每一時刻都有一位顧客按一定的概率抵達,隨機確定所辦業務服務時長之後,歸入某一「最優」佇列。每經單位時間,各佇列靠前顧客(如果有的話)的待服務時長均相應減少乙個單位,若時長歸零,意味著該顧客的業務已經辦理完畢,退出佇列並由後一位顧客(如果有的話)接替。可見,顧客歸入佇列和退出佇列的事件可分別由enqueue()、dequeue()
操作模擬,查詢並修改隊首顧客時長的事件則可由front()
操作模擬。
int
bestwindow
(queue windows,
int nwin)
return optwin;
//返回
}
為更好地為新到顧客確定乙個佇列,採用「最短優先」地原則。 STL的記憶體分配器
題記 記憶體管理一直是c c 程式的 關於記憶體管理的話題,大致有兩類側重點,一類是記憶體的正確使用,例如c 中new和delete應該成對出現,用raii技巧管理記憶體資源,auto ptr等方面,很多c c 書籍中都使用技巧的介紹。另一類是記憶體管理的實現,如linux核心的slab分配器,st...
STL的記憶體分配器
分類 c c stl 2011 04 04 18 34 1689人閱讀收藏 舉報list 演算法vector linux核心 byte raii 題記 記憶體管理一直是c c 程式的 關於記憶體管理的話題,大致有兩類側重點,一類是記憶體的正確使用,例如c 中new和delete應該成對出現,用rai...
STL的記憶體分配器
題記 記憶體管理一直是c c 程式的 關於記憶體管理的話題,大致有兩類側重點,一類是記憶體的正確使用,例如c 中new和delete應該成對出現,用raii技巧管理記憶體資源,auto ptr等方面,很多c c 書籍中都使用技巧的介紹。另一類是記憶體管理的實現,如linux核心的slab分配器,st...