用于控制計算機(jī)系統(tǒng)上硬件資源使用情況的方法、系統(tǒng)以及可執(zhí)行代碼段的制作方法
【專利摘要】本發(fā)明涉及一種利用可插入到應(yīng)用程序的進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API)。方法包括:將API服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù);攔截從處理器到API服務(wù)的調(diào)用;并且基于進(jìn)程對API服務(wù)的調(diào)用的攔截,作用于屬于該進(jìn)程的軟件實體。
【專利說明】用于控制計算機(jī)系統(tǒng)上硬件資源使用情況的方法、系統(tǒng)以及可執(zhí)行代碼段
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種利用可插入到應(yīng)用程序的進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API)。
[0002]本發(fā)明還涉及適于實現(xiàn)該方法的系統(tǒng)和可執(zhí)行代碼段。
【背景技術(shù)】
[0003]眾所周知,近些年來計算機(jī)無論是在軟件還是在硬件上的發(fā)展從未停止。
[0004]在硬件水平上,例如處理器越來越快并且融入了新的發(fā)展,而易失性和非易失性內(nèi)存也具有越來越大的存儲能力。
[0005]類似的,在軟件水平上,應(yīng)用程序(例如操作系統(tǒng)、辦公或者計算機(jī)輔助畫圖應(yīng)用程序,或游戲)變得越來越強大,并且可以實現(xiàn)更多的功能,這些在幾年前是意想不到的。
[0006]當(dāng)用戶計算機(jī)系統(tǒng)硬件資源的性質(zhì)與同其共同作用的軟件的硬件需求失去平衡時,現(xiàn)有情形的主要缺陷就變得明顯。到目前,軟件是否以這樣快的速度發(fā)展,由于程序員意識到他們可以得到越來越多的硬件資源,或者硬件是否有必要發(fā)展,從而滿足不同軟件執(zhí)行的日益增長的需求,尚無定論。如果待使用的軟件的硬件需求等于或者高于用戶計算機(jī)系統(tǒng)的資源性質(zhì),這種操作問題就會清楚而明顯。此外,必須清楚,某一軟件的硬件需求是考慮所述軟件在計算機(jī)系統(tǒng)中單獨執(zhí)行而得出的,但是這種情況很少發(fā)生,因為在后臺至少完全有可能有軟件在執(zhí)行,很明顯,它們也要消耗系統(tǒng)的硬件資源(例如殺毒、防火墻或者備份軟件)。
[0007]比較明確的是,軟件程序員不習(xí)慣去考慮大多數(shù)用戶計算機(jī)系統(tǒng)不具有最先進(jìn)的硬件資源,以及每一個新的軟件或者每一個已經(jīng)存在的軟件的更新都迫使用戶去更新這些硬件資源,甚至需要購買新的計算機(jī)系統(tǒng),從而至少可以執(zhí)行該軟件并獲得適當(dāng)?shù)能浖?zhí)行效果。所有這些最終會給用戶帶來高昂的經(jīng)濟(jì)成本,不僅有獲取軟件的成本,還包括系統(tǒng)硬件資源更新的成本。
[0008]這些問題也出現(xiàn)在服務(wù)器類型(應(yīng)用程序服務(wù)器、數(shù)據(jù)服務(wù)器等)的計算機(jī)系統(tǒng)中。如果沒有提前實現(xiàn)硬件更新的話,服務(wù)器軟件(例如在更新之后)的硬件需求的增加會導(dǎo)致在那一刻前還在管理所有用戶的服務(wù)器不能再為所有的用戶提供服務(wù)。類似地,如果服務(wù)器是應(yīng)用程序服務(wù)器的話,例如它管理的應(yīng)用程序的數(shù)量必須減少,從而可以為同樣數(shù)量的用戶提供服務(wù)。需要重要指出的是,由于服務(wù)器類型的計算機(jī)的硬件資源具有更高的成本,因此服務(wù)器類型的系統(tǒng)更新硬件資源的成本甚至要比上述情形的更新成本更高。
[0009]另一方面,具有給定硬件資源的計算機(jī)系統(tǒng),想要在其上執(zhí)行更多數(shù)量的理論上會執(zhí)行的應(yīng)用程序以及/或者同一應(yīng)用程序的實例,也會出現(xiàn)這種情況。在這種情況下,硬件資源沒有改變,因此,有必要使應(yīng)用程序以及/或者同一應(yīng)用程序上的不同實例的執(zhí)行減少對它們所使用的硬件資源的消耗。
[0010]當(dāng)操作系統(tǒng)執(zhí)行時,上述任何一種情形中的操作系統(tǒng)都不能有效地控制運行應(yīng)用程序以及/或者同一應(yīng)用程序的實例的硬件資源的使用,因此,需要一種實現(xiàn)該目的的工具。
【發(fā)明內(nèi)容】
[0011]因此,本發(fā)明的目的在于利用適于插入到屬于應(yīng)用程序的進(jìn)程中間的可執(zhí)行代碼段,提供一種控制正在運行的應(yīng)用程序?qū)τ布Y源的使用情況的方法,該方法可以提高執(zhí)行應(yīng)用程序的計算機(jī)系統(tǒng)的效率。
[0012]該目的通過提供一種利用可以插入到應(yīng)用程序中的進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)中執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法實現(xiàn),所述操作系統(tǒng)包括至少一個在計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API),方法包括:
[0013]-攔截屬于該應(yīng)用程序的進(jìn)程對API服務(wù)的調(diào)用;
[0014]-基于攔截進(jìn)程對API服務(wù)的調(diào)用,作用于正在執(zhí)行的進(jìn)程的軟件實體。
[0015]因此,利用插入到進(jìn)程中的可執(zhí)行代碼段,執(zhí)行中的應(yīng)用程序和操作系統(tǒng)間的通信(控制信號和數(shù)據(jù)通信)被攔截,從而代碼段在操作系統(tǒng)的上層執(zhí)行,并且可以管理或控制屬于該進(jìn)程的軟件實體并且通過其減少對硬件資源的使用。
[0016]基本上,插入到屬于該應(yīng)用程序的進(jìn)程內(nèi)的可執(zhí)行代碼段提供了,通過在計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序控制該計算機(jī)系統(tǒng)上的硬件資源的使用情況的信息。顯然,由該代碼段執(zhí)行的控制可以減少硬件資源的應(yīng)用,但總是保持最低的服務(wù)質(zhì)量。
[0017]由于上述原因,降低應(yīng)用程序?qū)τ布Y源的使用可以使這些資源被其他應(yīng)用程序(或者同一應(yīng)用程序的若干實例)使用,從而計算機(jī)系統(tǒng)中可以有更多的應(yīng)用程序同時執(zhí)行,提聞了操作系統(tǒng)的效率。
[0018]類似地,降低應(yīng)用程序硬件資源的使用可能會使應(yīng)用程序執(zhí)行的硬件需求大于計算機(jī)系統(tǒng)所提供的硬件資源應(yīng)用程序。
[0019]需要重要指出的是,表述“服務(wù)”、“API”或者“軟件實體”分別指代至少一個服務(wù)、至少一個API,以及/或者至少一個軟件資源。因此,例如可以將同一 API的兩個服務(wù)重定向到兩個包含在同一代碼段的服務(wù)中去,或者將第一 API的服務(wù)重定向到包含在該代碼段中的第一服務(wù)以及將第二 API的服務(wù)重定向到包含在該代碼段中的第二服務(wù)。同樣地,根據(jù)重定向服務(wù),該段代碼可能作用于一個或多個軟件實體,如執(zhí)行線程、內(nèi)存或互斥鎖。
[0020]以一種方式將可執(zhí)行代碼段插入到進(jìn)程已經(jīng)被描述過,如在[“WindowsNT System-CalI Hooking”,Mark Russinovich and Bryce Cogswel1,Dr.Dobb’ sJournal, January 1997]中。
[0021]需要重要指出的是,代碼段可以插入到進(jìn)程中,而該進(jìn)程從休眠狀態(tài)啟動,這可以確保代碼段正確運行。在這種情況下,該方法包括喚醒處于休眠狀態(tài)的進(jìn)程的執(zhí)行的步驟。
[0022]另一方面,需要重要指出的一點是,術(shù)語“攔截”應(yīng)該理解為從進(jìn)程到API服務(wù)接口的呼叫重定向到包含在該代碼段中的服務(wù),從而代碼段本身可以控制或者執(zhí)行屬于該進(jìn)程的軟件實體,從而通過該應(yīng)用程序控制資源的使用。
[0023]此外,該方法包括將API服務(wù)重定向到包含在代碼段的相對應(yīng)的服務(wù),從而當(dāng)進(jìn)程呼叫API服務(wù)時,以透明的方式呼叫包含在代碼段的相對應(yīng)的服務(wù)。
[0024]根據(jù)本發(fā)明優(yōu)選實施例,該API服務(wù)可以是函數(shù),并且將API服務(wù)重定向到包含在代碼段內(nèi)的相對應(yīng)的服務(wù)這一步驟包括:
[0025]■將包含待重定向的API的函數(shù)的動態(tài)鏈接庫加載到內(nèi)存中;
[0026]■在包含在裝載的動態(tài)鏈接庫中的API函數(shù)的函數(shù)指針表中,將存儲待重定向的API函數(shù)的初始內(nèi)存地址替換為存儲包含在代碼段中的對應(yīng)函數(shù)的初始內(nèi)存地址中。
[0027]因此每個API的一個或多個函數(shù)被重定向到包含在代碼段的函數(shù)中,從而后者可以通過作用于軟件實體,例如執(zhí)行線程、內(nèi)存或互斥鎖(也稱為鎖)等,攔截進(jìn)程對這些函數(shù)的調(diào)用,進(jìn)而控制對涉及執(zhí)行的硬件資源的使用。
[0028]將API服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù)這一步驟優(yōu)選包括:將存儲重定向的API的函數(shù)的初始內(nèi)存地址存儲在第一變量中。因此,如果在應(yīng)用程序執(zhí)行過程中有必要,有可能從可執(zhí)行代碼段自身調(diào)用API的函數(shù)(即初始函數(shù))。
[0029]根據(jù)本發(fā)明另一優(yōu)選實施例,該API服務(wù)可以是對象方法,并且將API服務(wù)重定向到包含在代碼段內(nèi)的相對應(yīng)的服務(wù)這一步驟包括:
[0030]■將包含重定向?qū)ο蠓椒ǖ膭討B(tài)鏈接庫裝載到內(nèi)存中;
[0031]■驗證與待重定向的方法相關(guān)的對象是否是第一次創(chuàng)建;
[0032]■如果驗證結(jié)果為是,
[0033]?在包含在裝載的動態(tài)鏈接庫中的對象方法的方法指針表中,將存儲待重定向的對象方法的初始內(nèi)存地址替換為存儲包含在代碼段中的對應(yīng)方法的初始內(nèi)存地址中。
[0034]同函數(shù)一樣,同樣有可能將一個或多個屬于對象的方法重定向到包含在代碼段中的一個或多個方法,從而后者可以攔截進(jìn)程對這些方法的調(diào)用,進(jìn)而控制對涉及執(zhí)行的硬件資源的使用。
[0035]如上文所討論的,既然有可能重定向至少一個API的至少一個服務(wù),就有可能其中一個服務(wù)是函數(shù),而另一個服務(wù)是方法,從而上述兩個實施例在同一個正在執(zhí)行的應(yīng)用程序中可以互為補充。
[0036]將API服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù)這一步驟還優(yōu)選地包括:將存儲待重定向的對象方法的初始內(nèi)存地址存儲在第一變量,從而根據(jù)需要,可以從代碼段本身調(diào)用該方法(即初始方法)。
[0037]根據(jù)本發(fā)明一實施例,API服務(wù)可以是與屬于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在創(chuàng)建一個新的執(zhí)行線程;軟件實體可以是執(zhí)行線程;并且攔截進(jìn)程對API服務(wù)的調(diào)用可包括:
[0038]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程;
[0039]■基于包含在代碼段中的對應(yīng)服務(wù)生成新的執(zhí)行線程;
[0040]■保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符由第二變量生成,該變量維持創(chuàng)建的執(zhí)行線程的寄存器。
[0041]根據(jù)本發(fā)明另一實施例,API服務(wù)可以是與屬于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在創(chuàng)建一個新的執(zhí)行線程;軟件實體可以是執(zhí)行線程;并且攔截進(jìn)程對API服務(wù)的調(diào)用可包括:
[0042]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程;
[0043]■基于存儲在第一變量的初始內(nèi)存地址,調(diào)用API服務(wù);
[0044]■接收由API的函數(shù)產(chǎn)生的新的執(zhí)行線程的標(biāo)識符;
[0045]■保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符由第二變量生成,該變量維持創(chuàng)建的執(zhí)行線程的寄存器。
[0046]如果可能重定向不止一個與執(zhí)行線程類型的軟件實體相關(guān)的服務(wù),上述描述的兩個實施例都不是二選其一的,而是可以互為補充的。
[0047]更具體地,在描述的第一個實施例中,生成新執(zhí)行線程的服務(wù)包含在代碼段本身,而在第二個實施例中,生成新執(zhí)行線程的服務(wù)不包括在代碼段中,并且有必要調(diào)用應(yīng)用程序服務(wù)的初始服務(wù),從而成功地產(chǎn)生執(zhí)行線程。為了達(dá)到該目的,必須已經(jīng)將上述API服務(wù)(即初始服務(wù))的內(nèi)存地址存儲在第一變量中。盡管存在上文描述,不管執(zhí)行什么實施例,代碼段管理創(chuàng)建的新執(zhí)行線程的識別符,將其存儲在用于維持創(chuàng)建的執(zhí)行線程的寄存器的變量中。
[0048]如果軟件實體為執(zhí)行線程,則基于攔截的進(jìn)程對API服務(wù)的調(diào)用,在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的步驟包括:
[0049]■確定正在執(zhí)行的應(yīng)用程序的消耗值(yield value);
[0050]■檢驗應(yīng)用程序的消耗值是否超出閾值;
[0051]■如果超出閾值,基于存儲在第二變量中的標(biāo)識符,將執(zhí)行線程暫停一預(yù)設(shè)時間,其中該變量維持創(chuàng)建的執(zhí)行線程的寄存器。
[0052]既然代碼段管理執(zhí)行線程的標(biāo)識符,如果代碼段(更具體地,包含在代碼段內(nèi)的算法)檢測到應(yīng)用程序的消耗量(yield)超出了閾值(即,如果應(yīng)用程序的執(zhí)行消耗了太多的資源或者不必要的資源),代碼段會基于存儲在第二變量的執(zhí)行線程的標(biāo)識符,暫停執(zhí)行直到那一刻創(chuàng)建的線程的執(zhí)行,這意味著線程段可以控制由應(yīng)用程序消耗的硬件資源的使用。
[0053]基于對應(yīng)用程序硬件資源的使用來確定正在執(zhí)行的應(yīng)用程序的消耗量的步驟包括:
[0054]?構(gòu)建API服務(wù)作為控制點,當(dāng)進(jìn)程執(zhí)行時,會反復(fù)調(diào)用該API服務(wù);
[0055]?確定進(jìn)程第一次調(diào)用和第二次調(diào)用該服務(wù)的時間間隔;
[0056]?基于確定的時間,得到正在執(zhí)行的應(yīng)用程序的消耗值。
[0057]可以通過FPS (每秒幀數(shù))度量測量第一次調(diào)用和第二次調(diào)用作為控制點的服務(wù)的時間間隔。
[0058]另一方面,任何可以測量維持獲得消耗與維持理想消耗所需要的執(zhí)行時間的差異的算法都可以用于確定執(zhí)行線程必須暫停的時間。該算法可以包含在代碼段中,盡管也可以使該代碼段調(diào)用外部算法。
[0059]如果軟件實體涉及內(nèi)存并且API服務(wù)為意在預(yù)留存儲區(qū)域的服務(wù),則攔截進(jìn)程對API服務(wù)的調(diào)用這一步驟包括:
[0060]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于預(yù)留存儲區(qū)域;
[0061]此外,在這種情況下,基于攔截進(jìn)程對API服務(wù)的調(diào)用,在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的步驟包括:
[0062]■預(yù)留共享存儲區(qū)域。
[0063]因此,當(dāng)進(jìn)程調(diào)用用于預(yù)留存儲空間的API服務(wù)時,該調(diào)用被攔截(即調(diào)用被重定向到包含在代碼段內(nèi)的對應(yīng)服務(wù))并且意在被同一應(yīng)用程序的不同實例共享的存儲區(qū)域被分配。
[0064]下文詳細(xì)描述了在應(yīng)用程序執(zhí)行時,當(dāng)軟件實體為內(nèi)存時,代碼段是如何控制硬件資源的。
[0065]例如如果應(yīng)用程序執(zhí)行需要I千兆字節(jié)的內(nèi)存,則該應(yīng)用程序的第二實例的執(zhí)行還需要I千兆字節(jié),即兩個實例的執(zhí)行總共需要消耗2千兆字節(jié)的內(nèi)存。如果將本發(fā)明的可執(zhí)行代碼段對象插入到應(yīng)用程序的兩個實例中,由于為正在執(zhí)行的不同的實例分配了共享內(nèi)存區(qū)域,內(nèi)存消耗會小于2千兆字節(jié)。就這一點而言,有必要說明一點,由于在某些存儲區(qū)域存在的信息一定不能被應(yīng)用程序的其他實例修改,大多數(shù)情況下應(yīng)用程序的每個示例不可能共享整個內(nèi)存(在本示例中I千兆字節(jié))。因此,在分配內(nèi)存區(qū)域之前,必須識別出因包含有每個實例的信息特征而不能修改的存儲區(qū)域。
[0066]另一方面,由進(jìn)程對包含在代碼段中的對應(yīng)服務(wù)的調(diào)用還有可能涉及從代碼段到意在預(yù)留存儲區(qū)域的初始API的函數(shù)的調(diào)用,該調(diào)用是在存儲在上述第一變量的內(nèi)存地址的基礎(chǔ)上執(zhí)行的。
[0067]另一方面,如果軟件實體為鎖或者互斥鎖,并且如果API服務(wù)為意在干預(yù)互斥鎖的服務(wù),則攔截進(jìn)程對API服務(wù)的調(diào)用這一步驟包括:
[0068]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于干預(yù)互斥鎖;
[0069]在這種情況下,基于攔截進(jìn)程對API服務(wù)的調(diào)用,在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的步驟包括:
[0070]■修改分配給互斥鎖的名稱;
[0071]有些應(yīng)用程序(例如一些游戲)不允許在同一計算機(jī)系統(tǒng)上執(zhí)行多于一個應(yīng)用程序的實例。為了達(dá)到該目的,它們使用可為應(yīng)用程序的實例分配標(biāo)識符的鎖或者互斥鎖,并且在生成的所有的新實例接收到相同的標(biāo)識符的情況下,執(zhí)行多于一個實例是不可實現(xiàn)的。
[0072]鑒于這種情況,并如上文所述,當(dāng)進(jìn)程嘗試創(chuàng)建與應(yīng)用程序相關(guān)的互斥鎖并且調(diào)用包含在該代碼段的對應(yīng)服務(wù)時(意在執(zhí)行該行為的初始API服務(wù)的指針先前一定要重定向到包含在該代碼段的服務(wù)),該代碼段修改分配給該互斥鎖的標(biāo)識符,從而當(dāng)該應(yīng)用程序生成第二個實例,標(biāo)識符并未互相吻合,從而允許同步執(zhí)行。
[0073]根據(jù)本發(fā)明另一方面,提供了包含用于執(zhí)行上述控制計算機(jī)系統(tǒng)中硬件資源的方法的指令的可執(zhí)行代碼段;當(dāng)一應(yīng)用程序在包括至少一個在這一計算機(jī)系統(tǒng)中執(zhí)行的應(yīng)用程序編程接口(API)的操作系統(tǒng)上運行時,該可執(zhí)行代碼段適于插入到屬于該應(yīng)用程序的進(jìn)程中。
[0074]該可執(zhí)行代碼段可以存儲在物理存儲媒介上,如可記錄媒介、計算機(jī)內(nèi)存或只讀內(nèi)存,或者可以由載波實現(xiàn),如電或光載波。
[0075]此外,本發(fā)明提供了一種在計算機(jī)系統(tǒng)上執(zhí)行應(yīng)用程序的方法,該方法包括:
[0076]-在休眠狀態(tài)下,初始化與應(yīng)用程序相關(guān)的進(jìn)程的執(zhí)行;
[0077]-將上述可執(zhí)行代碼段插入到休眠狀態(tài)下的進(jìn)程中;
[0078]-執(zhí)行上述的,利用插入到進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API)。
[0079]因此,當(dāng)用戶請求執(zhí)行計算機(jī)系統(tǒng)上的應(yīng)用程序時,可以根據(jù)上述方法執(zhí)行該應(yīng)用程序,目的在于使該代碼段控制硬件資源。
[0080]根據(jù)本發(fā)明另一方法,提供了一種控制在操作系統(tǒng)中執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的系統(tǒng),所述操作系統(tǒng)包括至少一個在計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API),適于向該系統(tǒng)插入屬于該應(yīng)用程序的進(jìn)程,該系統(tǒng)包括:
[0081]-用于攔截從進(jìn)程到API服務(wù)的調(diào)用的計算機(jī)裝置;
[0082]-基于攔截進(jìn)程對API服務(wù)的調(diào)用,用于作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的計算機(jī)裝置。
[0083]根據(jù)另一方面,本發(fā)明提供了一種計算機(jī)系統(tǒng),應(yīng)用程序可以在該計算機(jī)系統(tǒng)上執(zhí)行,該系統(tǒng)包括內(nèi)存和處理器,可包括存儲在內(nèi)存中的處理器可執(zhí)行指令,其中該指令可包括以下功能:
[0084]-在休眠狀態(tài)下,初始化與應(yīng)用程序相關(guān)的進(jìn)程的執(zhí)行;
[0085]-將上述可執(zhí)行代碼段插入到休眠狀態(tài)下的進(jìn)程中;
[0086]-執(zhí)行上述的,利用插入到進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API)。
[0087]說明書和權(quán)利要求書通篇,用語“包括”及其變型不表示排除其他技術(shù)特征、補充、條目或步驟。本領(lǐng)域技術(shù)人員可以從部分說明書以及本發(fā)明部分實踐推斷出本發(fā)明進(jìn)一步的目的、優(yōu)勢以及特征。文中提供的示例和附圖僅作描述目的,它們不作為本發(fā)明的限制。權(quán)利要求中涉及附圖并且位于括號內(nèi)的附圖標(biāo)記只是為了進(jìn)一步理解該權(quán)利要求,不應(yīng)該理解為限制本發(fā)明的保護(hù)范圍。此外,本發(fā)明涉及此處描述的特別及優(yōu)選實施例的所有可能的組合。
【專利附圖】
【附圖說明】
[0088]為了更好地理解上文描述的內(nèi)容,用于圖示描述僅作為非限制性示例的實施例的附圖如下。
[0089]附圖中:
[0090]圖1所示為根據(jù)現(xiàn)有技術(shù)的計算機(jī)系統(tǒng)上的應(yīng)用程序執(zhí)行層的框圖;
[0091]圖2所示為根據(jù)本發(fā)明,計算機(jī)系統(tǒng)上應(yīng)用程序的執(zhí)行層,還包括代表插入到屬于該應(yīng)用程序的進(jìn)程的可執(zhí)行代碼段的層的框圖,該代碼段意在控制計算機(jī)系統(tǒng)中應(yīng)用程序?qū)τ布Y源的使用情況。
【具體實施方式】
[0092]下文將會描述根據(jù)本發(fā)明的用于控制計算機(jī)系統(tǒng)中應(yīng)用程序?qū)τ布Y源的使用情況的方法和可執(zhí)行代碼段,該應(yīng)用程序在操作系統(tǒng)中執(zhí)行,包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的應(yīng)用程序編程接口(API),該代碼段適于插入到與應(yīng)用程序相關(guān)的進(jìn)程中,該應(yīng)用程序的進(jìn)程起初為休眠狀態(tài)。
[0093]圖1所示為根據(jù)現(xiàn)有技術(shù),在計算機(jī)系統(tǒng)(例如個人計算機(jī)、服務(wù)器等)上的應(yīng)用程序(例如游戲)的執(zhí)行層的示意圖。
[0094]在該示意圖中,最底層10表示計算機(jī)系統(tǒng)的硬件資源,如微處理器(CPU)、內(nèi)存、圖形處理單元(GPU)、鍵盤或者鼠標(biāo)等。
[0095]在配置為更高級別的第二層11中設(shè)置操作系統(tǒng),該第二層11具有與最底層10的資源雙向通信和交互所需的驅(qū)動(能夠發(fā)送和/或接收與這些資源有關(guān)的信息,比如控制信號14或數(shù)據(jù)15)。
[0096]在表示操作系統(tǒng)的層11的上方配置的第三層12中,設(shè)置有應(yīng)用程序編程接口(更普遍地稱為API),既包括包含在操作系統(tǒng)中的API,還包括由于安裝最底層10的資源驅(qū)動而產(chǎn)生的API。不管使用什么操作系統(tǒng),這些API通常以動態(tài)鏈表庫的形式實現(xiàn)。包含API的層12和代表操作系統(tǒng)的層11之間的通信也是雙向通信,并且都能夠交換控制信號14和數(shù)據(jù)15。
[0097]最后,圖1還示出了第四層或最高層13,描述執(zhí)行中的應(yīng)用程序。在執(zhí)行過程中,該應(yīng)用程序?qū)Υ鞟PI的層12進(jìn)行訪問,交換控制信號和數(shù)據(jù)。
[0098]因此,根據(jù)該配置,例如如果正在執(zhí)行的應(yīng)用程序13需要在執(zhí)行該應(yīng)用程序的計算機(jī)系統(tǒng)的顯示屏上生成窗口,該應(yīng)用程序必須訪問某些用于生成窗口 API 12的服務(wù)(函數(shù)或方法)。為了能夠在屏幕上生成窗口,這些服務(wù)需要與操作系統(tǒng)11交換信息(控制信號和數(shù)據(jù)),該操作系統(tǒng)具有必需的工具(即驅(qū)動)用于與屏幕10通信,從而生成所需的窗□。
[0099]這些配置的主要的缺點在于根本沒有元件或工具可以高效或有效地管理正在被執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)的硬件資源的使用情況。在上述情況下,應(yīng)用程序使用其執(zhí)行所需的資源。
[0100]因此,本發(fā)明執(zhí)行一插入到該應(yīng)用程序相關(guān)的進(jìn)程中的可執(zhí)行代碼段,其中該進(jìn)程例如起初為休眠狀態(tài),從而它可以在被執(zhí)行時,控制應(yīng)用程序所使用的硬件資源。
[0101]圖2所示為基于圖1所示示意圖的示意圖,但其進(jìn)一步包括代表可執(zhí)行代碼段的層16,當(dāng)插入到與應(yīng)用程序關(guān)聯(lián)的進(jìn)程后,該代碼段被配置為在應(yīng)用程序?qū)?3和代表API的層12之間的邏輯層,使得代碼段可以攔截應(yīng)用程序?qū)δ承〢PI服務(wù)(例如函數(shù)和方法)的調(diào)用,從而控制應(yīng)用程序使用的硬件資源,作用于進(jìn)程的一個或多個軟件實體。
[0102]更具體地,代碼段執(zhí)行的方法如下:其中必須基于初始的情況來描述,其中當(dāng)用戶執(zhí)行應(yīng)用程序時,屬于應(yīng)用程序的進(jìn)程在休眠狀態(tài)中啟動。在該休眠狀態(tài)過程中,將可執(zhí)行代碼段插入到進(jìn)程中。
[0103]一旦該段代碼插入到進(jìn)程中,該段代碼就會將所有包含具有那些服務(wù)(函數(shù)或者方法)的應(yīng)用程序編程接口(API)的動態(tài)鏈接庫加載到內(nèi)存中,其中該動態(tài)鏈接庫為應(yīng)用程序執(zhí)行時所需要的動態(tài)鏈接庫。然后,在操作系統(tǒng)根據(jù)存儲有不同的API服務(wù)的初始內(nèi)存地址,為裝載在內(nèi)存中的這些服務(wù)填充了服務(wù)指針表之后,它將指針表中的每個應(yīng)用程序在執(zhí)行過程中可能或者會需要的服務(wù)的初始內(nèi)存地址替換為包括該代碼段的對應(yīng)的服務(wù)所在的初始內(nèi)存位置。因此,在執(zhí)行重定向的基礎(chǔ)上,代碼段可以攔截進(jìn)程為了執(zhí)行服務(wù)而對這些相關(guān)服務(wù)的調(diào)用,即由于指針并不指向多個API服務(wù),而是指向包含該代碼段的對應(yīng)的服務(wù),代碼段接收到該進(jìn)程對不同的API的不同的相關(guān)服務(wù)的調(diào)用。
[0104]在上述攔截的基礎(chǔ)上,該代碼段獲得了計算機(jī)系統(tǒng)上應(yīng)用程序?qū)τ布Y源的使用情況的控制能力,即該代碼段以一種對于進(jìn)程而言透明的方式,控制系統(tǒng)中應(yīng)用程序?qū)τ布Y源的使用情況。
[0105]更具體地,當(dāng)進(jìn)程嘗試通過調(diào)用某些API服務(wù)訪問計算機(jī)系統(tǒng)的硬件資源時,該段代碼執(zhí)行它自身的服務(wù)(即執(zhí)行這些調(diào)用的攔截)。在攔截的基礎(chǔ)上,根據(jù)進(jìn)程調(diào)用的服務(wù)類型,該段代碼作用于某個軟件實體。
[0106]因此,如果被攔截的API服務(wù)是意在創(chuàng)建新的執(zhí)行線程的服務(wù)(即代碼段作用的軟件實體為執(zhí)行線程),該攔截步驟包括:
[0107]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程;
[0108]■基于包含在代碼段中的對應(yīng)服務(wù)生成新的執(zhí)行線程;
[0109]■保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符在某變量中生成,該變量維持創(chuàng)建的執(zhí)行線程的寄存器。
[0110]對于已經(jīng)描述的情況(即,被攔截的API服務(wù)是意在創(chuàng)建新的執(zhí)行線程的服務(wù)),攔截進(jìn)程對API服務(wù)的調(diào)用還可能替換性地包括:
[0111]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程;
[0112]■基于存儲在變量中的初始內(nèi)存地址,調(diào)用API的函數(shù),該變量用于存儲這種信息;
[0113]■接收新的由API服務(wù)產(chǎn)生的執(zhí)行線程的標(biāo)識符;
[0114]■保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符在用于維持創(chuàng)建的執(zhí)行線程的寄存器的變量中生成。
[0115]在任何情況下,如果攔截的API服務(wù)為意在創(chuàng)建新的執(zhí)行線程的服務(wù),作用于軟件實體的步驟可包括:
[0116]■確定正在執(zhí)行的應(yīng)用程序的消耗值;
[0117]■檢驗應(yīng)用程序的消耗值是否超出閾值;
[0118]■如果超出閾值,基于存儲在變量中的標(biāo)識符,將之前創(chuàng)建的執(zhí)行線程暫停一預(yù)設(shè)時間,其中該變量維持創(chuàng)建的執(zhí)行線程的寄存器。
[0119]因此,既然執(zhí)行線程的標(biāo)識符由代碼段管理(所述代碼段將標(biāo)識符存儲在它管理的變量中),如果該代碼段檢測到應(yīng)用程序的消耗超出了閾值(即,如果應(yīng)用程序的執(zhí)行消耗了太多的資源或者不必要的資源),代碼段會基于存儲在對應(yīng)變量的執(zhí)行線程的標(biāo)識符,暫停執(zhí)行直到那一刻創(chuàng)建的線程的執(zhí)行,這意味著線程段可以控制應(yīng)用程序?qū)τ布Y源的使用情況。
[0120]上文已描述的正在執(zhí)行的應(yīng)用程序的消耗值的確定步驟包括:
[0121]?構(gòu)建API服務(wù)作為控制點,當(dāng)進(jìn)程執(zhí)行時,會反復(fù)調(diào)用該API服務(wù)。
[0122]?確定進(jìn)程第一次調(diào)用和第二次調(diào)用該服務(wù)的時間間隔;
[0123]?基于確定的時間,得到正在執(zhí)行的應(yīng)用程序的消耗值。
[0124]如果被攔截的API服務(wù)為意在預(yù)留存儲區(qū)域的服務(wù),則攔截進(jìn)程對API服務(wù)的調(diào)用這一步驟包括:
[0125]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于預(yù)留存儲區(qū)域;
[0126]在這種情況下(即被攔截的調(diào)用為對意在預(yù)留存儲區(qū)域的服務(wù)的調(diào)用),在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體這一步驟包括:
[0127]■預(yù)留共享存儲區(qū)域。
[0128]因此,當(dāng)進(jìn)程調(diào)用用于預(yù)留內(nèi)存區(qū)域的API服務(wù)時,該調(diào)用被攔截(即調(diào)用被重定向到包含在該代碼段的對應(yīng)的服務(wù))并且意在被同一應(yīng)用程序的不同實例共享的內(nèi)存區(qū)域被分配,即包含在該段代碼內(nèi)的對應(yīng)服務(wù)將由同一應(yīng)用程序的不同實例共享的內(nèi)存區(qū)域分配給該進(jìn)程。
[0129]最后,如果被攔截的調(diào)用對應(yīng)于意在干預(yù)互斥鎖的API服務(wù),則攔截進(jìn)程對API服務(wù)的調(diào)用這一步驟包括:
[0130]■接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于干預(yù)互斥鎖;
[0131]■修改分配給互斥鎖的名稱;
[0132]而基于攔截進(jìn)程對API服務(wù)的調(diào)用,在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的步驟包括:
[0133]■修改分配給互斥鎖的名稱;
[0134]有些應(yīng)用程序(例如一些游戲)不允許在同一計算機(jī)系統(tǒng)上執(zhí)行多于一個應(yīng)用程序的實例。為了達(dá)到該目的,它們使用可為應(yīng)用程序的實例分配標(biāo)識符的鎖或者互斥鎖,并且在生成的所有的新實例接收到相同的標(biāo)識符的情況下,執(zhí)行多于一個實例是不可實現(xiàn)的。
[0135]鑒于這種情況,并如上文所述,當(dāng)進(jìn)程嘗試創(chuàng)建與應(yīng)用程序相關(guān)的互斥鎖并且調(diào)用包含在該代碼段的對應(yīng)服務(wù)時(意在執(zhí)行該行為的初始API服務(wù)的指針先前一定要重定向到包含在該代碼段的服務(wù)),該代碼段修改分配給該互斥鎖的標(biāo)識符,從而當(dāng)該應(yīng)用程序生成第二個實例,標(biāo)識符并未互相吻合,從而允許同步執(zhí)行。
[0136]因此,到目前為止的描述清楚地顯示了根據(jù)代碼段攔截到的對不同類型的API服務(wù)的調(diào)用,該代碼段可以作用于這些類型的服務(wù)對應(yīng)的軟件實體,控制應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)中硬件資源的使用情況。
[0137]下文將描述本發(fā)明一優(yōu)選實施例,其中操作系統(tǒng)可以是Windows系列中的任何一個,例如Windows 7 ;計算機(jī)系統(tǒng)是應(yīng)用程序服務(wù)器,更具體地為游戲服務(wù)器;并且待執(zhí)行應(yīng)用程序為游戲以及/或者同一游戲的不同實例。此外,當(dāng)執(zhí)行進(jìn)程時,用于控制應(yīng)用程序?qū)τ布Y源的使用情況的代碼段所干預(yù)的軟件實體對應(yīng)于不同的執(zhí)行線程,該執(zhí)行線程直到此時已經(jīng)創(chuàng)建。
[0138]更具體地,本優(yōu)選實施例具有以下操作。本游戲服務(wù)器的目的在于使服務(wù)用戶在他們的移動終端上,如智能手機(jī)或平板電腦,玩不同的游戲,或者甚至玩相同的計算機(jī)游戲。每個游戲或者同一游戲的每個實例的執(zhí)行可以通過流技術(shù)從游戲服務(wù)器發(fā)送到用戶移動設(shè)備。因此,所述用戶可以從屬于用戶的移動設(shè)備上選擇要玩的游戲,通過在用戶移動終端屏幕上顯示的圖形用戶界面上出現(xiàn)的控制元件(例如代表游戲的圖標(biāo))的觸發(fā)來請求執(zhí)行游戲。用戶在控制元件上的觸發(fā)產(chǎn)生發(fā)送到游戲服務(wù)器的控制信號,使服務(wù)器執(zhí)行所選的游戲。
[0139]假如有大量的用戶請求執(zhí)行游戲(即具有大量被執(zhí)行的游戲),本發(fā)明努力控制每個游戲的執(zhí)行,從而使使用的硬件資源盡可能最少,進(jìn)而最大數(shù)量的游戲可以同步執(zhí)行,并且從而可以為最大數(shù)量的用戶提供服務(wù)。
[0140]因此,當(dāng)用戶從他/她的移動終端請求執(zhí)行游戲時,在休眠狀態(tài)中,在游戲服務(wù)器中創(chuàng)建正在執(zhí)行的應(yīng)用程序(即游戲)的主進(jìn)程。為此,使用CreateProcess函數(shù),分配CREATE_SUSPENDED值到創(chuàng)建模式參數(shù)(CreateFlags)。一旦進(jìn)程在休眠狀態(tài)中啟動,根據(jù)本發(fā)明的可執(zhí)行代碼段插入到進(jìn)程中,其目的在于最優(yōu)化屬于該進(jìn)程的軟件實體。
[0141]在重新開始執(zhí)行進(jìn)程之前(必須注意進(jìn)程在休眠狀態(tài)中啟動),插入的代碼段重定向被攔截的API函數(shù)。根據(jù)該優(yōu)選實施例,有兩類函數(shù)被攔截:
[0142]■利用函數(shù)CreateThread用于寄存執(zhí)行線程的創(chuàng)建;
[0143]■當(dāng)執(zhí)行進(jìn)程時用于構(gòu)建控制點。因此,使用這些控制點,可以通過與進(jìn)程相關(guān)的函數(shù),a pr1ri,以相對于該進(jìn)程透明的方式測量應(yīng)用程序的消耗,已知它們會在整個進(jìn)程的執(zhí)行過程中被反復(fù)調(diào)用。因此,例如在圖形應(yīng)用程序中,可通過API IDXGISwapChainI的方法Presentl,將每個屏幕的每個幀的函數(shù)構(gòu)建成控制點,從而可以通過測量每秒顯示的畫面的數(shù)量(FPS)得到應(yīng)用程序的消耗。目的在于插入代碼段,確認(rèn)應(yīng)用程序什么時候超出預(yù)設(shè)消耗閾值,從而防止過度使用計算機(jī)系統(tǒng)(即游戲服務(wù)器)的硬件資源,并且從而平衡該消耗與其他正在執(zhí)行的應(yīng)用程序(即游戲或者同一游戲的實例)的消耗量。如果應(yīng)用程序的消耗量超出預(yù)設(shè)閾值,則與該進(jìn)程相關(guān)的執(zhí)行線程可以根據(jù)需要暫停一段時間,從而使消耗量不會超出閾值。
[0144]在Windows操作系統(tǒng),這些所述的多個API通常以多個動態(tài)鏈接庫(DLL)的形式執(zhí)行。因此,該代碼段利用函數(shù)LoadLibrary,通過庫dxg1.dll裝載包括要被重定向的函數(shù)的庫,例如庫 kernel32.dll 的 CreateThread 以及 API IDXGISwapChainI 的 Presentl?;旧希琇oadLibrary將庫加載到內(nèi)存中,并且以API函數(shù)的內(nèi)存中的初始地址填充索引地址表(IAT),該表是用于API函數(shù)的指針表。必要的指針通過函數(shù)RedirectIAT修改,使該指針對應(yīng)于屬于插入到進(jìn)程的代碼段的函數(shù)。同時,表的初始內(nèi)容(即存儲函數(shù)的最初內(nèi)存位置的指針)存儲在一變量中,以備某個時刻需要調(diào)用原函數(shù)。
[0145]另一方面,既然API IDXGISwapChainl是COM類型的接口,有必要修改該接口的指針表來替換被攔截的方法,例如Presentl。用特定的代碼對COM類型接口的方法指針表進(jìn)行修改。例如,Presentl與IDXGISwapChainl接口的方法表的位置4對應(yīng),并且不得不對其修改,使其指向包含在插入的代碼段中的函數(shù)。同時,位置的原始內(nèi)容存儲在一變量中,以備某個時刻需要調(diào)用原方法。對COM類型接口的指針表的修改只有在該類型的對象第一次創(chuàng)建的時候?qū)嵤?。?dāng)服務(wù)重定向結(jié)束時,即所有必要的API的所有函數(shù)和方法已經(jīng)被重定向,重新執(zhí)行應(yīng)用程序的進(jìn)程。
[0146]當(dāng)進(jìn)程嘗試創(chuàng)建新的執(zhí)行進(jìn)程,執(zhí)行函數(shù)CreateThread,用于存儲將要被創(chuàng)建的新線程的信息。為了達(dá)到該目的,代碼段調(diào)用初始函數(shù)CreateThread,用于執(zhí)行該函數(shù),并且代碼段自身將新的執(zhí)行線程的標(biāo)識符存儲在變量中,該變量維持直到此時創(chuàng)建的所有線程的寄存器。在本優(yōu)選實施例中,使用初始函數(shù)CreateThread,即基于存儲在對應(yīng)變量(存儲初始內(nèi)存位置的指針的變量,其中每個重定向函數(shù)存儲在該內(nèi)存初始位置)內(nèi)的內(nèi)存地址,代碼段調(diào)用初始API函數(shù),但是在代碼段包括創(chuàng)建執(zhí)行線程的函數(shù)時也會出現(xiàn)這種情況,不必要調(diào)用外部函數(shù)。在所有這些情況下,代碼段管理創(chuàng)建的執(zhí)行線程的標(biāo)識符。
[0147]另一方面,如上文所述,還有可能在與應(yīng)用程序相關(guān)的進(jìn)程每次調(diào)用作為控制點的函數(shù)時,測量正在執(zhí)行的應(yīng)用程序的消耗,例如,在優(yōu)選實施例中,調(diào)用函數(shù)Presentl。為了達(dá)到該目的,從上次調(diào)用這個函數(shù)的時間間隔可通過特定的算法測量,從而計算消耗,例如利用FPS (每秒的幀數(shù))度量。如果包含在插入的代碼段的用于測量消耗的算法顯示已經(jīng)超出預(yù)設(shè)閾值,則計算必須暫停該執(zhí)行線程的必要時間??梢酝ㄟ^算法去測量維持實際消耗的必要執(zhí)行時間與理想消耗所需時間相比的差異去計算該時間。然后,該代碼段使直到此時由進(jìn)程(其標(biāo)識符已經(jīng)存儲在前述對應(yīng)的變量中)創(chuàng)建的所有的執(zhí)行線程(即該代碼段作用于軟件實體,如執(zhí)行線程)暫停,暫停時間長度根據(jù)計算得到,其中通過函數(shù)SuspendThread以及庫kernel32.dll的Sleep進(jìn)行計算。所計算的時間段一過,執(zhí)行線程就會再次被譬如庫kernel32.dll的函數(shù)ResumeThread啟動。在那一刻之后,進(jìn)程繼續(xù)正常執(zhí)行,直到進(jìn)程下次再調(diào)用控制函數(shù)(在本優(yōu)選實施命名,函數(shù)Presentl)。
[0148]因此,當(dāng)代碼段在涉及作用于執(zhí)行線程的軟件實體時,該代碼段控制游戲服務(wù)器中應(yīng)用程序(更具體地,游戲)在其執(zhí)行時對可用硬件資源的使用情況。
[0149]根據(jù)本發(fā)明另一優(yōu)選實施例,該代碼段還可作用于另一軟件實體,例如內(nèi)存。在這種情況下,該代碼段必須重定向所有意在管理存儲區(qū)域預(yù)留的API服務(wù)(例如函數(shù)以及/或者方法)至包含在代碼段自身的服務(wù),從而使包含在代碼段內(nèi)的服務(wù)可以分配同一游戲的不同實例的存儲區(qū)域。因此,執(zhí)行中的實例可以共享某些存儲區(qū)域,從而這些實例的內(nèi)存的使用情況可以顯著減少。必須考慮到一點,在有些情況下,每個執(zhí)行的實例都具有不可以共享的獨占存儲區(qū)域(可包括例如涉及請求執(zhí)行該實例的用戶的數(shù)據(jù))。因此,在預(yù)留存儲區(qū)域之前,該代碼段必須確定哪些存儲區(qū)域可以共享,哪些不可以共享。
[0150]對于執(zhí)行線程類型的軟件實體,應(yīng)用程序所需的存儲區(qū)域還可以通過代碼段調(diào)用初始API函數(shù)分配,其中該代碼段控制存儲區(qū)域,該存儲區(qū)域必須隨時分配。
[0151]另一方面,該代碼段還可以管理另一種類型的軟件實體,如鎖或互斥鎖,從而可以在同一服務(wù)器上執(zhí)行同一游戲的不止一個實例。程序員通常會在全球計算機(jī)游戲(worldcomputer gaming)中包含有互斥鎖,從而防止用戶執(zhí)行同一計算機(jī)系統(tǒng)的游戲的不止一個實例。為了達(dá)到該目的,當(dāng)創(chuàng)建游戲的第一個實例時,互斥鎖產(chǎn)生與游戲相關(guān)的預(yù)設(shè)標(biāo)簽(該標(biāo)簽對于每一個游戲是唯一的),從而當(dāng)用戶嘗試執(zhí)行正在執(zhí)行的游戲的第二個實例時,該互斥鎖確定存在正在執(zhí)行的實例(通過標(biāo)簽的存在判斷),并且不允許該游戲的第二個實例執(zhí)行。
[0152]為了克服該缺陷,插入屬于該游戲的進(jìn)程的代碼段重定向意在管理互斥鎖的API服務(wù)到包含在代碼段本身內(nèi)的服務(wù)。因此,該代碼段可以攔截這些服務(wù),并且修改互斥鎖分配給該服務(wù)的預(yù)設(shè)標(biāo)簽,從而當(dāng)用戶嘗試執(zhí)行游戲的第二個示例時,服務(wù)不會檢測到任何預(yù)設(shè)標(biāo)簽的示例,從而允許其執(zhí)行。既然代碼段已經(jīng)插入到對應(yīng)于每個正在執(zhí)行的實例的進(jìn)程,分配到該實例的標(biāo)簽對于每個實例而言均不相同。
[0153]盡管已經(jīng)描述并描繪了本發(fā)明的特定實施例,但非常明顯的是,本領(lǐng)域技術(shù)人員可以進(jìn)行變型和修改,或者替換其他技術(shù)上等同的細(xì)節(jié),都不會超出權(quán)利要求保護(hù)的范圍。
[0154]雖然文中參考附圖描述的實施例包括計算機(jī)系統(tǒng)以及在計算機(jī)系統(tǒng)中執(zhí)行的進(jìn)程,但本發(fā)明還覆蓋計算機(jī)程序或者可執(zhí)行代碼段,更具體地,適于將本發(fā)明用于實踐的在載體媒體中或上的計算機(jī)程序。計算機(jī)程序可以是源代碼、目標(biāo)代碼或者介于源代碼和目標(biāo)代碼之間的中間代碼的形式,如部分編譯形式,或者適于實現(xiàn)本發(fā)明進(jìn)程的其他形式。該載體媒體可以是任何實體或者可以執(zhí)行該方案的設(shè)備。
[0155]例如,載體媒體可以包括存儲介質(zhì),如R0M,例如⑶、ROM或者半導(dǎo)體R0M,或者磁記錄介質(zhì),例如軟盤或硬盤。此外,載體媒體還可以是可傳送載體媒體,如可以利用無線電或其他方式通過電線或光纖進(jìn)行傳輸?shù)碾娀蛘吖庑盘枴?br>
[0156]當(dāng)計算機(jī)程序包含在可直接通過電纜或其他機(jī)構(gòu)或裝置傳播的信號中時,該載體媒體可以通過所述電纜或其他機(jī)構(gòu)或裝置形成。
[0157]或者,載體媒體可以為內(nèi)嵌計算機(jī)系統(tǒng)的集成電路,所述集成電路適于執(zhí)行,或者用于執(zhí)行相關(guān)進(jìn)程。
【權(quán)利要求】
1.一種利用可插入到屬于應(yīng)用程序的進(jìn)程的可執(zhí)行代碼,控制在包括至少一個在計算機(jī)系統(tǒng)上執(zhí)行的八?I的操作系統(tǒng)中執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,該方法包括: -攔截屬于該應(yīng)用程序的進(jìn)程對八?I服務(wù)的調(diào)用; -基于進(jìn)程對仙I服務(wù)的調(diào)用的攔截,作用于正在執(zhí)行的進(jìn)程的軟件實體。
2.根據(jù)權(quán)利要求1所述的方法,包括: -將仙I服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù)。
3.根據(jù)權(quán)利要求2所述的方法,其中該八?I服務(wù)是函數(shù),并且其中將八?I服務(wù)重定向到包含在代碼段中的相對應(yīng)的服務(wù)包括: 圖將包含待重定向的仙I的函數(shù)的動態(tài)鏈接庫加載到內(nèi)存中; 圖在包含在裝載的動態(tài)鏈接庫中的八?I函數(shù)的函數(shù)指針表中,將存儲待重定向的八?I函數(shù)的初始內(nèi)存地址替換為存儲包含在代碼段中的對應(yīng)函數(shù)的初始內(nèi)存地址。
4.根據(jù)權(quán)利要求3所述的方法,其中將八?I服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù)包括: 圖將存儲待重定向的仙I的函數(shù)的初始內(nèi)存地址存儲在第一變量中。
5.根據(jù)權(quán)利要求2所述的方法,其中該八?I服務(wù)是對象方法,并且其中將仙I服務(wù)重定向到包含在代碼段中的相對應(yīng)的服務(wù)包括: 圖將包含待重定向的對象方法的動態(tài)鏈接庫裝載到內(nèi)存中; 圖驗證與該待重定向的方法相關(guān)的對象是否是第一次創(chuàng)建; 圖如果驗證結(jié)果為是, 籲在包含在裝載的動態(tài)鏈接庫中的對象方法的方法指針表中,將存儲待重定向的對象方法的初始內(nèi)存地址替換為存儲包含在代碼段中的對應(yīng)方法的初始內(nèi)存地址。
6.根據(jù)權(quán)利要求5所述的方法,其中將八?I服務(wù)重定向到包含在代碼段中的對應(yīng)服務(wù)包括: 圖將存儲待重定向的對象方法的初始內(nèi)存地址存儲在第一變量中。
7.根據(jù)權(quán)利要求1-6中任一項所述的方法,其中八?I服務(wù)是與屬于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在創(chuàng)建一個新的執(zhí)行線程;其中軟件實體是執(zhí)行線程;并且其中攔截進(jìn)程對仙I服務(wù)的調(diào)用包括: 圖接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程; 圖基于包含在代碼段中的對應(yīng)服務(wù)生成新的執(zhí)行線程; 圖保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符在第二變量中生成,該第二變量維持創(chuàng)建的執(zhí)行線程的寄存器。
8.根據(jù)權(quán)利要求4-6中任一項所述的方法,其中八?I服務(wù)是與對應(yīng)于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在創(chuàng)建一個新的執(zhí)行線程;其中軟件實體是執(zhí)行線程;并且其中攔截進(jìn)程對八?I服務(wù)的調(diào)用包括: 圖接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于生成新的執(zhí)行線程; 圖基于存儲在第一變量中的初始內(nèi)存地址,調(diào)用仙I的函數(shù); 圖接收由仙I服務(wù)產(chǎn)生的新的執(zhí)行線程的標(biāo)識符; 圖保存執(zhí)行線程的標(biāo)識符,該標(biāo)識符在第二變量中生成,該第二變量維持創(chuàng)建的執(zhí)行線程的寄存器。
9.根據(jù)權(quán)利要求7或8所述的方法,其中基于攔截進(jìn)程對八?I服務(wù)的調(diào)用,在作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的步驟包括: 圖確定正在執(zhí)行的應(yīng)用程序的消耗值; 圖檢驗應(yīng)用程序的消耗值是否超出閾值; 圖如果超出閾值,基于存儲在第二變量中的標(biāo)識符,將執(zhí)行線程暫停一預(yù)設(shè)時間,其中該第二變量維持創(chuàng)建的執(zhí)行線程的寄存器。
10.根據(jù)權(quán)利要求9所述的方法,其中基于對硬件資源的使用確定正在執(zhí)行的應(yīng)用程序的消耗值包括: 籲構(gòu)建仙I服務(wù)作為控制點,當(dāng)進(jìn)程執(zhí)行時,將反復(fù)調(diào)用該八?I服務(wù); 籲確定進(jìn)程第一次調(diào)用和第二次調(diào)用該服務(wù)的時間間隔; 籲基于確定的時間,得到正在執(zhí)行的應(yīng)用程序的消耗值。
11.根據(jù)權(quán)利要求1-6中任一項所述的方法,其中八?I服務(wù)是與對應(yīng)于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在預(yù)留存儲區(qū)域;其中軟件實體是內(nèi)存;并且其中攔截進(jìn)程對八?I服務(wù)的調(diào)用包括: 圖接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于預(yù)留存儲區(qū)域。
12.根據(jù)權(quán)利要求11所述的方法,其中基于攔截進(jìn)程對八?I服務(wù)的調(diào)用,作用于屬于正在執(zhí)行的進(jìn)程的軟件實體包括: 圖預(yù)留共享存儲區(qū)域。
13.根據(jù)權(quán)利要求1-6中任一項所述的方法,其中八?I服務(wù)是與對應(yīng)于該進(jìn)程的軟件實體相關(guān)的服務(wù);該服務(wù)意在干預(yù)互斥鎖;其中軟件實體是互斥鎖;并且其中攔截進(jìn)程對八?I服務(wù)的調(diào)用包括: 圖接收進(jìn)程對對應(yīng)服務(wù)的調(diào)用,該對應(yīng)服務(wù)包含在代碼段中,用于干預(yù)互斥鎖。
14.根據(jù)權(quán)利要求13所述的方法,其中基于攔截進(jìn)程對八?I服務(wù)的調(diào)用,作用于屬于正在執(zhí)行的進(jìn)程的軟件實體包括: I修改分配給互斥鎖的名稱。
15.根據(jù)權(quán)利要求1-14中任一項所述的方法,其中屬于該應(yīng)用程序的進(jìn)程在休眠狀態(tài)中啟動,該方法包括: -喚醒處于休眠狀態(tài)的進(jìn)程的執(zhí)行。
16.一種包含用于執(zhí)行控制權(quán)利要求1-15中任一項所述的計算機(jī)系統(tǒng)中硬件資源的方法的指令的可執(zhí)行代碼段;當(dāng)一應(yīng)用程序在包括至少一個在這一計算機(jī)系統(tǒng)中執(zhí)行的八?I的操作系統(tǒng)上運行時,該可執(zhí)行代碼段適于插入到屬于該應(yīng)用程序的進(jìn)程中。
17.根據(jù)權(quán)利要求16所述的存儲在存儲媒介中的代碼段。
18.根據(jù)權(quán)利要求16所述的由載波攜帶的代碼段。
19.一種執(zhí)行計算機(jī)系統(tǒng)中操作系統(tǒng)上的應(yīng)用程序的方法,包括: -在休眠狀態(tài)下,初始化與應(yīng)用程序相關(guān)的進(jìn)程的執(zhí)行; -將權(quán)利要求16-18中任一項所述的可執(zhí)行代碼段插入到休眠狀態(tài)的進(jìn)程中; -執(zhí)行利用插入到進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的方法,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的八?I,其中該方法如權(quán)利要求1-15中任一項所述。
20.—種控制在包括至少一個在計算機(jī)系統(tǒng)上執(zhí)行的八?I的操作系統(tǒng)中執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源使用情況的系統(tǒng),適于向該系統(tǒng)插入屬于該應(yīng)用程序的進(jìn)程,系統(tǒng)包括: -用于攔截從進(jìn)程到八?I服務(wù)的調(diào)用的計算機(jī)裝置; -基于攔截進(jìn)程對仙I服務(wù)的調(diào)用,用于作用于屬于正在執(zhí)行的進(jìn)程的軟件實體的計算機(jī)裝置。
21.一種在其上執(zhí)行有應(yīng)用程序的計算機(jī)系統(tǒng),包括存儲器和處理器,包含有存儲在存儲器中的處理器可執(zhí)行指令,該指令包括以下功能: -在休眠狀態(tài)下,初始化與應(yīng)用程序相關(guān)的進(jìn)程的執(zhí)行; -將權(quán)利要求16-18中任一項所述的可執(zhí)行代碼段插入到休眠狀態(tài)的進(jìn)程中; -執(zhí)行方法,其利用插入到進(jìn)程的可執(zhí)行代碼段,控制在操作系統(tǒng)上執(zhí)行的應(yīng)用程序?qū)τ嬎銠C(jī)系統(tǒng)硬件資源的使用情況,所述操作系統(tǒng)包括至少一個在該計算機(jī)系統(tǒng)上執(zhí)行的八?I,其中該方法如權(quán)利要求1-15中任一項所述。
【文檔編號】G06F9/50GK104364759SQ201380031821
【公開日】2015年2月18日 申請日期:2013年4月18日 優(yōu)先權(quán)日:2012年4月19日
【發(fā)明者】A·帕胡埃洛·岡薩雷斯, J·韋爾迪·穆拉 申請人:加泰羅尼亞理工大學(xué)