IT鐵人
前面提到了OS會提供許多API給User執行,讓User可以切換成kernel mode執行程式,以下介紹幾個System Call。
此system call可以建立child process,child process會被配置與parent不同的memory space(by kernel),他的資料內容都會來自於parent的copy。
fork()的回傳值有以下兩種:
類型 | 內容 |
---|---|
失敗(無法建立child) | 傳負值(-1)給kernel,kernel通知parent。 |
成功 | 傳回0給child process。傳回大於0的值給parent,此數值極為child之PID(process id)。 |
因此,如果child要做與parent相同之工作,則fork()即可完成目的。
用來終止程式,請kernel結束程式並且收回resource,可以決定要回傳甚麼數值給kernel。
通常exit(0)代表正常結束,exit(1)代表異常結束。
如果是child process執行exit(),則kernel會將數值回傳給parent process。
用來暫停process,直到某事件發生。
通常會讓parent執行wait(),等待child執行完再繼續執行。
如果child已經終止,但parent尚未執行wait(),這段期間kernel就不能清除child PCB,此段時間child就稱為zombie process。
之前杰哥修OS的時候,就因為作業內容需要執行許多fork()指令,但又有許多人忘記wait(),導致工作站的PID被占用光了,以至於後來的同學要登入工作站,會發生因為沒有多的PID可以分配而無法登入,每年的那段時間都要定期清除所有process,可以說相當有趣。
另外,如果parent沒有執行wait()就結束,child此時沒有parent,就成了孤兒(orphan),不過放心,OS會接納他們,並且定期把他們殺了。
用來載入特定的binary code file到memory中執行,他有許多不同的類型可以使用,根據路徑、參數的傳遞方式,在man7的頁面可以看到有以下幾種:
除了用法不一樣以外,功能是沒有差別的。
名字簡單明瞭吧,就是告訴你自己的pid是多少而已,就像是告訴你你是誰這樣子。
因為下篇的篇幅可能比較長,這篇就到此為止,後面會介紹許多CPU Scheduling Algorithm,也就是怎麼分配大家使用CPU的時間才讓大家都滿意。
希望各位在疫情期間,可以安全地執行fork(),少產出一些child,最好不要有orphan,畢竟現在的zombie已經夠多了。
上一篇 | 下一篇 |
---|---|
Child Process | CPU Scheduling Algorithm |