[0006] 周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù);
[0007] 響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程;
[0008] 按照OOM分?jǐn)?shù)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件,并將所述選出的進程ID與所述打印的所述CGroup中的進程ID進行匹配;
[0010] 在一些實施方式中,所述周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù)包括:
[0011] 查看memory.usage_in_bytes文件以及memory.limit_in_bytes文件,以分別查看并記錄所述CGroup已用的內(nèi)存和所述CGroup限制的內(nèi)存額度。
[0012] 在一些實施方式中,所述響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程包括:
[0023] 周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù);
[0024] 響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程;
[0025] 按照OOM分?jǐn)?shù)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件,并將所述選出的進程ID與所述打印的所述CGroup中的進程ID進行匹配,以確定所述CGroup中OOM分?jǐn)?shù)較大的進程;
[0027] 在一些實施方式中,所述周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù)還包括:
[0028] 查看memory.usage_in_bytes文件以及memory.limit_in_bytes文件,以分別查看并記錄所述CGroup已用的內(nèi)存和所述CGroup限制的內(nèi)存額度。
[0029] 在一些實施方式中,所述響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程包括:
[0038] 以下描述了本發(fā)明的實施例。然而,應(yīng)該理解,所公開的實施例僅僅是示例,并且其他實施例可以采取各種替代形式。附圖不一定按比例繪制;某些功能可能被夸大或最小化以顯示特定部件的細(xì)節(jié)。因此,本文公開的具體結(jié)構(gòu)和功能細(xì)節(jié)不應(yīng)被解釋為限制性的,而僅僅是作為用于教導(dǎo)本領(lǐng)域技術(shù)人員以各種方式使用本發(fā)明的代表性
基礎(chǔ)。如本領(lǐng)域普通技術(shù)人員將理解的,參考任何一個附圖所示出和描述的各種特征可以與一個或多個其他附圖中所示的特征組合以產(chǎn)生沒有明確示出或描述的實施例。所示特征的組合為典型應(yīng)用提供了代表性實施例。然而,與本發(fā)明的教導(dǎo)相一致的特征的各種組合和
修改對于某些特定應(yīng)用或?qū)嵤┓绞娇赡苁瞧谕摹?/div>
[0039] 為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明白,以下結(jié)合具體實施例,并參照附圖,對本發(fā)明實施例進一步詳細(xì)說明。
[0040] 基于上述目的,本發(fā)明的實施例一方面提出了一種基于CGroup的內(nèi)存監(jiān)控方法,如圖1所示,包括以下步驟:
[0041] 步驟S101:周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件(該文件顯示內(nèi)存使用量達到限制值的次數(shù)),并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù);
[0042] 步驟S102:響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件(該文件記錄了當(dāng)前CGroup內(nèi)的所有進程的ID信息),以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程;
[0043] 步驟S103:按照OOM(Out?Of?Memory,內(nèi)存不足)分?jǐn)?shù)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件,并將所述選出的進程ID與所述打印的所述CGroup中的進程ID進行匹配,以確定所述CGroup中OOM分?jǐn)?shù)較大的進程;
[0044] 步驟S104:將匹配到的該CGroup中的進程ID作為告警信息進行通知。
[0045] 在一些實施例中,首先可以打印日期和內(nèi)存總體情況,例如使用date命令格式化輸出系統(tǒng)時間,使用free命令顯示系統(tǒng)內(nèi)存的整體使用情況。
[0046] 在一些實施例中,所述周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù)包括:查看memory.usage_in_bytes文件以及memory.limit_in_bytes文件,以分別查看并記錄所述CGroup已用的內(nèi)存和所述CGroup限制的內(nèi)存額度。
[0047] 在一些實施例中,在Linux系統(tǒng)中,/sys/fs/cgroup/memory/目錄是一顆CGroup樹,該目錄下的所有子目錄形成了CGroup樹上的結(jié)點。通過遞歸函數(shù),遍歷所有子CGroup樹,即遍歷所有子目錄。在每個CGroup下,查看以下文件的內(nèi)容:memory.usage_in_bytes,該文件顯示當(dāng)前CGroup已用的內(nèi)存;memory.limit_in_bytes,該文件顯示當(dāng)前CGroup限制的內(nèi)存額度;memory.failcnt,該文件顯示內(nèi)存使用量達到限制值的次數(shù)。
[0048] 對比當(dāng)前CGroup已使用的內(nèi)存和內(nèi)存額度,已使用的內(nèi)存越接近于內(nèi)存額度,那么CGroup發(fā)生OOM的
風(fēng)險就越大。當(dāng)CGroup內(nèi)的進程
申請內(nèi)存時,如果CGroup內(nèi)的內(nèi)存耗盡,那么memory.failcnt的值就加1。所以當(dāng)memory.failcnt的值增大時,表示CGroup內(nèi)存分配不足,需要考慮增大CGroup內(nèi)存。監(jiān)控腳本每隔一定時間(由用戶設(shè)置,默認(rèn)5秒),就會執(zhí)行一次遍歷操作,這稱為一個周期。在每次查看memory.failcnt的值時,對比上一個周期的值,如果值有增大,那么說明CGroup內(nèi)存分配不足,該CGroup有內(nèi)存溢出風(fēng)險,那么該CGroup的信息就會被記錄下來。
[0049] 在一些實施例中,所述響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程包括:使用ps命令,循環(huán)打印所述CGroup中的每個進程的所屬用戶、進程ID、父進程ID以及進程執(zhí)行的指令。
[0050] 每個CGroup內(nèi)的cgroup.proc文件記錄了當(dāng)前CGroup內(nèi)的所有進程的pid,在每個有內(nèi)存溢出風(fēng)險的CGroup內(nèi)部,通過cgroup.proc文件循環(huán)打印CGroup內(nèi)所有正在運行的進程。使用ps命令,循環(huán)打印每個進程的user(所屬用戶)、pid(進程id)、ppid(父進程id)、cmd(進程執(zhí)行的指令)。這些打印信息,有助于開發(fā)人員了解進程和內(nèi)存的關(guān)系,當(dāng)CGroup內(nèi)存溢出觸發(fā)OOM(Out?Of?Memory,內(nèi)存不足)時,能夠快速找到內(nèi)存占用過大的進程。
[0051] 當(dāng)CGroup因為內(nèi)存不足發(fā)生OOM時,oom?killer(發(fā)生OOM后內(nèi)核的處理程序)會對每個進程打分,然后選擇分值最高的進程殺死。進程的oom_score是打分時的主要參考值,oom_score的分?jǐn)?shù)越高就越會被內(nèi)核優(yōu)先殺掉。
[0052] 在一些實施例中,所述按照OOM分?jǐn)?shù)(oom_score)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件包括:使用正則表達式匹配所述OOM分?jǐn)?shù)值最大的10個進程的目錄文件。
[0053] 在一些實施例中,在/proc目錄下,使用正則表達式匹配形如/proc/[0-9]+形式的目錄文件(這個目錄文件名就是進程ID)。每個目錄文件都記錄了一個進程的詳細(xì)信息。在每個目錄里,打印名為oom_score的文件的內(nèi)容,該文件會輸出進程oom_score的分?jǐn)?shù)。按照oom_score從大到小的次序選出10個進程,如果上述memory.failcnt值有增大的CGroup中,某個進程屬于這10個進程(通過進程ID匹配),那就把該進程的oom_score打印出來。
[0054] 在一些實施例中,所述將匹配到的該CGroup中的進程ID作為告警信息進行通知包括:通過簡單網(wǎng)絡(luò)管理協(xié)議將匹配到的該CGroup中的進程ID以及打印的其他相關(guān)信息作為告警信息進行通知。
[0055] 在一些實施例中,所述將匹配到的該CGroup中的進程ID作為告警信息進行通知還包括:將所述匹配到的CGroup限制的內(nèi)存額度和所述CGroup已用的內(nèi)存信息作為告警信息進行通知。
[0056] 簡單網(wǎng)絡(luò)管理協(xié)議(SNMP)是TCP/IP協(xié)議簇的一個應(yīng)用層協(xié)議,主要用于網(wǎng)絡(luò)設(shè)備的管理。在上述步驟中,如圖2所示,如果當(dāng)內(nèi)存有溢出風(fēng)險時,內(nèi)存監(jiān)控程序會打印CGroup的詳細(xì)信息和進程的詳細(xì)信息(如果內(nèi)存沒有溢出風(fēng)險,那么就不會產(chǎn)生告警信息,該步驟將不會執(zhí)行),即所述確定的CGroup中OOM分?jǐn)?shù)較大的進程ID以及其他相關(guān)信息。這些內(nèi)存和進程相關(guān)的詳細(xì)信息,一方面會被輸入到本地日志文件保存起來,另一方面會作為snmp報文的數(shù)據(jù)部分。內(nèi)存監(jiān)控程序根據(jù)開發(fā)者提前設(shè)定好的snmp報文發(fā)送地址和團體字等snmp配置項,和snmp報文的數(shù)據(jù)部分一起組成snmp?trap報文。隨后,監(jiān)控程序?qū)nmp?trap報文發(fā)送至目的地址,一般是開發(fā)者自己的網(wǎng)絡(luò)設(shè)備。這樣,當(dāng)系統(tǒng)內(nèi)存一旦有溢出風(fēng)險,開發(fā)者就會收到告警信息。
[0057] 在技術(shù)上可行的情況下,以上針對不同實施例所列舉的技術(shù)特征可以相互組合,或者改變、添加以及省略等等,從而形成本發(fā)明范圍內(nèi)的另外實施例。
[0058] 從上述實施例可以看出,本發(fā)明實施例提供的一種基于CGroup的內(nèi)存監(jiān)控方法能夠詳細(xì)記錄Linux內(nèi)存的使用情況,容易被定位和解決目標(biāo)程序運行過程中發(fā)生的內(nèi)存有關(guān)錯誤,比如CGroup內(nèi)存溢出問題,有利于調(diào)試程序、監(jiān)控系統(tǒng)狀態(tài),幫助定位和解決程序開發(fā)過程中出現(xiàn)的內(nèi)存有關(guān)的問題。
[0059] 基于上述目的,本發(fā)明實施例的另一個方面,提出了一種基于CGroup的內(nèi)存監(jiān)控裝置包括:
[0060] 至少一個處理器;和
[0061] 存儲器,所述存儲器存儲有處理器可運行的程序代碼,所述程序代碼在被處理器運行時實施以下步驟:
[0062] 周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù);
[0063] 響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程;
[0064] 按照OOM分?jǐn)?shù)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件,并將所述選出的進程ID與所述打印的所述CGroup中的進程ID進行匹配,以確定所述CGroup中OOM分?jǐn)?shù)較大的進程;
[0065] 將匹配到的該CGroup中的進程ID作為告警信息進行通知。
[0066] 在一些實施例中,所述周期性遍歷所有子CGroup樹,查看每個CGroup的memory.failcnt文件,并記錄所述文件中記錄的內(nèi)存使用量達到限制值的次數(shù)還包括:查看memory.usage_in_bytes文件以及memory.limit_in_bytes文件,以分別查看并記錄所述CGroup已用的內(nèi)存和所述CGroup限制的內(nèi)存額度。
[0067] 在一些實施例中,所述響應(yīng)于其中一個CGroup的所述記錄的內(nèi)存使用量達到限制值的次數(shù)較上一次記錄的次數(shù)有增大,則查看所述CGroup的cgroup.proc文件,以循環(huán)打印所述CGroup內(nèi)所有正在運行的進程包括:使用ps命令,循環(huán)打印所述CGroup中的每個進程的所屬用戶、進程ID、父進程ID以及進程執(zhí)行的指令。
[0068] 在一些實施例中,所述按照OOM分?jǐn)?shù)從大到小的次序選出OOM分?jǐn)?shù)最高的多個進程的目錄文件包括:使用正則表達式匹配所述OOM分?jǐn)?shù)值最大的10個進程的目錄文件。
[0069] 如圖3所示,為本發(fā)明提供的基于CGroup的內(nèi)存監(jiān)控裝置的一個實施例的硬件結(jié)構(gòu)示意圖。
[0070] 以如圖3所示的計算機設(shè)備為例,在該計算機設(shè)備中包括處理器301以及存儲器302,并還可以包括:輸入裝置303和輸出裝置304。
[0071] 處理器301、存儲器302、輸入裝置303和輸出裝置304可以通過總線或者其他方式連接,圖3中以通過總線連接為例。
[0072] 存儲器302作為一種非易失性計算機可讀存儲介質(zhì),可用于存儲非易失性
軟件程序、非易失性計算機可執(zhí)行程序以及模
塊,如本申請實施例中的所述基于CGroup的內(nèi)存監(jiān)控方法對應(yīng)的程序指令/模塊。處理器301通過運行存儲在存儲器302中的非易失性軟件程序、指令以及模塊,從而執(zhí)行
服務(wù)器的各種功能應(yīng)用以及
數(shù)據(jù)處理,即實現(xiàn)上述方法實施例的基于CGroup的內(nèi)存監(jiān)控方法。
[0073] 存儲器302可以包括存儲程序區(qū)和存儲數(shù)據(jù)區(qū),其中,存儲程序區(qū)可存儲操作系統(tǒng)、至少一個功能所需要的應(yīng)用程序;存儲數(shù)據(jù)區(qū)可存儲根據(jù)基于CGroup的內(nèi)存監(jiān)控方法所創(chuàng)建的數(shù)據(jù)等。此外,存儲器302可以包括高速
隨機存取存儲器,還可以包括
非易失性存儲器,例如至少一個磁盤存儲器件、閃存器件、或其他非易失性固態(tài)存儲器件。在一些實施例中,存儲器302可選包括相對于處理器301遠(yuǎn)程設(shè)置的存儲器,這些遠(yuǎn)程存儲器可以通過網(wǎng)絡(luò)連接至本地模塊。上述網(wǎng)絡(luò)的實例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動通信網(wǎng)及其組合。
[0074] 輸入裝置303可接收輸入的數(shù)字或字符信息,以及產(chǎn)生與基于CGroup的內(nèi)存監(jiān)控方法的計算機設(shè)備的用戶設(shè)置以及功能控制有關(guān)的鍵
信號輸入。輸出裝置304可包括顯示屏等顯示設(shè)備。
[0075] 所述一個或者多個基于CGroup的內(nèi)存監(jiān)控方法對應(yīng)的程序指令/模塊存儲在所述存儲器302中,當(dāng)被所述處理器301執(zhí)行時,執(zhí)行上述任意方法實施例中的基于CGroup的內(nèi)存監(jiān)控方法。
[0076] 所述執(zhí)行所述基于CGroup的內(nèi)存監(jiān)控方法的計算機設(shè)備的任何一個實施例,可以達到與之對應(yīng)的前述任意方法實施例相同或者相類似的效果。
[0077] 最后需要說明的是,本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,可以通過
計算機程序來指令相關(guān)硬件來完成,所述的程序可存儲于計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(ROM)或隨機存儲記憶體(RAM)等。
[0078] 此外,典型地,本發(fā)明實施例公開所述的裝置、設(shè)備等可為各種
電子終端設(shè)備,例如手機、
個人數(shù)字助理(PDA)、
平板電腦(PAD)、智能電視等,也可以是大型終端設(shè)備,如服務(wù)器等,因此本發(fā)明實施例公開的保護范圍不應(yīng)限定為某種特定類型的裝置、設(shè)備。本發(fā)明實施例公開所述的客戶端可以是以電子硬件、計算機軟件或兩者的組合形式應(yīng)用于上述任意一種電子終端設(shè)備中。
[0079] 此外,根據(jù)本發(fā)明實施例公開的方法還可以被實現(xiàn)為由CPU執(zhí)行的計算機程序,該計算機程序可以存儲在計算機可讀存儲介質(zhì)中。在該計算機程序被CPU執(zhí)行時,執(zhí)行本發(fā)明實施例公開的方法中限定的上述功能。
[0080] 此外,上述方法步驟以及系統(tǒng)單元也可以利用
控制器以及用于存儲使得控制器實現(xiàn)上述步驟或單元功能的計算機程序的計算機可讀存儲介質(zhì)實現(xiàn)。
[0081] 此外,應(yīng)該明白的是,本文所述的計算機可讀存儲介質(zhì)(例如,存儲器)可以是易失性存儲器或非易失性存儲器,或者可以包括易失性存儲器和非易失性存儲器兩者。作為例子而非限制性的,非易失性存儲器可以包括
只讀存儲器(ROM)、可編程ROM(PROM)、電可編程ROM(EPROM)、電可擦寫可編程ROM(EEPROM)或快閃存儲器。易失性存儲器可以包括隨機存取存儲器(RAM),該RAM可以充當(dāng)外部高速緩存存儲器。作為例子而非限制性的,RAM可以以多種形式獲得,比如同步RAM(DRAM)、動態(tài)RAM(DRAM)、同步DRAM(SDRAM)、雙
數(shù)據(jù)速率SDRAM(DDR?SDRAM)、增強SDRAM(ESDRAM)、同步鏈路DRAM(SLDRAM)、以及直接Rambus?RAM(DRRAM)。所公開的方面的存儲設(shè)備意在包括但不限于這些和其它合適類型的存儲器。
[0082] 本領(lǐng)域技術(shù)人員還將明白的是,結(jié)合這里的公開所描述的各種示例性邏輯塊、模塊、
電路和
算法步驟可以被實現(xiàn)為電子硬件、計算機軟件或兩者的組合。為了清楚地說明硬件和軟件的這種可互換性,已經(jīng)就各種示意性組件、方塊、模塊、電路和步驟的功能對其進行了一般性的描述。這種功能是被實現(xiàn)為軟件還是被實現(xiàn)為硬件取決于具體應(yīng)用以及施加給整個系統(tǒng)的設(shè)計約束。本領(lǐng)域技術(shù)人員可以針對每種具體應(yīng)用以各種方式來實現(xiàn)所述的功能,但是這種實現(xiàn)決定不應(yīng)被解釋為導(dǎo)致脫離本發(fā)明實施例公開的范圍。
[0083] 結(jié)合這里的公開所描述的各種示例性邏輯塊、模塊和電路可以利用被設(shè)計成用于執(zhí)行這里所述功能的下列部件來實現(xiàn)或執(zhí)行:通用處理器、
數(shù)字信號處理器(DSP)、
專用集成電路(ASIC)、現(xiàn)場可編程
門陣列(FPGA)或其它
可編程邏輯器件、分立門或晶體管邏輯、分立的硬件組件或者這些部件的任何組合。通用處理器可以是
微處理器,但是可替換地,處理器可以是任何傳統(tǒng)處理器、控制器、
微控制器或狀態(tài)機。處理器也可以被實現(xiàn)為計算設(shè)備的組合,例如,DSP和微處理器的組合、多個微處理器、一個或多個微處理器結(jié)合DSP和/或任何其它這種配置。
[0084] 結(jié)合這里的公開所描述的方法或算法的步驟可以直接包含在硬件中、由處理器執(zhí)行的
軟件模塊中或這兩者的組合中。軟件模塊可以駐留在RAM存儲器、快閃存儲器、ROM存儲器、EPROM存儲器、EEPROM存儲器、寄存器、
硬盤、可移動盤、CD-ROM、或本領(lǐng)域已知的任何其它形式的存儲介質(zhì)中。示例性的存儲介質(zhì)被耦合到處理器,使得處理器能夠從該存儲介質(zhì)中讀取信息或向該存儲介質(zhì)寫入信息。在一個替換方案中,所述存儲介質(zhì)可以與處理器集成在一起。處理器和存儲介質(zhì)可以駐留在ASIC中。ASIC可以駐留在用戶終端中。在一個替換方案中,處理器和存儲介質(zhì)可以作為分立組件駐留在用戶終端中。
[0085] 在一個或多個示例性設(shè)計中,所述功能可以在硬件、軟件、
固件或其任意組合中實現(xiàn)。如果在軟件中實現(xiàn),則可以將所述功能作為一個或多個指令或代碼存儲在計算機可讀介質(zhì)上或通過計算機可讀介質(zhì)來傳送。計算機可讀介質(zhì)包括計算機存儲介質(zhì)和通信介質(zhì),該通信介質(zhì)包括有助于將計算機程序從一個
位置傳送到另一個位置的任何介質(zhì)。存儲介質(zhì)可以是能夠被通用或?qū)S糜嬎銠C
訪問的任何可用介質(zhì)。作為例子而非限制性的,該計算機可讀介質(zhì)可以包括RAM、ROM、EEPROM、CD-ROM或其它光盤存儲設(shè)備、磁盤存儲設(shè)備或其它
磁性存儲設(shè)備,或者是可以用于攜帶或存儲形式為指令或數(shù)據(jù)結(jié)構(gòu)的所需程序代碼并且能夠被通用或?qū)S糜嬎銠C或者通用或?qū)S锰幚砥髟L問的任何其它介質(zhì)。此外,任何連接都可以適當(dāng)?shù)胤Q為計算機可讀介質(zhì)。例如,如果使用同軸線纜、光纖線纜、雙絞線、數(shù)字用戶線路(DSL)或諸如紅外線、無線電和
微波的無線技術(shù)來從
網(wǎng)站、服務(wù)器或其它遠(yuǎn)程源發(fā)送軟件,則上述同軸線纜、光纖線纜、雙絞線、DSL或諸如紅外線、無線電和微波的無線技術(shù)均包括在介質(zhì)的定義。如這里所使用的,磁盤和光盤包括壓縮盤(CD)、激光盤、光盤、數(shù)字多功能盤(DVD)、
軟盤、藍光盤,其中磁盤通常磁性地再現(xiàn)數(shù)據(jù),而光盤利用激光光學(xué)地再現(xiàn)數(shù)據(jù)。上述內(nèi)容的組合也應(yīng)當(dāng)包括在計算機可讀介質(zhì)的范圍內(nèi)。
[0086] 應(yīng)當(dāng)理解的是,在本文中使用的,除非上下文清楚地支持例外情況,單數(shù)形式“一個”旨在也包括復(fù)數(shù)形式。還應(yīng)當(dāng)理解的是,在本文中使用的“和/或”是指包括一個或者一個以上相關(guān)聯(lián)地列出的項目的任意和所有可能組合。
[0087] 上述本發(fā)明實施例公開實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
[0088] 本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計算機可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器、磁盤或光盤等。
[0089] 上述實施例是實施方式的可能示例,并且僅僅為了清楚理解本發(fā)明的原理而提出。所屬領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:以上任何實施例的討論僅為示例性的,并非旨在暗示本發(fā)明實施例公開的范圍(包括
權(quán)利要求)被限于這些例子;在本發(fā)明實施例的思路下,以上實施例或者不同實施例中的技術(shù)特征之間也可以進行組合,并存在如上所述的本發(fā)明實施例的不同方面的許多其它變化,為了簡明它們沒有在細(xì)節(jié)中提供。因此,凡在本發(fā)明實施例的精神和原則之內(nèi),所做的任何省略、修改、等同替換、改進等,均應(yīng)包含在本發(fā)明實施例的保護范圍之內(nèi)。