hz_meeting_學習筆記1_後臺通訊·通用鏈表·結構體實現隱藏

我超喜歡這個討論會啊~每週五下午三點半。。。。

會議1: interbank2結構,泛型鏈表的實現。

interbank2結構

今天週五又開會啦~會上厲工(厲華,很可愛的以爲70後啊~)描述了interbank2的結構和原理,基本上涉及的是多進程,進程間通信和互斥訪問資源的問題。以及一些細節設計,雖然自己接觸進程線程和通信的只是不多~但還是可以聽得懂的。

 

其中,

    每個子進程通過信號量進入臨界區,從而保證任何時刻有且只有一個進程在accept監聽。其中當進程進入臨界區的選擇是通過操作系統完成。其中每個進程通過一個共享內存與管理進程通信,比如管理進程可以從共享內存中知道進程的狀態,進程已經完成的任務數以及其他一些信息。同時管理進程也可以通過這種方式指示進程做什麼事(子進程分爲,空閒,監聽和忙碌狀態,每個狀態轉換的時候都會去讀一下共享內存中自己對應的內容,同時也會更改一些自己的狀態和日誌等,比如狀態)。總之這塊共享內存是管理進程與子進程的交互之處。其中如果當管理進程檢查狀態發現某進程的執行人物總數大於Max_mission的時候就會向該進程發出kill信號。要求其銷燬,這樣做的原因是如果應用端的人員使用的malloc等動態分配內存的時候忘記釋放則kill之後會自動釋放,提高安全性。同時管理進程也可以通過該共享內存中進程狀態來維持相對穩定的空閒進程數目來應對後續任務(多則殺,少則加,但是無論是減還是加都有上限,這個可以由管理進程來讀取一個配置文件獲得相應的信息,有必要子進程也配備一個配置文件麼?用途?)。

這個的好處:

1.       只有一個工作進程纔去監聽端口,這樣就不會有管理進程監聽然後傳遞給工作進程套接字描述符這個步驟(這個步驟很麻煩,不能直接傳遞套接字描述符)。

2.       還有就是當一個監聽到達的時候,只會有一個進程返回,改寫狀態,退出臨界區,然後由操作系統任意選一個空閒進程獲得臨界區。(也可以用隊列的形式代替臨界區,優劣?!)

3.       可以一定程度上覆用fork資源(這是一個耗時和資源的操作)。

4.       安全性,malloc的解決方法。

泛型鏈表的實現

參考unixm_queue的實現;

1.       使用節點掛節點的實現方式:

 

     其中有兩個必須成員void *memberfree_func_ptr函數指針。

這樣實現的方式是可以掛載不同的數據類型的節點,並且釋放函數也是自己掛在的的。可以包含malloc的結構中包含一個指針,指向又一個通過malloc的獲得的內存對象。這樣只可以調用掛在的free函數還實現釋放。這樣纔可以通過一個通用的方式像所有情況提供一個統一的方法,即該方法不知道應用的內存管理方式。雖然釋放malloc的內存不需要知道其類型,只需要知道首地址即可(回憶free()的原理,首地址向前偏移一個結構體,然後is_valid = 1的實現)。

其中hz_bank的實現是通過提供一個分配子來進行內存分配。從而可以控制用戶行爲,而且同時可以自己獲得需要的信息而不用應用開發人員來進行管理等。比如獲得free_func_ptr函數。就是通過分配子來獲得的。從而只需要從分配子中取出其即可(這個不對吧?函數怎麼能自動生成?除非只是給出了一些需要釋放的const指針數組?)。但是思想還是可以採納的:即用戶通過平臺提供的函數來完成其需求,同時平臺在未受干預的情況下獲得對這個需求的必要後續處理信息(一是安全的平臺管理,而是省去了開發人員的細節處理)。然後再提供統一的函數來獲取一個節點,下一個節點等函數。

 

2.       就是使用offsetof來進行,但是這種情況需要結構必須掛接這個結構體才行。詳細設計參考。m_queuq

 

這種嵌套設計實際上是通過嵌套的結構體作爲鏈表來進行節點的查找等工作,由於大結構體和小結構體(通用)的首地址一樣,所以只需要通過通用結構體進行查找等操作,然後進行適當的類型轉換即可獲得大結構體(實際中的數據攜帶者),同時,可以用一個char[x]數據在大結構體中保存類型信息。然後應用通過無數個if來判斷即可獲得類型信息。

還有什麼好發放來進行類型信息的攜帶麼?

類型信息隱藏C實現

將結構信息寫到.c中,然後在.h中寫上相應的方法和一個結構指針即可。使用的時候將指針傳給函數。然後便可獲得相應的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章