模塊化管理和設計
在Linux中驅動(dòng)程序的添加和移除就是典型的模塊化操作,這樣也就方便了基本的操作。這樣通過(guò)模塊的注冊和注銷(xiāo)操作就能夠實(shí)現模塊的添加。而且在Linux中模塊的注冊和釋放都是采用同樣的函數實(shí)現。因此我們可以想象在我們的模塊化設計中也可以采用類(lèi)似的方式實(shí)現。也就是通過(guò)統一的注冊方式。但是具體的模塊操作采用回調函數的形式,這與linux驅動(dòng)中的file_operations結構體具有異曲同工之妙,也就是通過(guò)一個(gè)結構體實(shí)現不同的函數接口,而基本的實(shí)現過(guò)程需要我們在設計驅動(dòng)的過(guò)程中進(jìn)行實(shí)現,也就是采用函數指針的方式進(jìn)行調用,即實(shí)現回調。這樣我們就能實(shí)現不同模塊的具體操作。
模塊的管理應該包含兩個(gè)過(guò)程:注冊和注銷(xiāo),同時(shí)注冊又包括初始化和啟動(dòng),注銷(xiāo)包括停止和撤銷(xiāo)操作。因此可以采用一個(gè)4種狀態(tài)的狀態(tài)圖表示。
但是很多情況下的模塊化存在一定的依賴(lài)關(guān)系,這與我們在寫(xiě)Makefile中的依賴(lài)一樣,需要創(chuàng )建一些其他的模塊才能創(chuàng )建當前模塊。為了解決這種問(wèn)題,我們通常對模塊進(jìn)行分層設計。也就是將存在一定依賴(lài)關(guān)系的模塊放在不同的層次上,通過(guò)逐層逐層的初始化方式進(jìn)行模塊初始化。這樣就能較好的解決依賴(lài)問(wèn)題。但是有時(shí)候同層也會(huì )存在一定的依賴(lài)關(guān)系,這時(shí)我們可以采用分級的方式解決一定的依賴(lài)關(guān)系。因此我們可以將依賴(lài)關(guān)系最高的模塊放在最低的層次上,先進(jìn)行初始化,這樣方便其他的模塊對其進(jìn)行依賴(lài)。然后在對其他的層次初始化。
在實(shí)際的開(kāi)發(fā)中通常采用不同三層模式,即:平臺層(這層的模塊對象先初始化),框架層(第二初始化),應用層(最后初始化)。同層的依賴(lài)關(guān)系也可以采用分級(本質(zhì)與分層是相同的)解決。
但是在撤銷(xiāo)的過(guò)程中我們需要注意的是,撤銷(xiāo)的順序必須與初始化的順序相反,這也是依賴(lài)關(guān)系所導致的,只有先撤銷(xiāo)后初始化的模塊才不會(huì )破壞對其他模塊的影響。
模塊的管理是模塊化設計中非常重要的一環(huán)節,采用回調函數的方式能夠很好的解決不同模塊的初始化操作。因此通用的函數接口也是不斷總結和分析得到的。
鏈表在模塊化管理中有很重要的作用,記得在Linux中鏈表中不存在內容,只是兩個(gè)指針,但是通常將鏈表嵌入到模塊結構體中就能實(shí)現不同模塊的級聯(lián)。
分層的方式下可以采用鏈表將該層中所有的模塊對象關(guān)聯(lián)起來(lái),也就是將一個(gè)簡(jiǎn)單的鏈表結構體節點(diǎn)嵌入到模塊結構體中,通常放在第一個(gè)元素的位置上,這樣就可以通過(guò)鏈表指向的地址表示模塊的地址(第一個(gè)元素的地址和結構體的地址是相同的這一原理)。當然也可以不放在第一個(gè)元素的位置上,這在 linux源碼中經(jīng)??砂l(fā)現。
- typedef struct list_node
- {
- struct list*prev;
- struct list*next;
- }list_node;
- typedef struct list
- {
- struct list*prev;
- struct list*next;
- intlist_count;
- }list;
- typedefstruct module_object
- {
- list_node _node;
- ....
- }module_object;
模塊和層次的實(shí)現可以采用枚舉型結構事先安排好所有的模塊和所需要的層次,但是最好在其中設置相應的統計參數,便于參數的檢查。
比如:
- typedef enum
- {
- /*不同的模塊*/
- module0,
- module1,
- module2,
- ...
- moduleN-1,
- /*統計模塊的總數*/
- module_count,
- /*記錄最后的一個(gè)標號*/
- module_last=module_count-1,
- }modules;
- typedef enum
- {
- //platform layer,平臺層分級
- PLayer0,
- PLayer1,
- ...
- PLayerM-1,
- //framework layer,框架層分級
- FLayer0,
- FLayer1,
- ...
- FLayerN-1,
- //application layer,應用層分級
- ALayer0,
- ALayer1,
- ...
- ALayerT-1,
- //統計層數
- layer_count,
- layer_last=layer_count-1,
- }Layer;
上面就能實(shí)現分層和模塊的管理,通過(guò)下標就能訪(fǎng)問(wèn)具體的層和具體的模塊。當然這些都需要我們在實(shí)際的設計中首先規劃好所有的層次和模塊關(guān)系。
本文引用地址:http://dyxdggzs.com/article/201612/324501.htm其實(shí)反過(guò)來(lái)看看linux的模塊化管理真的是做的非常好,因此多去理解linux源碼對我們的軟件設計有很大的提高,重要的是思想。
評論