iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
自我挑戰組

杰哥的考研紀錄系列 第 22

Day-22 常用System Call

  • 分享至 

  • xImage
  •  

常用System Call

tags: IT鐵人

前面提到了OS會提供許多API給User執行,讓User可以切換成kernel mode執行程式,以下介紹幾個System Call。

fork()

此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()即可完成目的。

exit()

用來終止程式,請kernel結束程式並且收回resource,可以決定要回傳甚麼數值給kernel。

通常exit(0)代表正常結束,exit(1)代表異常結束。

如果是child process執行exit(),則kernel會將數值回傳給parent process。

wait()

用來暫停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會接納他們,並且定期把他們殺了。

execlp()

用來載入特定的binary code file到memory中執行,他有許多不同的類型可以使用,根據路徑、參數的傳遞方式,在man7的頁面可以看到有以下幾種:

除了用法不一樣以外,功能是沒有差別的。

getpid()

名字簡單明瞭吧,就是告訴你自己的pid是多少而已,就像是告訴你你是誰這樣子。

What's Next?

因為下篇的篇幅可能比較長,這篇就到此為止,後面會介紹許多CPU Scheduling Algorithm,也就是怎麼分配大家使用CPU的時間才讓大家都滿意。

希望各位在疫情期間,可以安全地執行fork(),少產出一些child,最好不要有orphan,畢竟現在的zombie已經夠多了。

上一篇 下一篇
Child Process CPU Scheduling Algorithm


上一篇
Day-21 Child Process
下一篇
Day-23 CPU Scheduling Algorithm
系列文
杰哥的考研紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言