zebra執行緒管理原始碼簡析

2021-07-31 04:30:32 字數 2536 閱讀 7382

zebra這個軟體包整體結構大致可分為兩大塊:協議模組和守護程序模組。協議模組實現各協議的功能,各協議以子模組的形式載入到zebra中;守護程序模組的功能主要是管理各協議的信令傳輸、表項操作、系統操作呼叫等事務,為各協議提供底層資訊以及相關的硬體處理等功能支援。zebra與各協議的互動採用的是c-s模式,在每個協議子模組中均有乙個client端與守護程序模組中的server端互動,它們所使用的socket為zebra內部使用的socket,不與外部互動。

zebra中的執行緒是分佇列排程的,每個佇列以乙個鍊錶的方式實現。執行緒佇列可以分成五個佇列:event、timer、ready、read、write。佇列的優先順序由高到低排列。但是,read和write佇列並不參與到優先順序的排列中,實際操作時,如果read和write佇列中的執行緒就緒,就加入ready佇列中,等待排程。排程時,首先進行event佇列中線程的排程,其次是timer和ready。

實際上,zebra中的執行緒是「假執行緒」,它並沒有實現執行緒中的優先順序搶占問題。在zebra的執行緒管理中,有個虛擬的時間軸,必須等前一時間的執行緒處理完,才看下一時間的執行緒是否觸發。由於電腦處理速度較快且處理每個執行緒的時間間隔較小,所以處理其多執行緒來可以打到類似「並行處理」的效果。

zebra原始碼中有關執行緒管理的各個函式放置於zebra-0.95a\lib資料夾的thread.h和thread.c兩個檔案中。

這是執行緒佇列中每乙個單個執行緒的**描述,執行緒佇列被描述成雙向鍊錶的形式,thread結構體是雙向鍊錶的元素。共有六種執行緒:read、write、timer、event、ready、unused。因此,執行緒佇列也有六種。

struct thread

u;rusage_t ru;                    /* 詳細用法資訊,rusage這個巨集在該thread有用法描述時定義為rusage型別,描述其詳細程序資源資訊,沒有用法描述時定義為timeval型別*/

};乙個thread_list結構體描述乙個thread雙向鍊錶,也即乙個程序佇列。

struct thread_list ;

總的執行緒管理結構體,裡面存有六種執行緒佇列,三種檔案描述符以及占用空間資訊。

struct thread_master ;

下面給出了zebra關於執行緒管理的相關函式的簡要功能介紹。

為建立乙個新的thread_master結構體動態開闢一塊記憶體空間。

在list雙向鍊錶尾部插入乙個新的thread。

在函式引數point所指向的thread前面插入乙個新的thread。

刪除引數中指定的thread。

向指定thead_master中的unused鍊錶尾部插入新thread。

從記憶體中釋放掉指定thread_master中的指定thread鍊錶所佔空間。

徹底釋放指定thread_master所佔記憶體空間。

若指定thread鍊錶中非空,刪除該煉表頭指標所指thread,並將其返回,即從執行緒佇列中取出乙個執行緒。

判斷指定thread鍊錶是否為空。

得到指定執行緒的剩餘時間。

若指定thread_master中的unuse鍊錶非空,從該佇列中取出乙個thread,根據引數初始化並返回之。否則,給該thread_master多開闢一塊空間給新的thread,根據引數初始化該thread並返回之。

根據所給引數在指定thread_master中新增並初始化乙個read型別的thread並返回之。

根據所給引數在指定thread_master中新增並初始化乙個write型別的thread並返回之。

根據所給引數在指定thread_master中新增並初始化乙個timer型別的thread。若timer鍊錶不要求排序,則直接返回新thread,若要求排序,則將新thread插入到佇列的相應位置後再返回之。

根據所給引數在指定thread_master中新增並初始化乙個event型別的thread並返回之。

刪除指定thread,刪除後將其型別置為thread_unused,並將其插入到該thread_master的unuse鍊錶中。

將指定thread_master的event鍊錶中與引數中arg相匹配的thread刪除。

找出指定thread_master的timer鍊錶中最小的剩餘時間並將其返回。

將指定thread的值賦給thread型別的fetch,然後將其型別置為thread_unused,並將其插入unuse鍊錶,返回fetch。

將指定thread鍊錶中的元素取出插入到該thread_master的ready鍊錶中,返回該鍊錶中插入元素的個數。

若指定thread_master的event佇列非空取出其頭元素並用run函式處理。取出並用run函式處理timer佇列中每乙個之前建立的執行緒。若指定thread_master的ready佇列非空取出其頭元素並用run函式處理。拷貝該thread_master的檔案描述符。將read和write鍊錶插到ready鍊錶中,再從ready鍊錶取頭元素用run函式處理。如此無限迴圈下去直到所有程序都處理完。

得到該程序所耗費的時間。

執行該thread中的功能函式,如果該thread持續時間超過cpu規定的獨佔時間,發出警告。

根據引數建立乙個event型別的thread並用thread_call()函式對其進行處理。

zebra執行緒管理原始碼簡析(二)

下面給出了 zebra 關於執行緒管理的相關函式的簡要功能介紹。為建立乙個新的 thread master 結構體動態開闢一塊記憶體空間。在list 雙向鍊錶尾部插入乙個新的 thread 在函式引數 point 所指向的 thread 前面插入乙個新的 thread 刪除引數中指定的 thread...

Sample BSP原始碼簡析

ifndef bsp h define bsp h include sdksample.h include filesystemlayer.h filesystemlayer.h 用來處理檔案系統的目錄 路徑等資訊 後面的mfslayer getconfigfilepath就是用了該檔案中定義的類。...

libc hashtable 原始碼簡析

本文分析的是 中截止至 2016 年 1 月 30 日最新的libc libc 中,hashtable的實現為鏈式結構。在教科書 introduction to algorithm 3rd edition 中,介紹的實現是由乙個陣列作為buckets,每個陣列中儲存乙個鍊錶。但是libc 中,使用乙...