場(chǎng)景
在應(yīng)用層面上需要新增員工,刪除員工,修改員工以及查詢操作。
而負(fù)責(zé)給應(yīng)用層提供接口的Core層將這些員工信息保存到文件里面。
思路
回顧下映射IO和內(nèi)存池的應(yīng)用
映射IO可以把一個(gè)文件映射到內(nèi)存上,通過(guò)操作這段內(nèi)存來(lái)達(dá)到修改文件的效果。
而內(nèi)存池(在這里只說(shuō)固定內(nèi)存池),就是一開(kāi)始先分配一塊內(nèi)存,當(dāng)別人需要的時(shí)候就拿出一小塊內(nèi)存給別人用。
首先Core層初始化的時(shí)候要得到文件路徑和結(jié)構(gòu)體大小,然后用映射IO得到一塊內(nèi)存,然后再把這段內(nèi)存作為內(nèi)存池來(lái)使用。
員工信息可以當(dāng)作一個(gè)結(jié)構(gòu)體,應(yīng)用層需要新增員工的時(shí)候,Core層就分配這個(gè)結(jié)構(gòu)體大小的內(nèi)存來(lái)給應(yīng)用層,從而達(dá)到將該員工寫入文件的效果。刪除也是類似。
還需要思考的問(wèn)題
1.Core層加載文件時(shí)要知道哪些塊是已經(jīng)在用,哪些塊還沒(méi)被使用,以及存儲(chǔ)的結(jié)構(gòu)體大小。
因此文件除了需要存應(yīng)用層存放的數(shù)據(jù)還需要額外的空間記錄別的信息。如圖。
2.當(dāng)DATA塊已經(jīng)存滿了,需要擴(kuò)充文件大小來(lái)存放新數(shù)據(jù)。新擴(kuò)充的那塊同樣需要額外的空間存放信息。
考慮到存放的結(jié)構(gòu)體都是固定大小的,因此UNIT_SIZE只需存放一次就好了。同樣,每次文件擴(kuò)充的大小也是固定的,每一塊能夠存放的單元個(gè)數(shù)也是固定的,COUNT只存一次就好了。
但是,即使這樣,DATA塊和DATA塊之間隔著一個(gè)STATUS塊,這樣子可能出現(xiàn)內(nèi)存不對(duì)齊的問(wèn)題。這個(gè)問(wèn)題在當(dāng)前這種設(shè)計(jì)下是不可避免的。
設(shè)計(jì)
我最終的設(shè)計(jì)并沒(méi)有去解決內(nèi)存不對(duì)齊的問(wèn)題,而是避開(kāi)了該問(wèn)題。如圖。
首先UNIT_SIZE和COUNT不是放在額外的空間,而是放在第一個(gè)DATA塊的第一個(gè)UNIT,而記錄DATA塊中每個(gè)UNIT的使用狀態(tài)的STATUS塊也不保存到文件,而是在Core層初始化的時(shí)候傳入應(yīng)用層的寫的方法來(lái)判斷每一個(gè)UNIT的狀態(tài)。
其他
代碼在公司電腦上面,所以就先不貼代碼了。
寫的不好的地方可以評(píng)論指點(diǎn)下。