微软研究员:fork() 已落后,需要淘汰
來源:開源中國社區
www.oschina.net/news/105857/a-fork-in-the-road
微軟研究人員發表論文稱用于創建進程的?fork?系統調用方式已經很落后,并且對操作系統的研究與發展產生了極大的負面影響,需要淘汰,作者同時提出了替代方案。
相信每位開發者都對操作系統中的?fork()?有一定的了解,至少知道它是用來創建進程的。fork?系統調用方式在?20?世紀?70?年代被創造出來,它通常與?exec()?組合使用,非常簡單卻很強大,被認為是一種天才式的設計、Unix?的偉大思想,至今?50?余年一直作為?POSIX?操作系統的原語存在,同時幾乎每個?Unix?shell、主要?Web?和數據庫服務器、Google?Chrome、Redis?甚至?Node.js?都使用?fork。
然而微軟系統研究實驗室?Redmond?的研究人員?3?月份卻發表了一篇論文,表示?fork?作為操作系統原語繼續存在,阻礙了對操作系統的研究,“它是來自另一個時代的遺物,不適合現代系統,并且會帶來一系列負面影響”,研究人員認為是時候將?fork?淘汰了。
fork 簡單已成神話
論文中承認了?fork?API?的優點,包括簡單與緩解并發性,也肯定了?fork?在歷史上的重要貢獻,但更多地是列出了它在現代操作系統研究與發展中的弊端。
研究人員認為?fork?本身就存在許多問題,另一方面,fork?在操作系統的研究與發展上也起了限制作用,論文指出有明確的證據表明支持?fork?限制了?OS?體系結構的變化,并限制了操作系統適應硬件演進的能力。
乍一看可能會覺得?fork?很簡單,而這也是它的一大特征,但是實際上,“這是一個具有欺騙性的神話”。
fork?的語義已經影響了每個創建進程狀態的新?API?的設計,POSIX?規范現在列出了關于如何將父狀態復制到子進度的?25?個特殊情況,包括文件鎖定、定時器、異步?IO?操作與跟蹤等。此外,許多系統調用標志控制?fork?關于內存映射(Linux?madvise()?標記?MADV_DONTFORK/DOFORK/WIPEONFORK?等)、文件描述符(O_CLOEXEC、FD_CLOEXEC)和線程(pthread_atfork())的行為。任何重要的操作系統工具都必須通過?fork?記錄其行為,并且用戶模式庫必須做好準備,以便隨時?fork?它們的狀態。fork?已經不再簡單。
fork?不是線程安全的,Unix?進程支持線程,但?fork?創建的子進程只有一個線程(調用線程的副本),當一個線程在?fork?時,如果另一個線程此時進行內存分配并持有堆鎖,任何在子進程中分配內存的嘗試(從而獲得相同的鎖)都將立即發生死鎖。
fork?很慢,fork?的性能一直是個問題,此前使用寫時復制技術使其性能可接受,但是在今天,建立寫時復制映射本身都成了一個性能問題,比如?Chrome?在?fork??時會經歷了長達?100?毫秒的延遲,Node.js?應用在?exec?之前?fork?時,可以被阻塞幾秒鐘。fork+exec?與?spawn?的性能對比情況可以通過本文開頭的圖片直觀看到。
fork?無法擴展,系統規模的設計首先要避免不必要的共享,但?fork?進程會與其父進程共享所有內容,由于?fork?復制了進程操作系統狀態的各個方面,這樣復制與引用計數成本會比較低,所以?fork?其實是趨向于將狀態集中在單片內核中,這就使得難以實現一些新技術,比如用于安全性和可靠性的內核劃分。
fork?與異構硬件不兼容,它將進程的抽象與包含它的硬件地址空間混為一談。fork?將進程的定義限制為單個地址空間,并且是在某個核心上運行的單個線程。但現代硬件和在其上運行的程序并不是這樣,硬件異構化越來越嚴重,使用有內核旁路?NIC?的?DPDK?或帶有?GPU?的?OpenCL?的進程無法安全地?fork,因為操作系統無法復制?NIC/GPU?上的進程狀態。這個問題至少已經困擾了?GPU?程序員十年,而隨著未來的芯片上系統包含越來越多的狀態加速器,情況只會變得更糟。
“GET?THE?FORK?OUT?OF?MY?OS!”
論文提出了替代?fork?的方案:包括一個高級?Spawn?API?和一個低級類微內核?API?的組合。涉及到?posix_spawn()、vfork()、跨進程操作、clone()、改進寫時復制內存等內容。
fork?的問題越來越嚴重,作者最后總結出必須做三件事來糾正這種情況,不僅要棄用?fork,還要改善替代方案,同時糾正我們關于?fork?的教學內容,不能再錯誤地宣揚?fork?的能力與設計水平。
論文地址:
-
https://www.microsoft.com/en-us/research/publication/a-fork-in-the-road
總結
以上是生活随笔為你收集整理的微软研究员:fork() 已落后,需要淘汰的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KubeEdge vs K3S:Kube
- 下一篇: 拜托,面试别再问我表达式求值了!!!