一種Java卡空閑塊管理方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及智能卡領(lǐng)域,具體涉及一種Java卡空閑塊管理方法。
【背景技術(shù)】
[0002] 隨著金融電子化的全面發(fā)展,為解決用戶對(duì)一卡多用的需要,支持多應(yīng)用的Java 卡得到了越來越多的普及應(yīng)用。Java卡作為一種智能卡,其存儲(chǔ)體系主要由讀寫存儲(chǔ)器 (RAM)、只讀存儲(chǔ)器(ROM)和可擦寫編程存儲(chǔ)器(EEPROM)組成,其中RAM用于存放運(yùn)算過程 中的中間數(shù)據(jù)和結(jié)果數(shù)據(jù),ROM用于存放智能卡的操作系統(tǒng),EEPROM是智能卡的主要存儲(chǔ) 器,用于存放卡人的個(gè)人信息及發(fā)行單位的信息和應(yīng)用數(shù)據(jù)。
[0003] 隨著業(yè)務(wù)的多樣化變化,Java卡產(chǎn)品在投放使用后,EEPROM中存儲(chǔ)的數(shù)據(jù)經(jīng)常發(fā) 生變動(dòng),需要提供合理的存儲(chǔ)空間管理方法,以達(dá)到高效地申請(qǐng)存儲(chǔ)空間,有效地利用存儲(chǔ) 空間的目的,提升Java卡的應(yīng)用性能?,F(xiàn)有的Java卡對(duì)于存儲(chǔ)空間管理通過保存空閑塊 信息進(jìn)行管理,但是在申請(qǐng)和回收空間的時(shí)候,通常采用順序遍歷的機(jī)制,效率較低,交易 的時(shí)間較長(zhǎng),因此,提出一種高效的Java卡空閑塊管理方法是有必要的,尤其是對(duì)性能要 求較高的應(yīng)用中更需要高效的Java卡空閑塊管理方法。
【發(fā)明內(nèi)容】
[0004] 為解決上述問題,本發(fā)明的目的是提供一種Java卡空閑塊管理方法。
[0005] 本發(fā)明為實(shí)現(xiàn)上述目的,通過以下技術(shù)方案實(shí)現(xiàn): 一種Java卡空閑塊管理方法,Java卡通過空閑塊信息表存儲(chǔ)EEPROM中空閑塊的信息, 空閑塊信息表由結(jié)點(diǎn)組成,所述的結(jié)點(diǎn)包括空閑塊信息、空閑塊個(gè)數(shù)和后繼結(jié)點(diǎn)地址;結(jié)點(diǎn) 間通過后繼結(jié)點(diǎn)地址形成鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),所述的空閑塊信息包含地址和大小兩部分,在16 位芯片中占用的存儲(chǔ)空間為4字節(jié),32位芯片中占用的存儲(chǔ)空間為8字節(jié);每個(gè)結(jié)點(diǎn)在連 續(xù)的空間內(nèi)最多存儲(chǔ)MAX_TBL_BLOCK_SIZE個(gè)空閑塊信息,空閑塊信息按照大小順序存儲(chǔ); 預(yù)先從EEPROM為空閑塊信息表的第一個(gè)結(jié)點(diǎn)分配空間,當(dāng)空閑塊個(gè)數(shù)超過當(dāng)前結(jié)點(diǎn)所能 存儲(chǔ)的最大數(shù)量后,將從EEPROM為后繼結(jié)點(diǎn)申請(qǐng)存儲(chǔ)空間;為數(shù)據(jù)申請(qǐng)存儲(chǔ)空間時(shí),遍歷 空閑塊信息表并選擇大小合適的空閑塊;釋放數(shù)據(jù)占用的存儲(chǔ)空間時(shí),采用塊合并排序算 法將釋放的存儲(chǔ)空間合并到合適的空閑塊中,并且將空閑塊信息按照大小排序。
[0006] 為進(jìn)一步實(shí)現(xiàn)本發(fā)明的目的,還可以采用以下技術(shù)方案: 一種Java卡空閑塊管理方法,包括如下步驟: (1) 在EEPROM中預(yù)先為空閑塊信息表的第一個(gè)結(jié)點(diǎn)分配存儲(chǔ)空間,當(dāng)空閑塊個(gè)數(shù)超過 當(dāng)前結(jié)點(diǎn)所能存儲(chǔ)的最大數(shù)量MAX_TBL_BLOCK_SIZE后,從EEPROM為后繼結(jié)點(diǎn)申請(qǐng)存儲(chǔ)空 間; (2) 在EEPROM中為數(shù)據(jù)申請(qǐng)存儲(chǔ)空間時(shí),采用最佳大小塊匹配算法,遍歷空閑塊信息 表并選擇大小合適的空閑塊,所述的最佳大小塊匹配算法為折半算法; (3) 釋放數(shù)據(jù)占用的存儲(chǔ)空間時(shí),采用塊合并排序算法將釋放的存儲(chǔ)空間合并到合適 的空閑塊中,并且將空閑塊信息按照大小排序。
[0007] 優(yōu)選的,最佳大小塊匹配算法包括如下步驟: ⑴依次遍歷空閑塊信息表中的每個(gè)結(jié)點(diǎn); ⑵對(duì)當(dāng)前結(jié)點(diǎn)中的空閑塊信息,采用折半算法進(jìn)行遍歷,具體為: ① 確定開始?jí)K位置,根據(jù)有效空閑塊個(gè)數(shù)計(jì)算中間塊序號(hào),然后通過如下循環(huán)處理確 定開始?jí)K位置: A. 如果中間塊大小等于待分配空間大小,則查找成功,算法執(zhí)行完畢; B. 如果中間塊大小大于待分配空間大小,則重新計(jì)算左側(cè)部分的中間塊序號(hào),直到中 間塊大小小于或等于待分配空間大小為止; C. 如果中間塊大小小于待分配空間大小,則重新計(jì)算右側(cè)部分的中間塊序號(hào),直到中 間塊大小小于或等于待分配空間大小為止; ② 如果當(dāng)前塊大小小于待分配空間大小,則選取后續(xù)空閑塊作為當(dāng)前塊; ③ 如果中間塊大小等于待分配空間大小,則查找成功,算法執(zhí)行完畢; ④ 如果當(dāng)前塊大小大于待分配空間大小,則進(jìn)行如下操作: A. 如果存在備選塊,則比較當(dāng)前塊大小和備選塊大小,如果當(dāng)前塊大小小于備選塊大 小,則標(biāo)識(shí)當(dāng)前塊為備選塊,并記錄當(dāng)前塊大??; B. 如果不存在備選塊,則標(biāo)識(shí)當(dāng)前塊為備選塊,并記錄當(dāng)前塊大小,跳出當(dāng)前結(jié)點(diǎn),進(jìn) 入下一結(jié)點(diǎn)的空閑塊遍歷; ⑶遍歷完所有結(jié)點(diǎn)的空閑塊信息后,將標(biāo)識(shí)的備選塊地址信息返回。
[0008] 優(yōu)選的,塊合并排序算法包括以下步驟: ⑴依次遍歷空閑塊信息表中的每一個(gè)結(jié)點(diǎn); ⑵對(duì)當(dāng)前結(jié)點(diǎn)中的空閑塊信息進(jìn)行遍歷,具體為: ① 如果釋放塊尾地址等于當(dāng)前塊始地址,則進(jìn)行如下操作: A. 如果合并狀態(tài)為真,則進(jìn)一步合并,即將上次合并塊信息的大小累加當(dāng)前塊大小,并 修改當(dāng)前塊信息中的地址為〇,以表示該地址無效,所述的合并狀態(tài)為真即釋放塊始地址是 某空閑塊尾地址,進(jìn)行過一次合并; B. 如果合并狀態(tài)為假,則將當(dāng)前塊信息保存?zhèn)溆?,將?dāng)前塊信息大小累加釋放塊大小, 將當(dāng)前塊信息的地址改寫為釋放塊始地址,并設(shè)置合并狀態(tài)為真; ② 如果釋放塊始地址等于當(dāng)前塊尾地址,則進(jìn)行如下操作: A. 如果合并狀態(tài)為真,則進(jìn)一步合并,將當(dāng)前塊信息的大小累加上次合并塊最終大小, 并修改上次合并塊信息中的地址為0,以表示該地址無效,所述的合并狀態(tài)為真即釋放塊尾 地址是某空閑塊始地址,進(jìn)行過一次合并; B. 如果合并狀態(tài)為假,則將當(dāng)前塊信息保存?zhèn)溆?,將?dāng)前塊信息的大小累加釋放塊大 小,并設(shè)置合并狀態(tài)為真; ⑶如果合并狀態(tài)為假,則需要增加釋放塊到空閑塊信息表中:對(duì)空閑塊信息表的所有 結(jié)點(diǎn)遍歷,如果當(dāng)前結(jié)點(diǎn)的空閑塊個(gè)數(shù)不超過MAX_TBL_BLOCK_SIZE,則依次遍歷每個(gè)空閑 塊,找到合適位置,插入該空閑塊信息; ⑷如果合并狀態(tài)為真,則需要調(diào)整位置,確保空閑塊按大小由小到大排序,可采用冒泡 算法,從當(dāng)前合并塊開始往后比較,如果合并塊大小大于后繼空閑塊大小,則兩個(gè)塊交換位 置,直到不滿足條件為止。
[0009] 本發(fā)明的優(yōu)點(diǎn)在于: 本發(fā)明按塊大小由小到大的順序存儲(chǔ)方式存儲(chǔ)空閑塊信息,這樣在申請(qǐng)存儲(chǔ)空間時(shí), 可以快速查找到存儲(chǔ)位置,大大提高執(zhí)行效率;在Java卡的實(shí)際使用中只有在卸載包或刪 除應(yīng)用的時(shí)候才會(huì)釋放存儲(chǔ)空間,所以釋放空閑塊的排序算法不會(huì)影響金融應(yīng)用的交易時(shí) 間;在卡片個(gè)人化、有較高運(yùn)行速度要求的特殊金融應(yīng)用中,本發(fā)明的最佳大小塊匹配算法 能快速響應(yīng)申請(qǐng)空間的請(qǐng)求,從而顯著提升Java卡的運(yùn)行效率。
【附圖說明】
[0010] 圖1為空閑塊信息表存儲(chǔ)結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0011] -種Java卡空閑塊管理方法,Java卡通過空閑塊信息表存儲(chǔ)EEPROM中空閑塊 的信息,空閑塊信息表由結(jié)點(diǎn)組成,所述的結(jié)點(diǎn)包括空閑塊信息、空閑塊個(gè)數(shù)和后繼結(jié)點(diǎn)地 址;結(jié)點(diǎn)間通過后繼結(jié)點(diǎn)地址形成鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),所述的空閑塊信息包含地址和大小兩部 分,在16位芯片中占用的存儲(chǔ)空間為4字節(jié),32位芯片中占用的存儲(chǔ)空間為8字節(jié)海個(gè) 結(jié)點(diǎn)在連續(xù)的空間內(nèi)最多存儲(chǔ)MAX_TBL_BLOCK_SIZE個(gè)空閑塊信息,空閑塊信息按照大小 順序存儲(chǔ);預(yù)先從EEPROM為空閑塊信息表的第一個(gè)結(jié)點(diǎn)分配空間,當(dāng)空閑塊個(gè)數(shù)超過當(dāng)前 結(jié)點(diǎn)所能存儲(chǔ)的最大數(shù)量后,將從EEPROM為后繼結(jié)點(diǎn)申請(qǐng)存儲(chǔ)空間;為數(shù)據(jù)申請(qǐng)存儲(chǔ)空間 時(shí),遍歷空閑塊信息表并選擇大小合適的空閑塊;釋放數(shù)據(jù)占用的存儲(chǔ)空間時(shí),采用塊合并 排序算法將釋放的存儲(chǔ)空間合并到合適的空閑塊中,并且將空閑塊信息按照大小排序。
[0012] 為進(jìn)一步實(shí)現(xiàn)本發(fā)明的目的,還可以采用以下技術(shù)方案: 一種Java卡空閑塊管理方法,包括如下步驟: (1) 在EEPROM中預(yù)先為空閑塊信息表的第一個(gè)結(jié)點(diǎn)分配存儲(chǔ)空間,設(shè)置空閑塊個(gè)數(shù)為 1,設(shè)置后繼結(jié)點(diǎn)地址為〇,設(shè)置第一塊空閑塊地址信息為當(dāng)前EEPROM空閑區(qū)域的首地址, 大小為EEPROM所有空閑區(qū)域的大小,設(shè)置剩余所有空閑塊信息,包括地址和大小為0 ; 空閑塊信息表采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)和順序存儲(chǔ)結(jié)構(gòu)的復(fù)合存儲(chǔ)模式存儲(chǔ)當(dāng)前EEPROM中 空閑塊的信息,具體為: ① 空閑塊信息表的每個(gè)結(jié)點(diǎn)由空閑塊信息、空閑塊個(gè)數(shù)和后繼結(jié)點(diǎn)地址組成,結(jié)點(diǎn)之 間通過后繼結(jié)點(diǎn)地址形成鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),空閑塊信息包含地址和大小兩部分,在16位芯片 中占用4字節(jié)的存儲(chǔ)空間,在32位芯片中占用8字節(jié)的存儲(chǔ)空間; ② 每個(gè)結(jié)點(diǎn)最多存儲(chǔ)MAX_TBL_BLOCK_SIZE個(gè)空閑塊信息,這些空閑塊信息在連續(xù)的 空間內(nèi)存儲(chǔ),并且按大小排序,采用順序存儲(chǔ)結(jié)構(gòu);當(dāng)空閑塊個(gè)數(shù)超過當(dāng)前結(jié)點(diǎn)所能存儲(chǔ)的 最大數(shù)量MAX_TBL_BLOCK_SIZE后,從EEPROM為后繼結(jié)點(diǎn)申請(qǐng)存儲(chǔ)空間; (2) 在EEPROM中為數(shù)據(jù)申請(qǐng)存儲(chǔ)空間時(shí),采用最佳大小塊匹配算法,遍歷空閑塊信息 表并選擇大小合適的空閑塊,所述的最佳大小塊匹配算法為折半算法;為得到最佳空閑塊, 將以大小完全匹配或者最接近為目標(biāo),如果遇到匹配大小的空閑塊,則選擇成功,否則將遍 歷剩余空閑塊信息,直到找到大小最接近的空閑塊為止; (3) 釋放數(shù)據(jù)占用的存儲(chǔ)空間時(shí),采用塊合并排序算法將釋放的存儲(chǔ)空間合并到合適 的空閑塊中,并且將空閑塊信息按照大小排序;在釋放空間的時(shí)候,如果出現(xiàn)釋放塊和某空 閑塊首尾相