摘 要:為了提高軟件人的管理效率,基于Linux操作系統(tǒng)的LKM機制,并融合軟件人的遷移和演化等關鍵特性,提出了一個新的概念:基于Linux LKM機制的軟件人管理系統(tǒng)。首先,分析了軟件人系統(tǒng)和LKM機制融合的可行性,然后詳述了基于Linux LKM機制的軟件人管理系統(tǒng)的功能需求和結構設計,并給出了部分關鍵數(shù)據(jù)結構和算法。
關鍵詞:軟件人; 可加載內核模塊; 軟件人管理; 注冊與注銷; 軟件人遷移
中圖分類號:TP311.5 文獻標志碼:A
文章編號:1001-3695(2010)03-0948-03
doi:10.3969/j.issn.1001-3695.2010.03.038
Design and implementation of softman admin system based on Linux LKM
WU Tao, YUE Yang, ZENG Guang-ping
(School of Information Engineering, University of Science Technology Beijing, Beijing 100083, China)
Abstract:Based on Linux LKM (loadable kernel module) and softman’s key characters like migration and evolution, in order to improve efficiency of softman’s admin, this paper proposed a new concept, the softman admin system based on Linux LKM.Firstly analysed the feasibility of LKM and softman’s amalgamation, and then amplified the system’s function demands and structure design, at the same time listing some key data structures and algorithms.
Key words:softman; LKM; admin of softman; register and unregister; softman migration
0 引言
在開放、動態(tài)和難控的信息網(wǎng)絡環(huán)境下,如何使分布式系統(tǒng)的計算交互更加智能已成為計算機應用軟件技術面臨的重要挑戰(zhàn)之一。計算機網(wǎng)絡環(huán)境下虛擬機器人——軟件人正是在這樣的背景下應運而生的。
軟件人是一類具有擬人智能、生活并活動于計算機網(wǎng)絡中的軟件人工生命,是一種虛擬的機器人。軟件人的社會組織模型是一個遞階、分層的結構。軟件人社會是由整個網(wǎng)絡的所有軟件人社區(qū)組成的,一個節(jié)點計算機就是一個軟件人社區(qū)。在一個軟件人社區(qū)中,需要有守護軟件人、管理軟件人、消息軟件人和若干個功能軟件人[1,2]。其中,功能軟件人的存在形式是軟件人管理和遷移的一個關鍵問題。
軟件人管理系統(tǒng)以管理為基本功能,以實現(xiàn)軟件重構為擴展功能。目前,大多數(shù)軟件人的研究主要集中在進程功能軟件人上,即功能軟件人在Linux操作系統(tǒng)中的存在形式為一個用戶級進程。這樣,當功能軟件人向管理軟件人注冊、注銷和遷移時,管理軟件人都需要獨自維護當前節(jié)點的軟件人綜合信息表。這就給軟件人管理系統(tǒng)帶來了很大的系統(tǒng)開銷。另外,在進程功能軟件人進行遷移時,需要保存當前進程的所有狀態(tài)信息,并將這些狀態(tài)信息在遠端節(jié)點重新生成進程,這也是一件相當復雜的工作。而且,進程重新啟動以后的軟件重構更是一件難以掌控的工作。所以,本文將Linux的LKM機制和軟件人的技術相結合,提出了基于Linux LKM機制的軟件人系統(tǒng)的概念。
在本系統(tǒng)中,守護軟件人隨Linux操作系統(tǒng)一起啟動,負責收集內核中的功能軟件人狀態(tài)信息,同時,將這些信息傳遞給管理軟件人。管理軟件人負責軟件人的全面管理。另外,本系統(tǒng)的成熟產(chǎn)品可應用于網(wǎng)絡信息采集、信息推薦、網(wǎng)絡信息安全、網(wǎng)絡警察以及驅動程序管理等各個領域,具有很大的研究價值。
1 相關工作和技術背景
1.1 相關的工作分析
軟件人是一種智能性、擬人性更高的軟件個體,對它的研究可以追溯到agent(智能體)的起源和發(fā)展。目前,已經(jīng)有很多學者對這個領域進行了深入的研究,主要有以下幾個方面:
a)智能體思想的誕生最早可追溯到John McCarthy在20世紀50年代末提出的The Advice Taker系統(tǒng),該系統(tǒng)被設想為具有目標性,系統(tǒng)內實體間用人類術語進行交流,它們從用戶利益來考慮從事各項任務。1993年首次召開了agent形式化模型的國際會議,同年Y.Shoham[3]提出了AOP(agent-oriented programming)的概念。1994年1月,美國General Magic公司演示了初次公開的agent應用軟件。至此,智能體技術迎來了巨大的發(fā)展契機。
b)Jennings等人[4,5]在研究多智能體和AOSE (agent-oriented software engineering)方面成果頗豐。Multi-agent系統(tǒng)(MAS)是由多個agent之間相互協(xié)調、相互服務、相互競爭,又共同合作地完成一個任務。各個agent成員之間的活動是自治獨立的,其自身的目標和行為不受其他任何agent成員的限制,它們通過競爭和協(xié)商等手段解決相互之間的矛盾和沖突,從而達到完成任務的目的。Agent個體的管理與軟件人的管理有很大的相似之處。
c)在國內,清華大學、南京大學、中國科學院、哈爾濱工業(yè)大學、國防科技大學等單位對智能機器人和agents系統(tǒng)進行了較深入的研究,在理論體系、原理機制、實現(xiàn)技術和應用方面都取得了顯著成果。文獻[6]對agents的體系結構、方法、理論基礎及相關理論問題進行了全面論述。毛新軍[7]對面向agent的軟件開發(fā)進行了深入的研究。
參考以上的研究成果,結合軟件人的關鍵特性,本項目設計并實現(xiàn)了一個用于軟件人綜合管理的系統(tǒng)。它主要負責管理當前社區(qū)內所有靜態(tài)軟件人和動態(tài)軟件人,根據(jù)遷移策略,決定是否將本地軟件人遷出或是否允許遠程軟件人遷入,保證了軟件人之間科學有效地工作,提高其工作效率。
1.2 軟件人系統(tǒng)
軟件人個體生存于計算機網(wǎng)絡環(huán)境中,它們之間相互協(xié)調、相互作用,形成一個有序的系統(tǒng)。一個完整的軟件人系統(tǒng)由守護軟件人、管理軟件人、消息軟件人和功能軟件人組成。它們的功能描述如下[2]:
a)守護軟件人。它處于內核態(tài),在各個軟件人社區(qū)是惟一的。它負責維護軟件人系統(tǒng)在內核中的相關數(shù)據(jù)結構,并將這些信息傳遞給管理軟件人,從而使管理軟件人作出更優(yōu)的決策。另外,守護軟件人還負責監(jiān)聽本節(jié)點的負載信息。
b)管理軟件人。它在各個軟件人社區(qū)也是惟一的,但處于用戶態(tài)。它和守護軟件人共同維護本地的軟件人綜合信息表,負責加載、撤銷和遷移所有功能軟件人。另外,管理軟件人還負責功能軟件人的協(xié)作。
c)消息軟件人。它在各個軟件人社區(qū)也是惟一的,處于用戶態(tài)。它負責在社區(qū)間傳遞消息和事件,是社區(qū)間的聯(lián)絡管理員,并負責將消息填入綜合信息表,將事件放入事件隊列。
d)功能軟件人。各個軟件人社區(qū)中,功能軟件人一般不是惟一的。它是具有特定領域事務處理功能的軟件人,并且根據(jù)管理軟件人的要求,功能軟件人可以動態(tài)加載、撤銷以及遷移。
軟件人群的管理策略分為以管理軟件人為中心的集中管理策略和以消息軟件人為通道的分布協(xié)調策略兩種。在基于LKM的軟件人管理系統(tǒng)中,將采取前一種管理策略。
1.3 可加載動態(tài)模塊
眾所周知,Linux操作系統(tǒng)是一個單內核(monolithic kernel)系統(tǒng)。這樣,當程序開發(fā)人員編譯調試內核時,任何一個微小的變動都必須重新編譯內核,然后重啟動。為了彌補這一缺點,Linux引入了LKM (可加載動態(tài)模塊)的概念[8,9]。
與一般的用戶空間進程不同,模塊不是作為一個進程執(zhí)行的,而像其他靜態(tài)鏈接的內核函數(shù)一樣,在內核態(tài)代表當前進程執(zhí)行。模塊的代碼可以動態(tài)地鏈接到系統(tǒng)中作為內核的一部分運行,也可以在系統(tǒng)運行中動態(tài)地從內核中取下,從而可以達到動態(tài)擴展內核的目的。這樣,模塊就能參與到內核的設備驅動、文件系統(tǒng)和網(wǎng)絡驅動[10,11]等事務的管理中。
由于引入了LKM機制,Linux的內核可以達到最小,即內核中只實現(xiàn)一些基本的功能,而系統(tǒng)的可擴展性由模塊來完成。正是由于模塊的動態(tài)性和可擴展性,軟件人系統(tǒng)才最終與LKM機制結合。
2 系統(tǒng)的功能定義和結構設計
2.1 系統(tǒng)的功能定義
考慮到上節(jié)中提到的動態(tài)模塊一般應用,基于LKM的軟件人管理系統(tǒng)的功能軟件人被設計為具有可擴展功能的設備驅動功能軟件人。在此應用基礎上,基于LKM的軟件人管理系統(tǒng)的功能需求設計為:負責對設備驅動軟件人進行綜合管理,并通過需求和決策分析系統(tǒng)決定是否對特定的設備驅動軟件人進行遷移。
如圖1所示,守護軟件人主要維護由基內核(base kernel)得到的設備驅動模塊軟件人信息,并將這些信息發(fā)送給管理軟件人;消息軟件人同一般的軟件人系統(tǒng)一致,在社區(qū)間傳遞本節(jié)點設備驅動模塊的消息。管理軟件人根據(jù)守護軟件人所提供的模塊信息,決定是否對靜態(tài)的設備驅動軟件人加載,或對動態(tài)的設備驅動軟件人注銷。同時,如果消息軟件人得知其他節(jié)點需求本節(jié)點設備驅動模塊時,那么管理軟件人將決定是否對這個模塊軟件人進行遷移。
由此,給出以下定義[2]:
定義1 基于Linux LKM機制的軟件人管理系統(tǒng)任務功能集A。假設軟件人的全功能集合為∑,A∑且為用戶任務指定的可擴充函數(shù)集,a∈A是一具體任務函數(shù),則稱A為基于LKM的軟件人的任務功能集,即A={a0,…,ai}(i≥0)。其中a為某一驅動功能。
定義2 基于Linux LKM機制的軟件人管理系統(tǒng)管理功能集M。假設軟件人的全管理功能集合為∑,M∑且為完成基于LKM的軟件人系統(tǒng)管理任務的指定方法集,m∈M是一具體的模塊管理方法,則稱M為基于LKM的軟件人系統(tǒng)管理功能集,即M={m0,…,mi}(i≥0)。其中m為某一具體的驅動模塊管理方法。
定義3 基于Linux LKM機制的軟件人管理系統(tǒng)遷移功能集R。假設軟件人的全遷移功能集合為∑,R∑且為完成遷移模塊功能軟件人由源社區(qū)節(jié)點到目的社區(qū)節(jié)點的指定方法集,r∈R是一具體的驅動模塊遷移方法,則稱R為基于LKM的軟件人系統(tǒng)遷移功能集,即R={r0,…,ri}(i≥0)。其中r為某一具體的驅動模塊遷移方法。
2.2 系統(tǒng)的結構設計
基于Linux LKM機制的軟件人管理系統(tǒng)的結構設計如圖2所示。與一般的軟件人系統(tǒng)相比,消息軟件人和管理軟件人處于用戶層是與其一致的,守護軟件人駐于內核層也是相同的。最關鍵的不同之處在于基于Linux LKM機制的軟件人系統(tǒng)的功能軟件人存在于內核層。從設計的角度來看,功能軟件人是以模塊的形式存在的,那么當功能軟件人模塊加載后,它便以內核的組成部分而存在。因此,功能軟件人處于內核層是理所當然的。
消息軟件人由模塊消息發(fā)送機制和模塊消息接收機制兩個子結構構成。這與一般的軟件人系統(tǒng)都十分相似,所以本文對這部分內容不再贅述。另外,驅動模塊功能軟件人的實現(xiàn)與一般的驅動模塊編寫[13]相同,本文也不再詳述。
管理軟件人主要由注冊機制、注銷機制和遷移策略三個子結構構成。注冊機制和注銷機制共同維護本節(jié)點驅動模塊軟件人綜合信息表。守護軟件人駐于內核層,由內核模塊信息獲取機制、本地模塊遷移評估機制和相鄰社區(qū)模塊評估機制共同組成。遷移評估和遷移策略主要由節(jié)點的負載均衡、用戶需求等各種原因共同決定,基于Linux LKM機制的軟件人系統(tǒng)與一般的軟件人系統(tǒng)在這點保持一致。
3 系統(tǒng)的關鍵技術實現(xiàn)
3.1 模塊軟件人的注冊與注銷
管理軟件人維護的綜合信息表包含若干子表,如動態(tài)軟件人表、靜態(tài)軟件人表、消息表和各種資源分配表等。其中,最重要的數(shù)據(jù)結構是動態(tài)和靜態(tài)軟件人表。動態(tài)軟件人表表示已經(jīng)加載到內核的軟件人驅動模塊信息,而靜態(tài)軟件人表則表示未加載到內核的軟件人驅動模塊信息。這兩個表的信息是由雙向鏈表dynamic_smlist和static_smlist來存儲的。驅動模塊軟件人信息的數(shù)據(jù)結構描述如下:
struct module_sm_info{
list_head *next, *prev; //前后節(jié)點
char *name;//模塊名字
time_t start_time;//啟動時間
char *func_descrip;//功能索引
}
軟件人系統(tǒng)啟動后,首先讀取指定文件夾(本文設定為/usr/softman)下面所有靜態(tài)軟件人,并將所有信息填充到鏈表static_smlist中。然后,守護軟件人讀取/proc/modules,由管理軟件人根據(jù)模塊名字將動態(tài)模塊軟件人與其他模塊區(qū)分開來,并添加到鏈表dynamic_smlist中。其中,靜態(tài)軟件人信息中start_time設為-1,表示模塊未加載。至此,這兩個信息表的初始化完畢。然后,軟件人系統(tǒng)開啟注冊、注銷和遷移機制,開始監(jiān)聽模塊功能軟件人的加載、卸載、遷入和遷出。
另外,軟件人的注冊與注銷算法如下:
int module_reg_handler(int event_type,module_sm_info*info)
{
int result=0;//執(zhí)行結果
switch(event_type)
{
//加載事件,添加info到動態(tài)軟件人鏈表
case EVENT_LOAD:
result=dynamic_list_add(info);break;
//卸載事件,從動態(tài)軟件人鏈表刪除info
case EVENT_UNLOAD:
result=dynamic_list_remove(info);break;
//遷入事件,同時更新靜態(tài)和動態(tài)軟件人鏈表
case EVENT_MIGIN:
result=migin_list_handler(info);break;
//遷出事件,從動態(tài)軟件人鏈表刪除info
case EVENT_migout:
result=dynamic_list_remove(info);break;
}
//發(fā)送更新到鄰居社區(qū)
if(result) refresh_remote();
return result;
}
當特定事件觸發(fā)時,消息軟件人便給管理軟件人發(fā)送對應事件的消息。管理軟件人按照消息的不同類型作出不同的處理。與進程功能軟件人不同的是,LKM機制協(xié)助管理軟件人維護軟件人綜合信息表。
3.2 模塊軟件人的遷移
一直以來,軟件人的遷移都是軟件人研究中的關鍵問題。遷移是軟件人遷移決策機制對用戶需求或負載過重作出的事件響應[2]。當某軟件人社區(qū)負載過重時,就會向同網(wǎng)絡內的其他軟件人社區(qū)發(fā)送消息,請求遷移。每個軟件人社區(qū)的消息隊列由消息軟件人維護。消息隊列的節(jié)點數(shù)據(jù)結構描述如下:
struct sm_message{
list_head *next, *prev; //前后節(jié)點
char *content;//消息內容
int type;//消息類型
int prio; //優(yōu)先級別
time_t start_time;//收到時間
char *source_sm_comnt;//源社區(qū)名字
char *dest_sm_comnt;//目的社區(qū)名字
}
模塊軟件人的遷移可以將諸多復雜的問題交給內核的LKM機制去完成,從一定程度上降低了軟件人管理系統(tǒng)的復雜度和開銷。
在基于Linux LKM機制的軟件人系統(tǒng)中,軟件人的遷移就是可加載動態(tài)模塊的遷移。當驅動模塊軟件人被遷移時,先要保證該驅動沒有被其他資源所使用。下文所述的遷移都是在此前提下討論的。
如軟件人的注冊與注銷算法代碼所示,模塊軟件人的遷移可以分為三個主要步驟。當源節(jié)點的管理軟件人根據(jù)遷移策略,決定對某軟件人模塊進行遷移時,首先從源節(jié)點內核卸載遷移模塊,并向管理軟件人注銷該模塊。然后創(chuàng)建用做通信的socket,并通過創(chuàng)建的socket將要遷移的