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

2021-07-10 12:18:58 字數 4294 閱讀 9733

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

unsigned char type;          /* thread型別,共有8種 */

unsigned char add_type;     /* thread type */

struct thread *next;          /* 指向下一thread的指標,雙向鍊錶 */

struct thread *prev;          /* 指向前一thread的指標 */

struct thread_master *master;   /* 指向該thread所屬thread_master的指標 */

int (*func) (struct thread *);     /* event型別thread的函式指標 */

void *arg;                       /* event型別thread的引數 */

union

int val;                   /* event型別thread的第二個引數 */

int fd;                    /* read/write型別thread相應的檔案描述符 */

struct timeval sands;   /* 該thread的剩餘時間,timeval型別,此結構體定義在time.h中,有兩個元素,秒和微秒 */

} 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

struct thread *head;  /* 該執行緒佇列頭指標 */

struct thread *tail;    /* 該執行緒佇列尾指標 */

int count;             /* 該執行緒佇列元素數目 */

*thread_master

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

/* master of the theads. */

struct thread_master

//8種執行緒佇列

struct thread_list   read;

struct thread_list   write;

struct thread_list   timer;

struct thread_list   event;

struct thread_list   ready;

struct thread_list   unuse;

struct thread_list   background;

//3種檔案描述符

nps_fd_set      readfd;

nps_fd_set      writefd;

nps_fd_set      exceptfd;

//該thread_master所佔空間大小

unsigned long alloc;

/* zebra work mutex lock */

vos_mutex *mutexlock;

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是空的,那麼將會在步驟三到五之間無限迴圈。

1. defun(funcname,cmdname,cmd,str,helpstr)       定義命令的執行函式

2. defun_nosh(funcname,cmdname,cmdstr,helpstr)    定義vtysh不作處理的命令

3. defsh(daemon,cmdname,cmdstr,helpstr)                  定義在vtysh中實行的函式

4. defunsh(daemon,funcname,cmdname,cmdstr,helpstr)     1,3兩種情況結合

命令列使用

命令列使用 命令是由英文單詞的縮寫展示 只要了解了英文單詞和縮寫規則 就可以迅速掌握 首先了解單詞含義 檔案 file 新建 make 刪除 remove 移動 move 複製 copy 羅列 list 鏈結 link 查詢 find 觸控 touch 改變 change 發出回音 重複 echo ...

命令列使用

命令是由英文單詞的縮寫展示 只要了解了英文單詞和縮寫規則 就可以迅速掌握 首先了解單詞含義 檔案 file 新建 make 刪除 remove 移動 move 複製 copy 羅列 list 鏈結 link 查詢 find 觸控 touch 改變 change 發出回音 重複 echo 目錄 資料夾...

命令列使用

命令是由英文單詞的縮寫展示 只要了解了英文單詞和縮寫規則 就可以迅速掌握 首先了解單詞含義 檔案 file 新建 make 刪除 remove 移動 move 複製 copy 羅列 list 鏈結 link 查詢 find 觸控 touch 改變 change 發出回音 重複 echo 目錄 資料夾...