遞迴呼叫
遞迴是副程式直接或間接呼叫自己。相對於迭代 (iterative)
分治 (Divide and Conquer) 是種運用遞迴的特性來設計演算法的策略。
https://hackmd.io/@sysprog/c-recursion
https://www.facebook.com/groups/system.software2020/permalink/434463677487837/
窮舉與遞迴(enumeration and recursion)
遞迴呼叫
遞迴是副程式直接或間接呼叫自己。相對於迭代 (iterative)
分治 (Divide and Conquer) 是種運用遞迴的特性來設計演算法的策略。
https://hackmd.io/@sysprog/c-recursion
https://www.facebook.com/groups/system.software2020/permalink/434463677487837/
窮舉與遞迴(enumeration and recursion)
軟體定義網路 (Software-defined networking, SDN) 架構大略分為應用層、控制層以及基礎架構層三層。
| 應用層 |
|---|
| 北向 API |
| 控制層 |
| 南向 API |
| 基礎架構層 |
控制層由控制器 (Controller) 負責,集中管理眾多網路設備,讓網路設備專注於封包傳遞,網管人員能以高階軟體的方式調整網路的決策,提升網路資源管控和管理效率。對應用層界面是 Northbound API,對基礎架構層是 Southbound API。基礎架構層 (資料層、Data Layer、Forwarding Layer)由各種網路設備所組成,透過 Southbound API 將設備資訊送到控制器內做整合,並接受控制器的訊息對 flow table 等設備內的設定作調整。控制層內由許許多多模組組成一個可以應付各種需求的控制器。應用層由許多 Forwarding、Firewall 和 Security 等應用所組成,透過 Northbound API 取得整個 SDN 網路的相關資訊去做相對應處理。
例如有個應用想要建立一條從主機 A 到主機 B 的路線,只需要告訴控制器,控制器根據內部現有的網路拓樸計算出最佳的路徑並自動將設定部署到整個網路,不用對每一個交換機做獨立設定。
Controller 備援
參考:Proxy 或 Proxy Server 是 Server 和 Client 的合體。首先它是 Server,能接收 SIP 請求。然後又是 Client,轉送 Server 收到的請求或產生請求。
一個 job 是一個指令或指令串,形成一個 process group。透過一個控制終端機 (Controlling Terminal) 可以進行多個 job,都屬於同一個 session (譯作「作業階段」),其中一個是 foreground process group,剩下都是 background process group,方便工作控制 (job control)。
建立 session 的 process 是 session leader,其 process ID (PID) 作為 session ID (SID),並連接一個 session 專用的控制終端機並成為其控制 process,讓使用者控制,其中 foreground process group 讀取控制終端機。Signal SIGINT (Ctrl-C)、SIGQUIT (Ctrl-\)、和 SIGSTP (Ctrl-Z) 會送到 foreground process group 中的所有 process。當控制終端機斷線時,控制 process 會收到 SIGHUP。
建立 process group 的 process 是 process group leader,其 PID 作為 process group ID (PGID)。process group 最後一個 process 結束或離開時結束。process group leader 未必是最後一個 process。
新 process 繼承親 process 的 SID、PGID、控制終端機等。檔案
/proc/PID/stat 可看到 PGID、SID、控制終端機的 major:monor ID 和控制 process 的 PID (見 proc(5))。
互動式登入時,登入的途徑是控制終端機,登入的 shell 成為 session leader 及控制行程,也是唯一 process group 的唯一成員。然後,從 shell 啟動的每個指令或指令串,都會建立一個或多個 process,全部收納在一個新的 process group。如果指令或指令串以 &
符號結束時,這個 process group 會在背景執行。這些都在同一個 session 下。
此時,shell$ echo $$ # Display the PID of the shell 400 $ find / 2> /dev/null | wc -l & # Create 2 processes in background group [1] 659 $ sort < longlist | uniq -c # Create 2 processes in foreground group
bash、find、wc、sort、和 uniq 都在執行,全部屬於同一 session,session leader 是 bash,同時也是控制 process,其它 process 都是 bash 產生。session 全部分成三個群組,前景執行的群組是 sort 和 uniq,sort 是群組 leader。另外兩個群組背景執行,一個是 bash,另一個是 find 和 wc,find 是群組 leader。$ echo $$ # Display the PID of the shell 4056 $ find / 2> /dev/null | wc -l & # Create 2 processes in background group [1] 5781 $ ps -s 4056 -o comm,pid,sess,tt,pgrp,ppid,tpgid,state COMMAND PID SESS TT PGRP PPID TPGID S bash 4056 4056 pts/2 4056 1579 5782 S find 5780 4056 pts/2 5780 4056 5782 R wc 5781 4056 pts/2 5780 4056 5782 S ps 5782 4056 pts/2 5782 4056 5782 R
用 ps 可看出各自指令的資訊,其中一開始的 shell 是 bash,PID 4056。SID (SESS) 等於 PID,所以是 session leader,連接終端機 pts/2。PGID (PGRP) 等於 PID,是群組 leader。沒其它 process 的 PGID 為 4056,是群組中唯一 process。parent PID (PPID) 是其它 process,但其它 process 都是 4056,也就是都是其產生。TPGID 可看出前景執行的群組是 5782,也就是 ps 指令,其它群組 4056 和 5780 都背景執行。5780 群組的指令包含 find 和 wc 兩個 process。
pid_t getpgrp(void); // 取得 PGID,如果和 PID 一致則是 process group leader
int setpgrp(pid_t pid, pid_t pgid); // 將 pid 的 porcess group 設為 pgid。pid 可以是自己或子 process (不能是 SID)。pgid ...
TLPI §34.1
34.2 Process Groups
34.3 Sessions
34.4 Controlling Terminals and Controlling Processes
34.5 Foreground and Background Process Groups
34.6 The SIGHUP Signal
34.6.1 Handling of SIGHUP by the Shell
34.6.2 SIGHUP and Termination of the Controlling Process
34.7 Job Control
34.7.1 Using Job Control Within the Shell
34.7.2 Implementing Job Control
34.7.3 Handling Job-Control Signals
34.7.4 Orphaned Process Groups (and SIGHUP Revisited)
34.8 Summary
34.9 Exercises
所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...