本發(fā)明涉及集群資源調(diào)度相關(guān)
技術(shù)領(lǐng)域:
:,尤其涉及一種在集群中并行調(diào)度容器的方法和裝置。
背景技術(shù):
::隨著虛擬化技術(shù)的發(fā)展,越來越多的公司將自己的線上應(yīng)用迀移到云平臺(tái)上。容器(container)作為一種輕量級(jí)的虛擬化技術(shù),近年來發(fā)展迅速。容器技術(shù)為不同的應(yīng)用程序創(chuàng)造了獨(dú)立的運(yùn)行環(huán)境,實(shí)現(xiàn)了資源隔離、配置與安全保障,能夠滿足應(yīng)用按需分配的資源需求以及保證應(yīng)用的隔離性和可用性。為了滿足大型應(yīng)用的需求,實(shí)踐中往往需要將很多容器部署在計(jì)算機(jī)集群(cluster,以下簡稱集群)中進(jìn)行統(tǒng)一管理并對(duì)外提供服務(wù)。容器集群管理工具目前有g(shù)oogle公司的kubernetes,docker公司的dockerswarm,cloudfoundry公司的diego等。以kuberentes為例,kubernetes是由google開源的容器集群管理系統(tǒng),為在分布式集群環(huán)境下大規(guī)模容器化的應(yīng)用提供資源調(diào)度、部署運(yùn)行、服務(wù)發(fā)現(xiàn)、彈性伸縮等功能。kubernetes通過在線方式監(jiān)控容器集群狀態(tài),判斷容器運(yùn)行狀態(tài)是否符合用戶的配置,以決定是否要?jiǎng)?chuàng)建或刪除容器。資源調(diào)度是容器集群管理系統(tǒng)需要解決的一個(gè)重要問題,資源調(diào)度是指為一個(gè)待部署的容器通過一定的規(guī)則在集群的眾多節(jié)點(diǎn)中選擇一個(gè)適合部署該容器的節(jié)點(diǎn),調(diào)度器一般需要考慮待部署容器需要的資源(多少cpu、多少memory、多少硬盤等)以及一些其它約束,例如是否需要部署在指定位置、是否需要把該容器與和它相同類型的其它容器分散部署在集群中等等。圖1是以kubernetes為例的容器集群中的資源調(diào)度方案。其中,node為節(jié)點(diǎn),節(jié)點(diǎn)可以是虛擬機(jī)也可以是物理機(jī),一個(gè)節(jié)點(diǎn)上可以部署若干個(gè)容器,且每個(gè)節(jié)點(diǎn)上都有一個(gè)agent。節(jié)點(diǎn)上的agent用于管理部署在該節(jié)點(diǎn)上的所有容器,包括監(jiān)控該節(jié)點(diǎn)的資源信息(如cpu、內(nèi)存、磁盤空間等等)以及監(jiān)控部署在該節(jié)點(diǎn)上的容器的運(yùn)行狀態(tài)(如運(yùn)行中、掛起或者創(chuàng)建失敗等)。agent周期性的接受master的輪詢,向master上報(bào)自身所在節(jié)點(diǎn)的資源信息和所有容器的運(yùn)行狀態(tài)。master是容器集群管理系統(tǒng)的中心管理模塊。master可以是集群中的某一個(gè)節(jié)點(diǎn),或若干個(gè)節(jié)點(diǎn)(處于高可用性的目的)。master用于獲取并保存集群整體的狀態(tài)信息,該集群狀態(tài)信息包括:所有節(jié)點(diǎn)的資源信息和所有容器的描述信息,其中,容器的描述信息包括對(duì)容器的部署對(duì)資源的需求和部署節(jié)點(diǎn)等。其中,部署節(jié)點(diǎn)在容器未被調(diào)度前為空(””)。調(diào)度器scheduler周期性的從master同步得到最新的集群狀態(tài)信息,并基于最新的集群狀態(tài)信息對(duì)待調(diào)度的容器進(jìn)行調(diào)度。為了加快調(diào)度的速度,包括google在內(nèi)的omega系統(tǒng)提出并行調(diào)度的解決方案,也就是說系統(tǒng)中會(huì)存在多個(gè)調(diào)度器從master獲取集群的狀態(tài)信息,并對(duì)待調(diào)度的容器進(jìn)行調(diào)度?,F(xiàn)有技術(shù)中,各調(diào)度器可以按照一定的規(guī)則來分配調(diào)度任務(wù)以保證每一個(gè)待調(diào)度的容器有且只有一個(gè)調(diào)度器為其選擇部署節(jié)點(diǎn)。然而按照現(xiàn)在的調(diào)度機(jī)制可知,每個(gè)調(diào)度器都是周期性的從master同步獲取集群的狀態(tài)信息,且都可以將自己負(fù)責(zé)的容器調(diào)度到集群中的任意節(jié)點(diǎn)上。這很可能會(huì)產(chǎn)生資源沖突,例如集群中僅有兩個(gè)node,master保存的集群狀態(tài)信息顯示node1剩余資源是{5cpu,10g內(nèi)存},node2剩余資源是{4cpu,8g內(nèi)存},此時(shí)兩個(gè)調(diào)度器同時(shí)開始調(diào)度各自的任務(wù),scheduler1調(diào)度的c1的資源需求為{3cpu,5g內(nèi)存},scheduler2調(diào)度的c2的資源需求為{3cpu,6g內(nèi)存}。如果兩個(gè)調(diào)度器都希望把各自負(fù)責(zé)的容器放到更加空閑的節(jié)點(diǎn)上,那么scheduler1和scheduler2都會(huì)把node1作為c1和c2的部署節(jié)點(diǎn)通知master。master在收到請(qǐng)求以后如果將c1和c2的部署節(jié)點(diǎn)都改為node1的話,node1上的agent在實(shí)際執(zhí)行的時(shí)候會(huì)發(fā)現(xiàn)資源不足,c1和c2必將有一個(gè)部署失敗(先部署c1,則c2將部署失敗;先部署c2的話,則c1將部 署失敗)。而實(shí)際上,c1和c2分別部署在node1和node2上是一個(gè)可行方案,但是并行調(diào)度器沒有找到這個(gè)方案。由上可知,在并行調(diào)度系統(tǒng)中,亟需一種解決調(diào)度沖突的解決方案。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種在集群中并行調(diào)度容器的方法和設(shè)備,以解決并行調(diào)度中資源沖突的問題。為達(dá)到上述目的,本發(fā)明的實(shí)施例采用如下技術(shù)方案:第一方面,提供一種在集群中并行調(diào)度容器的方法,包括:調(diào)度器周期性的獲取集群狀態(tài)信息,所述集群狀態(tài)信息包括集群中所有節(jié)點(diǎn)的資源信息和集群中所有容器的描述信息;其中,所述容器的描述信息包括該容器的容器標(biāo)識(shí)id、該容器對(duì)資源的需求和該容器的部署節(jié)點(diǎn)標(biāo)識(shí)id;所述節(jié)點(diǎn)的資源信息包括該節(jié)點(diǎn)的標(biāo)識(shí)id和該節(jié)點(diǎn)擁有的資源數(shù)量;根據(jù)所述集群狀態(tài)信息shared_info、所述調(diào)度器已調(diào)度的容器信息assumed_local和其他調(diào)度器已調(diào)度的容器信息assumed_remote,將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上;其中,所述已調(diào)度的容器信息包括已調(diào)度的容器的容器id和部署節(jié)點(diǎn)id。由于頻繁的獲取集群狀態(tài)信息會(huì)對(duì)系統(tǒng)中的性能產(chǎn)生很大的壓力,所以現(xiàn)有技術(shù)中都是通過周期性的與系統(tǒng)中其他組件進(jìn)行同步,以獲取系統(tǒng)的集群狀態(tài)信息。同步周期越長,各個(gè)調(diào)度器進(jìn)行并行容器調(diào)度時(shí),發(fā)生資源沖突的概率就越大。為了解決資源沖突的問題,有一種方法就是采用這種減小同步周期的方法。這種頻繁的同步雖然能夠一定程度上改善資源沖突的問題,但是頻繁的同步,對(duì)master造成了很大的性能負(fù)擔(dān),并且也不能完全杜絕資源沖突的問題。本發(fā)明實(shí)施例中,調(diào)度器做調(diào)度決策時(shí),不僅依據(jù)從master同步過來的集群狀態(tài)信息,還考慮到了調(diào)度器自身已經(jīng)調(diào)度的容器的信息和其他調(diào)度器已經(jīng)調(diào)度的容器的信息,從而在不增加master的負(fù)擔(dān)的前提下,有效的降低了資源沖突的概率。在一種可能的設(shè)計(jì)中,根據(jù)所述集群狀態(tài)信息shared_info、所述調(diào)度器已調(diào)度的容器信息assumed_local和其他調(diào)度器已調(diào)度的容器信息assumed_remote,將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上,具體為:調(diào)度器根據(jù)所述shared_info、所述assumed_local和所述assumed_remote,生成當(dāng)前決策信息current_state;根據(jù)所述current_state和預(yù)設(shè)的調(diào)度規(guī)則將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上。預(yù)設(shè)的調(diào)度規(guī)則可以是將容器調(diào)度到資源最充足的節(jié)點(diǎn)上。本發(fā)明實(shí)施例生成當(dāng)前決策信息current_state,并根據(jù)當(dāng)前決策信息current_state進(jìn)行調(diào)度決策,有效的降低了資源沖突的概率。并且系統(tǒng)動(dòng)態(tài)的維護(hù)一個(gè)當(dāng)前決策信息current_state,當(dāng)需要調(diào)度容器時(shí),直接查詢?cè)摦?dāng)前決策信息current_state即可,不需要再根據(jù)所述shared_info、所述assumed_local和所述assumed_remote進(jìn)行計(jì)算,從而加快了調(diào)度器的調(diào)度時(shí)間。一種可能的設(shè)計(jì)中,調(diào)度器根據(jù)所述shared_info、所述assumed_local和所述assumed_remote,生成當(dāng)前決策信息current_state,具體為:當(dāng)所述shared_info與所述assumed_local或者所述assumed_remote中關(guān)于某一個(gè)容器的部署節(jié)點(diǎn)有沖突時(shí),以所述assumed_local或者所述assumed_remote為準(zhǔn),生成所述current_state。因?yàn)椴粫?huì)有兩個(gè)或者以上的調(diào)度器會(huì)對(duì)同一個(gè)容器進(jìn)行調(diào)度,所以assumed_local和所述assumed_remote二者不會(huì)沖突。當(dāng)前決策信息current_state表征了當(dāng)前集群中各個(gè)容器的真實(shí)調(diào)度情況,由于并行調(diào)度架構(gòu)中調(diào)度器和master之間的信息同步不是實(shí)時(shí)的,所以在同步周期間隙中,其他調(diào)度器(如scheduler1)的調(diào)度結(jié)果在scheduler2保存的群狀態(tài)信息shared_info2中將無法體現(xiàn);另外,由于調(diào)度器完成調(diào)度任務(wù)后,雖然將調(diào)度結(jié)果發(fā)送給master了,但是該調(diào)度結(jié)果依然也無法在scheduler2保存的群狀態(tài)信息shared_info2中體現(xiàn)。所以僅根據(jù)集群狀態(tài)信息,無法準(zhǔn)確的進(jìn)行容器調(diào)度。一種可能的設(shè)計(jì)中,在所述獲取集群狀態(tài)信息之前,所述方法還包括:接收所述其他調(diào)度器發(fā)送的調(diào)度通告,所述其他調(diào)度器發(fā)送的調(diào)度通告包括容器id和節(jié)點(diǎn)id;將所述其他調(diào)度器發(fā)送的調(diào)度通告保存 到所述assumed_remote中;在所述將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上之后,所述方法還包括:向所述其他調(diào)度器發(fā)送包含所述待部署的容器的容器id和所述集群中的節(jié)點(diǎn)的節(jié)點(diǎn)id的調(diào)度通告。所述assumed_remote用于保存其他調(diào)度器發(fā)送的調(diào)度通告,根據(jù)所述assumed_remote中保存的調(diào)度通告,調(diào)度器可以獲知哪些容器已經(jīng)被其他調(diào)度器進(jìn)行調(diào)度,并部署在哪些節(jié)點(diǎn)上了,從而在為自身的容器調(diào)度做調(diào)度決策時(shí),對(duì)此進(jìn)行考慮,避免了并行調(diào)度時(shí)發(fā)生資源沖突。第二方面,本發(fā)明實(shí)施例提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),用于儲(chǔ)存為上述在集群中并行調(diào)度容器的裝置所用的計(jì)算機(jī)軟件指令,其包含用于執(zhí)行上述方面所設(shè)計(jì)的程序。第三方面,本發(fā)明實(shí)施例提供了在集群中并行調(diào)度容器的裝置,該裝置具有實(shí)現(xiàn)上述第一方面中在集群中并行調(diào)度容器的裝置行為的功能。所述功能可以通過硬件實(shí)現(xiàn),也可以通過硬件執(zhí)行相應(yīng)的軟件實(shí)現(xiàn)。所述硬件或軟件包括一個(gè)或多個(gè)與上述功能相對(duì)應(yīng)的模塊。在一個(gè)可能的設(shè)計(jì)中,在集群中并行調(diào)度容器的裝置的結(jié)構(gòu)中包括處理器和存儲(chǔ)器,所述存儲(chǔ)器用于存儲(chǔ)支持裝置執(zhí)行上述方法的程序,所述處理器被配置為用于執(zhí)行所述存儲(chǔ)器中存儲(chǔ)的程序。所述數(shù)據(jù)庫處理設(shè)備還可以包括通信接口,用于數(shù)據(jù)庫處理設(shè)備與其他設(shè)備或通信網(wǎng)絡(luò)通信??蛇x的,上述各方面所述的調(diào)度通告還包括該調(diào)度通告生成的時(shí)間。當(dāng)調(diào)度器接收到該調(diào)度通告后,將該調(diào)度通告保存到自身的其他調(diào)度器已經(jīng)調(diào)度的容器信息assumed_remote中,并監(jiān)控assumed_remote中保存的所有調(diào)度通告是否超出生命周期,如果超過了生命周期,則確定該調(diào)度通告已經(jīng)失效,進(jìn)而刪除該調(diào)度通告。通過對(duì)assumed_remote中保存的調(diào)度通告進(jìn)行及時(shí)清理,可以有效的減輕設(shè)備的存儲(chǔ)負(fù)擔(dān)。相較于現(xiàn)有技術(shù),本發(fā)明提供的方案在調(diào)度決策時(shí),除了依據(jù)集群狀態(tài)信息外,還會(huì)獲取調(diào)度器已調(diào)度的容器信息和其他調(diào)度器已調(diào)度的容器信息,從而在集群中并行調(diào)度容器時(shí),避免出現(xiàn)資源沖突。本發(fā)明的這些方面或其他方面在以下實(shí)施例的描述中會(huì)更加簡明易懂。附圖說明圖1為現(xiàn)有技術(shù)中一種容器調(diào)度的系統(tǒng)架構(gòu)圖;圖2為本發(fā)明一實(shí)施例提供的集群中并行調(diào)度容器的運(yùn)行架構(gòu);圖3為本發(fā)明一實(shí)施例提供的計(jì)算機(jī)設(shè)備示意圖;圖4為本發(fā)明一實(shí)施例提供的一種在集群中并行調(diào)度容器的方法的流程示意圖;圖5為本發(fā)明一實(shí)施例提供的在集群中并行調(diào)度容器的裝置的結(jié)構(gòu)示意圖。具體實(shí)施方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例作進(jìn)一步的詳細(xì)描述。圖2描述了本發(fā)明一實(shí)施例涉及的在集群中并行調(diào)度容器的的系統(tǒng)架構(gòu)。該并行調(diào)度容器的的系統(tǒng)架構(gòu)包括調(diào)度器scheduler201(如scheduler1和scheduler2等)、中心管理器master202以及節(jié)點(diǎn)node203(如node1和node2等)。scheduler201、master202以及node203建立通信連接。其中,節(jié)點(diǎn)可以是虛擬機(jī)也可以是物理機(jī),一個(gè)節(jié)點(diǎn)上可以部署若干個(gè)容器,且每個(gè)節(jié)點(diǎn)上都有一個(gè)agent2031。節(jié)點(diǎn)上的agent2031用于管理部署在該節(jié)點(diǎn)上的所有容器,包括監(jiān)控該節(jié)點(diǎn)的資源信息(如cpu、內(nèi)存、磁盤空間等等)以及監(jiān)控部署在該節(jié)點(diǎn)上的容器的運(yùn)行狀態(tài)(如運(yùn)行中、掛起或者創(chuàng)建失敗等)。agent2031周期性的接受master202的輪詢,向master202上報(bào)自身所在節(jié)點(diǎn)的資源信息和所有容器的運(yùn)行狀態(tài)。master202是容器集群管理系統(tǒng)的中心管理模塊。master202可以是集群中的某一個(gè)節(jié)點(diǎn),或若干個(gè)節(jié) 點(diǎn)(處于高可用性的目的)。master202用于獲取并保存集群整體的狀態(tài)信息,該集群狀態(tài)信息包括:所有節(jié)點(diǎn)的資源信息和所有容器的描述信息,其中,容器的描述信息包括對(duì)容器的部署對(duì)資源的需求和部署節(jié)點(diǎn)等。其中,部署節(jié)點(diǎn)在容器未被調(diào)度前為空(””)。調(diào)度器scheduler201周期性的從master202同步得到最新的集群狀態(tài)信息,并基于最新的集群狀態(tài)信息對(duì)待調(diào)度的容器進(jìn)行調(diào)度。各調(diào)度器可以按照一定的規(guī)則來分配調(diào)度任務(wù)以保證每一個(gè)待調(diào)度的容器有且只有一個(gè)調(diào)度器為其選擇部署節(jié)點(diǎn)。資源調(diào)度的含義即是為一個(gè)待部署的容器通過預(yù)設(shè)的調(diào)度規(guī)則在集群的眾多節(jié)點(diǎn)中選擇一個(gè)適合部署該容器的節(jié)點(diǎn)。調(diào)度器在進(jìn)行資源調(diào)度時(shí)一般需要綜合考慮待部署容器需要的資源(多少cpu、多少memory、多少硬盤)以及集群中各個(gè)節(jié)點(diǎn)剩余的資源情況。在本發(fā)明實(shí)施例中,當(dāng)調(diào)度器完成調(diào)度后,將除了將調(diào)度結(jié)果(包含了容器的id和部署節(jié)點(diǎn)的id)發(fā)送給master之外,還向其他調(diào)度器發(fā)送調(diào)度通告(包含了容器的id和部署節(jié)點(diǎn)的id)。每個(gè)調(diào)度器都會(huì)保存其他調(diào)度器發(fā)送的調(diào)度通告,當(dāng)一個(gè)調(diào)度器需要做調(diào)度決策時(shí),它不僅考慮從master同步得到的集群狀態(tài)信息和自身已調(diào)度的容器信息,還需要考慮從其他調(diào)度器接收到的調(diào)度通告。為了加快調(diào)度速度,調(diào)度器完成調(diào)度將調(diào)度結(jié)果發(fā)送給master之后,并不需要等待master的響應(yīng)確認(rèn),而是緊接著從調(diào)度下一個(gè)任務(wù)。由于調(diào)度器是周期性的從master同步獲取集群狀態(tài)信息,所以不同的調(diào)度器在同步周期內(nèi)可能完成了多個(gè)容器的調(diào)度,例如scheduler1將c1_1部署到node1,scheduler2將c2_1部署到node2,而這些調(diào)度信息在集群狀態(tài)信息中并沒有體現(xiàn)出來。當(dāng)scheduler1緊接著對(duì)容器c1_2進(jìn)行調(diào)度時(shí),除了考慮之前從master同步過來的集群狀態(tài)信息外,還需要考慮自身已調(diào)度的容器信息(將c1_1部署到node1)和從其他調(diào)度器接收到的調(diào)度通告(將c2_1部署到node2),并基于此進(jìn)行調(diào)度決策,將c1_2調(diào)度到合適的節(jié)點(diǎn)上。通過上述方法,可以有效的避免并行調(diào)度中資源沖突的問題,提高了調(diào)度的效率。需要說明的是,在并行調(diào)度架構(gòu)中,不同的調(diào)度器可以在相同的時(shí)刻與master202進(jìn)行數(shù)據(jù)同步,也可以在不同的時(shí)刻與master202進(jìn)行數(shù)據(jù)同步,本發(fā)明不做限定,并且調(diào)度器的個(gè)數(shù)也不限定于2個(gè),且節(jié)點(diǎn)的個(gè)數(shù)也不做限定。如圖3所示,圖2中的調(diào)度器可以以圖3中的計(jì)算機(jī)設(shè)備(或系統(tǒng))的方式來實(shí)現(xiàn)。圖3所示為本發(fā)明實(shí)施例提供的計(jì)算機(jī)設(shè)備示意圖。計(jì)算機(jī)設(shè)備300包括至少一個(gè)處理器301,通信總線302,存儲(chǔ)器303以及至少一個(gè)通信接口304。處理器301可以是一個(gè)通用中央處理器(cpu),微處理器,特定應(yīng)用集成電路(application-specificintegratedcircuit,asic),或一個(gè)或多個(gè)用于控制本發(fā)明方案程序執(zhí)行的集成電路。通信總線302可包括一通路,在上述組件之間傳送信息。所述通信接口304,使用任何收發(fā)器一類的裝置,用于與其他設(shè)備或通信網(wǎng)絡(luò)通信,如以太網(wǎng),無線接入網(wǎng)(ran),無線局域網(wǎng)(wirelesslocalareanetworks,wlan)等。存儲(chǔ)器303可以是只讀存儲(chǔ)器(read-onlymemory,rom)或可存儲(chǔ)靜態(tài)信息和指令的其他類型的靜態(tài)存儲(chǔ)設(shè)備,隨機(jī)存取存儲(chǔ)器(randomaccessmemory,ram)或者可存儲(chǔ)信息和指令的其他類型的動(dòng)態(tài)存儲(chǔ)設(shè)備,也可以是電可擦可編程只讀存儲(chǔ)器(electricallyerasableprogrammableread-onlymemory,eeprom)、只讀光盤(compactdiscread-onlymemory,cd-rom)或其他光盤存儲(chǔ)、光碟存儲(chǔ)(包括壓縮光碟、激光碟、光碟、數(shù)字通用光碟、藍(lán)光光碟等)、磁盤存儲(chǔ)介質(zhì)或者其他磁存儲(chǔ)設(shè)備、或者能夠用于攜帶或存儲(chǔ)具有指令或數(shù)據(jù)結(jié)構(gòu)形式的期望的程序代碼并能夠由計(jì)算機(jī)存取的任何其他介質(zhì),但不限于此。存儲(chǔ)器可以是獨(dú)立存在,通過總線與處理器相連接。存儲(chǔ)器也可以和處理器集成在一起。其中,所述存儲(chǔ)器303用于存儲(chǔ)執(zhí)行本發(fā)明方案的應(yīng)用程序代碼,并由處理器301來控制執(zhí)行。所述處理器301用于執(zhí)行所述存儲(chǔ)器303中存儲(chǔ)的應(yīng)用程序代碼。在具體實(shí)現(xiàn)中,作為一種實(shí)施例,處理器301可以包括一個(gè)或多個(gè)cpu,例如圖3中的cpu0和cpu1。在具體實(shí)現(xiàn)中,作為一種實(shí)施例,計(jì)算機(jī)設(shè)備300可以包括多個(gè)處理器,例如圖3中的處理器301和處理器308。這些處理器中的每一個(gè)可以是一個(gè)單核(single-cpu)處理器,也可以是一個(gè)多核(multi-cpu)處理器。這里的處理器可以指一個(gè)或多個(gè)設(shè)備、電路、和/或用于處理數(shù)據(jù)(例如計(jì)算機(jī)程序指令)的處理核。在具體實(shí)現(xiàn)中,作為一種實(shí)施例,計(jì)算機(jī)設(shè)備300還可以包括輸出設(shè)備305和輸入設(shè)備306。輸出設(shè)備305和處理器301通信,可以以多種方式來顯示信息。例如,輸出設(shè)備305可以是液晶顯示器(liquidcrystaldisplay,lcd),發(fā)光二級(jí)管(lightemittingdiode,led)顯示設(shè)備,陰極射線管(cathoderaytube,crt)顯示設(shè)備,或投影儀(projector)等。輸入設(shè)備306和處理器301通信,可以以多種方式接受用戶的輸入。例如,輸入設(shè)備306可以是鼠標(biāo)、鍵盤、觸摸屏設(shè)備或傳感設(shè)備等。上述的計(jì)算機(jī)設(shè)備300可以是一個(gè)通用計(jì)算機(jī)設(shè)備或者是一個(gè)專用計(jì)算機(jī)設(shè)備。在具體實(shí)現(xiàn)中,計(jì)算機(jī)設(shè)備300可以是臺(tái)式機(jī)、便攜式電腦、網(wǎng)絡(luò)服務(wù)器、掌上電腦(personaldigitalassistant,pda)、移動(dòng)手機(jī)、平板電腦、無線終端設(shè)備、通信設(shè)備、嵌入式設(shè)備或有圖3中類似結(jié)構(gòu)的設(shè)備。本發(fā)明實(shí)施例不限定計(jì)算機(jī)設(shè)備300的類型。如圖2中的調(diào)度器可以為圖3所示的設(shè)備,調(diào)度器的存儲(chǔ)器中存儲(chǔ)了一個(gè)或多個(gè)軟件模塊(例如:交互模塊和處理模塊等)。調(diào)度器可以通過處理器以及存儲(chǔ)器中的程序代碼來實(shí)現(xiàn)軟件模塊,實(shí)現(xiàn)在集群中并行的調(diào)度容器。如圖4所示,為本發(fā)明實(shí)施例提供的在集群中并行調(diào)度容器的方法流程示意圖。為了便于說明,本發(fā)明實(shí)施例以圖2所述的系統(tǒng)架構(gòu)為例進(jìn)行說明,需要說明的是,在實(shí)際系統(tǒng)中調(diào)度器、節(jié)點(diǎn)、master的個(gè)數(shù)不限于圖2中顯示的個(gè)數(shù)。在本發(fā)明實(shí)施例中,集群由兩個(gè)節(jié)點(diǎn)(node1和node2)組成,并且存在兩個(gè)并行調(diào)度器(scheduler1和scheduler2)分別調(diào)度屬于自己的調(diào)度任務(wù),其中scheduler1負(fù)責(zé)調(diào)度c1_1和c1_2,scheduler2負(fù)責(zé)調(diào)度c2_1和c2_2。各容器的描述信息以及各節(jié)點(diǎn)的資源信息保存在master中,且在t時(shí)刻時(shí),分別如表2和表1所示。其中,節(jié)點(diǎn)的資源信息是master通過與agent進(jìn)行通信獲取的,容器的描述信息是master接收創(chuàng)建容器的請(qǐng)求時(shí)生成的。a1、調(diào)度器與master進(jìn)行同步,獲取最新的集群狀態(tài)信息;scheduler1、scheduler2分別與master進(jìn)行信息同步,獲取最新的集群狀態(tài)信息,記為shared_info1和shared_info2,集群狀態(tài)信息包含了集群中各個(gè)節(jié)點(diǎn)的資源信息以及集群中所有容器的描述信息,其中,節(jié)點(diǎn)的資源信息該節(jié)點(diǎn)的標(biāo)識(shí)id和該節(jié)點(diǎn)擁有的資源數(shù)量(例如cpu和內(nèi)存等信息);容器的描述信息包括容器的標(biāo)識(shí)id、資源需求(例如部署該容器需要多少cpu和內(nèi)存等)以及部署節(jié)點(diǎn)標(biāo)識(shí)id。當(dāng)容器還沒有被調(diào)度時(shí),則該容器的描述信息中的部署節(jié)點(diǎn)id設(shè)置為“未部署”,例如可以設(shè)置為na或者“”。表1節(jié)點(diǎn)的資源信息:table_nodesnode_idtotalcputotalmemorynode1511gnode2612g表2容器的描述信息:table_containerscontainer_idnodecpumemoryc1_1“”35gc1_2“”25gc2_1“”35gc2_2“”25g需要說明的是,容器的描述信息是master接收創(chuàng)建容器的請(qǐng)求時(shí)生成的,該創(chuàng)建請(qǐng)求可以是用戶在客戶端通過模板發(fā)起的,也可以是系統(tǒng)中其他組件,如彈性伸縮組件根據(jù)業(yè)務(wù)需要自動(dòng)發(fā)起的。例如在 kubernetes中,表2中c1_1的模板可以是:模板中的{spec:{containers:{resources:{requests:{cpu:3,memory:5g}}}}}代表了部署該容器的資源需求是3個(gè)cpucore和5g的內(nèi)存。本實(shí)施例中由于其他屬性和調(diào)度無關(guān),我們不做更多解釋。需要說明的是,容器的創(chuàng)建請(qǐng)求在剛剛提交到master后,其部署節(jié)點(diǎn)信息的值是空,這個(gè)值需要調(diào)度器通過調(diào)度來決定。a2、scheduler2調(diào)度容器c2_1;scheduler2根據(jù)集群狀態(tài)信息shared_info2、scheduler2已調(diào)度的容器信息assumed_local_2和其他容器已調(diào)度的容器信息assumed_remote_2,并基于預(yù)設(shè)的調(diào)度規(guī)則,將待部署的容器c2_1調(diào)度到node2上。完成調(diào)度后,將調(diào)度結(jié)果保存到已調(diào)度容器信息assumed_local_2中,所述調(diào)度結(jié)果包括被調(diào)度的容器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c2_1,node2}。a3、scheduler2將調(diào)度結(jié)果發(fā)送給master;具體的,scheduler2將c2_1的調(diào)度結(jié)果發(fā)送給master,調(diào)度結(jié)果包括被調(diào)度的容器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c2_1,node2},以便于master根據(jù)調(diào)度結(jié)果更改容器c2_1的描述信息中的部署節(jié)點(diǎn),即由“”改為node2。a4、scheduler2向其他調(diào)度器發(fā)送調(diào)度通告;所述調(diào)度通告包括被調(diào)度的容器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c2_1,node2}??蛇x的,還包括該調(diào)度通告生成的時(shí)間,例如{c2_1,node2,time1}。當(dāng)其他調(diào)度器接收到該調(diào)度通告時(shí),即可以知道node2上已經(jīng)部署了容器c2_1,其他調(diào)度器在進(jìn)行容器調(diào)度時(shí),需要將此考慮進(jìn)去。a5、scheduler1接收其他調(diào)度器發(fā)送的調(diào)度通告,并保存接收到的調(diào)度通告;scheduler1調(diào)度容器c1_1;scheduler1接收其他調(diào)度器發(fā)送的調(diào)度通告,并保存接收到的調(diào)度通告,可選的,scheduler1將調(diào)度通告保存在其他容器已調(diào)度的容器信息assumed_remote_1中??蛇x的,當(dāng)接收其他調(diào)度器發(fā)送的調(diào)度通告中包括該調(diào)度通告生成的時(shí)間時(shí),調(diào)度器可以根據(jù)該調(diào)度通告生成的時(shí)間確定該調(diào)度通告是否已經(jīng)失效,如果該調(diào)度通告已經(jīng)失效,則調(diào)度器將該調(diào)度通告從assumed_remote_1中刪除。scheduler1根據(jù)集群狀態(tài)信息shared_info1、scheduler1已調(diào)度的容器信息assumed_local_1和其他容器已調(diào)度的容器信息assumed_remote1,并基于預(yù)設(shè)的調(diào)度規(guī)則,將待部署的容器c1_1調(diào)度到node1上。完成調(diào)度后,將調(diào)度結(jié)果保存到已調(diào)度容器信息assumed_local_1中,所述調(diào)度結(jié)果包括被調(diào)度的容 器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c1_1,node1}。a6、scheduler1將調(diào)度結(jié)果發(fā)送給master;具體的,scheduler1將c1_1的調(diào)度結(jié)果發(fā)送給master,調(diào)度結(jié)果包括被調(diào)度的容器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c1_1,node1},以便于master根據(jù)調(diào)度結(jié)果更改容器c1_1的描述信息中的部署節(jié)點(diǎn),即由“”改為node1。a7、scheduler1向其他調(diào)度器發(fā)送調(diào)度通告;所述調(diào)度通告包括被調(diào)度的容器標(biāo)識(shí)id和部署節(jié)點(diǎn)標(biāo)識(shí)id,即{c1_1,node1},可選的,還包括該調(diào)度通告生成的時(shí)間,例如{c1_1,node1,time2}。當(dāng)其他調(diào)度器接收到該調(diào)度通告時(shí),即可以知道在time2時(shí),node1上已經(jīng)部署了容器c1_1,其他調(diào)度器在進(jìn)行容器調(diào)度時(shí),需要將此考慮進(jìn)去。以下將對(duì)上述各執(zhí)行步驟進(jìn)行詳細(xì)說明。本發(fā)明實(shí)施例中scheduler調(diào)度容器的過程,可采用如下方式:(1)scheduler獲取集群狀態(tài)信息shared_info、scheduler已調(diào)度的容器信息assumed_local和其他容器已調(diào)度的容器信息assumed_remote;其中,集群狀態(tài)信息shared_info由scheduler周期性的與master進(jìn)行同步獲得;scheduler每完成一次調(diào)度,就會(huì)將調(diào)度結(jié)果保存至自身的已調(diào)度的容器信息assumed_local中,同時(shí)也會(huì)隨時(shí)接受其他調(diào)度器發(fā)送的調(diào)度通告,并將接收到的調(diào)度通告保存到自身的其他調(diào)度器已調(diào)度的容器信息assumed_remote中。(2)scheduler根據(jù)集群狀態(tài)信息shared_info、scheduler已調(diào)度的容器信息assumed_local和其他容器已調(diào)度的容器信息assumed_remote,生成當(dāng)前決策信息current_state;當(dāng)前決策信息current_state表征了當(dāng)前集群中各個(gè)容器的真實(shí)調(diào)度情況,由于并行調(diào)度架構(gòu)中調(diào)度器和master之間的信息同步不是實(shí)時(shí)的,所以在同步周期間隙中,其他調(diào)度器(如scheduler1)的調(diào)度結(jié)果在scheduler2保存的群狀態(tài)信息shared_info2中將無法體現(xiàn);另外,由于調(diào)度器完成調(diào)度任務(wù)后,雖然將調(diào)度結(jié)果發(fā)送給master了,但是該調(diào)度結(jié)果依然也無法在scheduler2保存的群狀態(tài)信息shared_info2中體現(xiàn)。所以僅根據(jù)集群狀態(tài)信息,無法準(zhǔn)確的進(jìn)行容器調(diào)度。本發(fā)明實(shí)施例中,需要利用scheduler已調(diào)度的容器信息assumed_local和其他容器已調(diào)度的容器信息assumed_remote對(duì)scheduler保存的集群狀態(tài)信息shared_info進(jìn)行修正,得到當(dāng)前決策信息current_state。需要說明的是,對(duì)scheduler保存的集群狀態(tài)信息shared_info進(jìn)行修正,得到當(dāng)前決策信息current_state,具體可以是直接對(duì)集群狀態(tài)信息shared_info進(jìn)行修正,修正后得到的信息即是當(dāng)前決策信息current_state;當(dāng)前決策信息current_state也可以是對(duì)集群狀態(tài)信息shared_info復(fù)制的副本進(jìn)行修正得到的信息,而原先保存的集群狀態(tài)信息shared_info并不改變,本發(fā)明實(shí)施例對(duì)當(dāng)前決策信息current_state的具體生成方式不做限定。具體處理的方法可以是:凡是shared_info與assumed_local或者assumed_remote中關(guān)于容器部署節(jié)點(diǎn)信息有沖突的,以assumed_local或assumed_remote為準(zhǔn),同時(shí),此二者不會(huì)沖突,因?yàn)椴粫?huì)有兩個(gè)或者以上的調(diào)度器會(huì)對(duì)同一個(gè)容器進(jìn)行調(diào)度??蛇x的,如果assumed_local或者assumed_remote中關(guān)于容器部署節(jié)點(diǎn)信息在shared_info中已經(jīng)有體現(xiàn),則調(diào)度器將assumed_local或者assumed_remote中關(guān)于容器部署節(jié)點(diǎn)信息刪除,以減輕存儲(chǔ)負(fù)擔(dān)。例如,scheduler的shared_info中記錄容器a和容器b的部署節(jié)點(diǎn)為空,而assumed_local中記錄容器a在節(jié)點(diǎn)1上,assumend_remote中記錄容器b在節(jié)點(diǎn)2上,則scheduler生成的當(dāng)前決策信息current_state會(huì)記錄容器a和容器b的部署節(jié)點(diǎn)分別是節(jié)點(diǎn)1和節(jié)點(diǎn)2。再例如,scheduler的shared_info中記錄容器a和容器b的部署節(jié)點(diǎn)分別為節(jié)點(diǎn)1和節(jié)點(diǎn)2,且assumed_local中記錄容器a在節(jié)點(diǎn)1上,assumend_remote中記錄容器b在節(jié)點(diǎn)2上,則scheduler生 成的當(dāng)前決策信息current_state會(huì)記錄容器a和容器b的部署節(jié)點(diǎn)分別是節(jié)點(diǎn)1和節(jié)點(diǎn)2,可選的,會(huì)刪除assumed_local中記錄容器a在節(jié)點(diǎn)1上的相關(guān)信息,和/或刪除assumend_remote中記錄容器b在節(jié)點(diǎn)2上的相關(guān)信息。在本發(fā)明實(shí)施例中,由于系統(tǒng)剛上線,c2_1為scheduler2執(zhí)行的第一個(gè)調(diào)度任務(wù),并且scheduler2也沒有收到過其他調(diào)度器發(fā)送的調(diào)度通告,所以scheduler2已調(diào)度的容器信息assumed_local_2和其他容器已調(diào)度的容器信息assumed_remote2都為空,獲取的集群狀態(tài)信息shared_info2如表1和表2所示。由于scheduler2已調(diào)度的容器信息assumed_local_2和其他容器已調(diào)度的容器信息assumed_remote2都為空,所以修正后得到的當(dāng)前決策信息current_state_2與shared_info2相同,如表1和表2所示。(3)根據(jù)當(dāng)前決策信息current_state以及預(yù)設(shè)的調(diào)度規(guī)則,對(duì)待部署的容器進(jìn)行調(diào)度。具體的,系統(tǒng)中的調(diào)度器可以使用相同的調(diào)度策略,如把容器部署在剩余資源較多的節(jié)點(diǎn)上。可選的,在調(diào)度過程中,調(diào)度器首先將節(jié)點(diǎn)剩余資源不能滿足容器需求的節(jié)點(diǎn)排除在后續(xù)部署節(jié)點(diǎn)之外,然后對(duì)所有符合部署條件的節(jié)點(diǎn)進(jìn)行打分,打分規(guī)則可以如下:節(jié)點(diǎn)分?jǐn)?shù)=(總可用cpu-已占用cpu-當(dāng)前容器需求cpu)/總可用cpu+(總可用mem-已占用mem-當(dāng)前容器需求mem)/總可用mem其中節(jié)點(diǎn)的總可用cpu、總可用mem、已占用cpu和已占用mem都由當(dāng)前決策信息current_state確定。當(dāng)前容器指正在被調(diào)度的容器。打分過后,得分最高的節(jié)點(diǎn)將被選為部署節(jié)點(diǎn)。例如,scheduler2調(diào)度c2_1時(shí),則由表2可知當(dāng)前容器需求cpu為3,當(dāng)前容器需求mem為5g,且集群中所有容器的部署節(jié)點(diǎn)都為空,所以每個(gè)節(jié)點(diǎn)的已占用cpu和已占用mem都為0;由表1可知,節(jié)點(diǎn)1的總可用cpu為5、總可用mem為11g;節(jié)點(diǎn)2的總可用cpu為6、總可用mem為12g,,所以根據(jù)當(dāng)前決策信息current_state以及預(yù)設(shè)的調(diào)度規(guī)則,對(duì)各個(gè)節(jié)點(diǎn)打分為:node1:(5-0-3)/5+(11-0-5)/11=0.94node2:(6-0-3)/6+(12-0-5)/11=1.08基于以上計(jì)算,scheduler2將node_2選擇成為c2_1的部署節(jié)點(diǎn),從而完成對(duì)容器c2_1的調(diào)度。需要說明的是,上述流程中,當(dāng)調(diào)度器完成調(diào)度后,會(huì)及時(shí)向master發(fā)送調(diào)度結(jié)果以及向其他調(diào)度器發(fā)送調(diào)度通告。但是各個(gè)調(diào)度器執(zhí)行調(diào)度任務(wù)的順序是可以變化的,例如步驟a5可以是在a2之前發(fā)生或者是在a2之后發(fā)生。可選的,在步驟a1之前,還包括步驟a11master與集群中各個(gè)節(jié)點(diǎn)的agent進(jìn)行信息同步,獲取集群中所有節(jié)點(diǎn)的資源信息??蛇x的,本發(fā)明實(shí)施例中提及的調(diào)度通告中還包括該調(diào)度通告生成的時(shí)間。當(dāng)接收到該調(diào)度通告后,將該調(diào)度通告保存到自身的其他調(diào)度器已經(jīng)調(diào)度的容器信息assumed_remote中,并監(jiān)控assumed_remote中保存的所有調(diào)度通告是否超出生命周期,如果超過了生命周期,則確定該調(diào)度通告已經(jīng)失效,進(jìn)而刪除該調(diào)度通告。例如,可以設(shè)定系統(tǒng)中的調(diào)度通告的生存時(shí)間為t_eff,調(diào)度器對(duì)assumed_remote中的每一條調(diào)度通告進(jìn)行監(jiān)控,檢查其已經(jīng)存在的時(shí)間t_cid_exit=t_now-t_cid,如果t_cid_exit大于t_eff則確定該調(diào)度通告已經(jīng)失效,調(diào)度器則刪除該條調(diào)度通告。需要說明的是,調(diào)度通告的生存時(shí)間為t_eff不小于調(diào)度器與master的同步周期。通過在調(diào)度通告中增加調(diào)度通告生成的時(shí)間,并且根據(jù)調(diào)度通告生成的時(shí)間,對(duì)assumed_remote中保存的調(diào)度通告進(jìn)行及時(shí)清理,可以有效的減輕設(shè)備的存儲(chǔ)負(fù)擔(dān)。顯然的是,同步周期越長,各個(gè)調(diào)度器進(jìn)行并行容器調(diào)度時(shí),發(fā)生資源沖突的概率就越大?,F(xiàn)有技術(shù)中,為了解決資源沖突的問題,有一種方法就是采用這種減小同步周期的方法。這種頻繁的同步雖然能夠一定程度上改善資源沖突的問題,但是頻繁的同步,對(duì)master造成了很大的性能負(fù)擔(dān),并且也不能完全杜絕資源沖突的問題。本發(fā)明實(shí)施例中,調(diào)度器做調(diào)度決策時(shí),不僅依據(jù)從master同步過來的集群狀態(tài) 信息,還考慮到了調(diào)度器自身已經(jīng)調(diào)度的容器的信息和其他調(diào)度器已經(jīng)調(diào)度的容器的信息,從而在不增加master的負(fù)擔(dān)的前提下,有效的降低了資源沖突的概率。本發(fā)明實(shí)施例還描述了上述方法實(shí)施例屬于同一發(fā)明構(gòu)思下的在集群中并行調(diào)度容器的裝置。如圖5所示,該裝置器500包括:交互單元501和處理單元503。其中,交互單元501,用于周期性的獲取集群狀態(tài)信息,所述集群狀態(tài)信息包括集群中所有節(jié)點(diǎn)的資源信息和集群中所有容器的描述信息;其中,所述容器的描述信息包括該容器的容器標(biāo)識(shí)id、該容器對(duì)資源的需求和該容器的部署節(jié)點(diǎn)標(biāo)識(shí)id;所述節(jié)點(diǎn)的資源信息包括該節(jié)點(diǎn)的標(biāo)識(shí)id和該節(jié)點(diǎn)擁有的資源數(shù)量;處理單元503,用于根據(jù)所述集群狀態(tài)信息shared_info、所述調(diào)度器已調(diào)度的容器信息assumed_local和其他調(diào)度器已調(diào)度的容器信息assumed_remote,將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上;其中,所述已調(diào)度的容器信息包括已調(diào)度的容器的容器id和部署節(jié)點(diǎn)id。所述處理單元503根據(jù)所述集群狀態(tài)信息shared_info、所述調(diào)度器已調(diào)度的容器信息assumed_local和其他調(diào)度器已調(diào)度的容器信息assumed_remote,將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上,具體為:根據(jù)所shared_info、所述assumed_local和所述assumed_remote,生成當(dāng)前決策信息current_state;根據(jù)所述current_state和預(yù)設(shè)的調(diào)度規(guī)則將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上。其中,根據(jù)所述shared_info、所述assumed_local和所述assumed_remote,生成當(dāng)前決策信息current_state,具體為:當(dāng)所述shared_info與所述assumed_local或者所述assumed_remote中關(guān)于某一個(gè)容器的部署節(jié)點(diǎn)有沖突時(shí),以所述assumed_local或者所述assumed_remote為準(zhǔn),生成所述current_state。所述交互單元501,還用于在獲取集群狀態(tài)信息之前,接收所述其他調(diào)度器發(fā)送的調(diào)度通告,所述其他調(diào)度器發(fā)送的調(diào)度通告包括容器id和節(jié)點(diǎn)id;存儲(chǔ)單元505,用于將所述其他調(diào)度器發(fā)送的調(diào)度通告保存到所述assumed_remote中;所述交互單元501,還用于在所述將待部署的容器調(diào)度到集群中的節(jié)點(diǎn)上之后,向所述其他調(diào)度器發(fā)送包含所述待部署的容器的容器id和所述集群中的節(jié)點(diǎn)的節(jié)點(diǎn)id的調(diào)度通告。其中,所述調(diào)度通告中還包括該調(diào)度通告生成的時(shí)間。在本實(shí)施例中,裝置500是以功能單元的形式來呈現(xiàn)。這里的“單元”可以指特定應(yīng)用集成電路(application-specificintegratedcircuit,asic),電路,執(zhí)行一個(gè)或多個(gè)軟件或固件程序的處理器和存儲(chǔ)器,集成邏輯電路,和/或其他可以提供上述功能的器件。在一個(gè)簡單的實(shí)施例中,本領(lǐng)域的技術(shù)人員可以想到裝置500可以采用圖3所示的形式。交互單元501、處理單元503和存儲(chǔ)單元505可以通過圖3的處理器和存儲(chǔ)器來實(shí)現(xiàn),具體的,交互單元501可以通過由處理器來執(zhí)行交互模塊來實(shí)現(xiàn),處理單元503和存儲(chǔ)單元505可以通過由處理器來執(zhí)行處理模塊來實(shí)現(xiàn)。本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),用于儲(chǔ)存為上述圖4所示的在集群中并行調(diào)度容器所用的計(jì)算機(jī)軟件指令,其包含用于執(zhí)行上述方法實(shí)施例所設(shè)計(jì)的程序。通過執(zhí)行存儲(chǔ)的程序,可以減小在集群中并行調(diào)度容器時(shí)的資源沖突問題。盡管在此結(jié)合各實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,然而,在實(shí)施所要求保護(hù)的本發(fā)明過程中,本領(lǐng)域技術(shù)人員通過查看所述附圖、公開內(nèi)容、以及所附權(quán)利要求書,可理解并實(shí)現(xiàn)所述公開實(shí)施例的其他變化。在權(quán)利要求中,“包括”(comprising)一詞不排除其他組成部分或步驟,“一”或“一個(gè)”不排除多個(gè)的情況。單個(gè)處理器或其他單元可以實(shí)現(xiàn)權(quán)利要求中列舉的若干項(xiàng)功能。相互不同的從屬權(quán)利要求中記載了某些措施,但這并不表示這些措施不能組合起來產(chǎn)生良好的效果。本領(lǐng)域技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、裝置(設(shè)備)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、 cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。計(jì)算機(jī)程序存儲(chǔ)/分布在合適的介質(zhì)中,與其它硬件一起提供或作為硬件的一部分,也可以采用其他分布形式,如通過internet或其它有線或無線電信系統(tǒng)。本發(fā)明是參照本發(fā)明實(shí)施例的方法、裝置(設(shè)備)和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。盡管結(jié)合具體特征及其實(shí)施例對(duì)本發(fā)明進(jìn)行了描述,顯而易見的,在不脫離本發(fā)明的精神和范圍的情況下,可對(duì)其進(jìn)行各種修改和組合。相應(yīng)地,本說明書和附圖僅僅是所附權(quán)利要求所界定的本發(fā)明的示例性說明,且視為已覆蓋本發(fā)明范圍內(nèi)的任意和所有修改、變化、組合或等同物。顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。當(dāng)前第1頁12當(dāng)前第1頁12