quagga執行緒機制

2021-06-17 18:12:03 字數 2706 閱讀 5190

a) quagga執行緒機制概述

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

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

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

b) 執行緒管理具體分析

i) 首先對重要資料結構進行介紹:

*thread

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

/* thread itself. */

struct thread

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

struct cpu_thread_history *hist;    /* 統計thread對cpu的使用情況 */

char *funcname;

};*thread_list

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

struct thread_list

;*thread_master

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

/* master of the theads. */

struct thread_master

;iii) thread的生命週期

注意:所有的thread queue都是fifo型別的queue。

步驟一:當quagga建立乙個新的thread master的時候,它會呼叫

thread_add_read、thread_add_write或thread_add_timer,這取決於建立的thread的型別:

thread_add_read新增乙個thread到read queue,主要負責從外部某個socket讀入資料;

thread_add_write新增乙個thread到read queue,主要負責從外部某個socket寫入資料;

thread_add_timer新增乙個thread到timer queue,主要用於timing乙個事件(如定期更新路由表或是定期傳送資料報等)。

步驟二:thread_new用於為乙個新的thread分配記憶體空間。它首先會檢查在unuse queue中是否存在任何型別為unuse的thread,如果有的話,那麼它會將它當做這個新的 thread,否則就會呼叫記憶體分配函式為這個新的thread分配記憶體空間。最後,thread_new呼叫thread_all_list新增這個新的thread到它應該在的thread queue中。

步驟三:quagga不停的在event queue中獲取就緒的thread然後執行它們,一旦該thread被執行了,則該thread的型別就被設定為unuse,同時它也就會被轉移到unuse queue中。

步驟四:如果event queue為空,則quagga執行select函式來監視檔案描述符readfds、writefds和exceptfds,一旦監視到某個描述符準備就緒,就將該描述符對應的thread加入到ready queue中。

步驟五:當進行select操作之後,在read queue中的所有readfds標誌為已經就緒的thread,會被移動到event queue;而在write queue中的所有writefds標誌已經就緒的thread,會被移動到event queue;但是其他沒有為i/o操作準備就緒的thread則依然老老實實的呆在原來自己該呆的queue中。一旦原來在read queue或write queue中的thread被轉移到event queue,那麼該thread的readfds和writefds就會被清掉。

步驟六:只有timer thread使用它自己的timer,當timer到時間了之後,該timer thread就會被轉移到event queue中。

步驟七:位於event queue頭部的thread會被取出來然後被執行,如果event queue是空的,那麼將會在步驟三到五之間無限迴圈。

quagga執行緒機制及命令列使用

a quagga執行緒機制概述 quagga中的執行緒是分佇列排程的,每個佇列以乙個鍊錶的方式實現。執行緒佇列可以分成5個佇列 event timer ready read write。佇列的優先順序由高到低排列。但是,read和write佇列並不參與到優先順序的排列中,實際操作時,如果read和w...

安裝使用quagga

好吧,因為某些原因,需要學習一下quagga.感覺對於網路通訊不那麼了解的我來說還是蠻困難的,這裡簡單記錄備忘一下 quagga簡單說就是乙個路由套件,可以讓普通機器像路由器一樣工作 實現很多網路相關的協議bgp,ospf,rip等等 因為牽扯到bgp建鄰居和路由之類的問題,統一使用vagrant提...

quagga安裝配置

ubuntu 14.04 16.04 安裝配置quagga apt get install quagga在linux系統中,路由表和 資料報的功能都是linux核心所提供。在我們的ubuntu14.04系統中,預設情況下是沒有開啟資料報 功能的。開啟方式 echo net.ipv4.conf.all...