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