基于VxWorks的全IP開發平臺進程通信處理機制
不同處理器間的進程通信流程如圖3所示,下面根據不同的對話方式分別描述通信處理流程。本文引用地址:http://www.104case.com/article/153524.htm
①點對點通信。每個需要通信的處理器之間維護一條TCP連接,所有連接組成連接表。進程通過接口發送的消息首先掛在相應的連接的發送隊列中。通信任務在連接表中的所有連接上監測鏈路狀態,在連接寫就緒時依序發送連接發送隊列中的消息,在連接讀就緒時接收連接上的消息并向上層轉發,在連接異常時告警并恢復鏈路狀態,在檢查報到達的時候將鏈路丟失的檢查報清零。
②多對多通信。使用一個公用的UDP套接口,發送時指定協議類型為不可靠傳輸協議的時候,根據邏輯地址查找到對應的IP地址,直接從UDP套接口上發送出去。組播任務同樣守護在UDP套接口上,當套接口讀就緒的時候接收消息并向上層轉發。
③組播。采用靜態分組的方法,每一個組播組對應一個到組播地址,所有這種對應關系組成分組表。每一處理器可以加入特定組播組,也可以隨時脫離組播組。組播任務守護在組播組表的組播套接口上,在套接口讀就緒時接收消息并向上層轉發。進程直接在組播套接字上發送消息。
④廣播。分組表中有一個特殊項用作廣播,該組成員為系統內所有處理器,組播任務在該項上守護,進行和上面相同的處理。
⑤處理器內廣播。向同一個進程類型的實例分別發送一條消息的拷貝。
消息的派發過程如圖4所示。調度任務從自己的郵箱接收消息,并負責向各個進程的消息隊列中派發,在派發的過程中區別消息的類型。根據消息類型描述處理流程,派發同步應答消息時,將目標進程轉入就緒狀態,設置解除阻塞原因為應答到;派發同步超時消息時,將目標進程轉入就緒狀態,設置解除阻塞原因為同步超時;派發延時結束消息時,將目標進程轉入就緒狀態,設置解除阻塞原因為延時結束;派發其他類型的消息時,將消息掛到目標進程消息隊列尾部,如果目標進程因為沒有消息而阻塞,將目標進程轉入就緒狀態。
2.2 TCP連接狀態機設計
TCP連接的狀態記錄在TCP連接控制塊的狀態域里面,本端上層應用發起TCP連接建立請求時,TCP連接的狀態遷移如圖5所示。①沒有激活狀態:接收到來自上層應用的連接發起請求后,向對端發起連接,進入等待寫就緒狀態。②等待寫就緒狀態:如果接收到本端套接字的寫就緒事件,向對端發送檢查報,進入等待對端檢查報狀態;如果接收到對端連接請求(連接請求1)并且對端IP地址比自己的IP地址小,拒絕請求,繼續等待;如果接收到對端連接請求(連接請求2)并且對端IP地址比自己的IP地址大,接收請求,終止本端發起的連接過程,啟動連接接收的狀態機。③等待檢查報狀態:收到檢查報后,連接成功,進入工作狀態;如果接收到對端連接請求(連接請求1)并且對端IP地址比自己的IP地址小,拒絕請求,繼續等待;如果接收到對端連接請求(連接請求2)并且對端IP地址比自己的IP地址大,接收請求,終止本端發起的連接過程,啟動連接接收的狀態機。④工作狀態:如果收到數據收發請求,則進行數據收發,并保持狀態;如果收到連接的關閉請求,則關閉本連接,轉到連接沒有激活狀態;如果收到對端的連接建立請求,則啟動連接的接收狀態機,并保持現在的連接在工作狀態。
在上述各種狀態下收到連接異常的信息都異常關閉連接,轉到連接沒有激活狀態。
本端收到對端發起TCP連接建立請求時,TCP連接的狀態遷移如圖6所示。①沒有激活狀態:接收到對端的連接請求后,進入等待檢查報狀態;②等待檢查報狀態:如果接收到對端的檢查報,進入等待寫就緒狀態;如果接收到對端連接請求,接收請求,終止上次的連接過程,進入等待檢查報狀態;③等待寫就緒狀態:如果收到寫就緒事件,向對端發送檢查報,連接成功,如果以前存在工作的鏈路,關閉該鏈路,本鏈路投入工作狀態;如果接收到對端連接請求,接收請求,終止本次連接過程,切換到等待檢查報狀態;④工作狀態:如果收到數據收發請求,則進行數據收發,并保持狀態;如果收到連接的關閉請求,則關閉本連接,轉到連接沒有激活狀態;如果收到對端的連接建立請求,則啟動備份連接的建立狀態機,并保持狀態。
在上述各種狀態下收到連接異常的信息都異常關閉連接。
評論