佇列的應用(迴圈分配器 銀行視窗服務)

2021-10-04 07:23:41 字數 1740 閱讀 2298

為在客戶(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...