在一次軟體工程師面試中,我被問到以下兩個問題,但無法回答。我做了護目鏡搜索,但找不到答案。
一種。什么時候多行程應用比單機多執行緒應用好?灣。什么時候單機不可能多執行緒,但多行程是可能的?
uj5u.com熱心網友回復:
當您需要隔離行程提供以防止任務相互干擾或控制行程時,多行程優于多執行緒。例如,這可能意味著:
- 您希望能夠突然終止任務。如果它們是行程,那么作業系統將確保釋放它們的系統資源;要么
- 您只想確保任務完成時釋放資源,即使它正常完成;要么
- 你有一個(非對抗性的)多租戶系統;要么
- 您要確保任務不會無意中共享記憶體等。
我不確定提問者希望多執行緒是“不可能的”,但也許他正在考慮上述場景之一,或者只是當您使用不允許多執行緒的 NodeJS 之類的主機環境時.
uj5u.com熱心網友回復:
在某些情況下,多個行程可能比單個多執行緒行程更好:
如果您想并行化一些并非設計為在單個行程中的多個執行緒中運行(很好)的軟體。(兩個例子是 GIL 限制多執行緒性能的 Python 解釋器,以及像 Qt 這樣的 GUI 工具包,它要求所有 GUI 小部件都存在于單個執行緒中)
如果您擔心軟體可能會崩潰或損壞資料,并希望限制發生這種情況時/何時發生的損壞范圍。(如果多執行緒程式的一個執行緒出錯,它可以而且通常確實會影響/損壞/崩潰行程中的所有執行緒;OTOH 如果一個行程崩潰,其他行程不會直接受到影響)
如果您希望您的軟體能夠從崩潰中恢復。這在單行程程式中幾乎是不可能做到的,但是對于多個行程,您可以擁有一個父“保姆”行程來監視其子行程何時崩潰或退出,并在必要時通過重新啟動它們來做出回應。
如果你想確保你的執行緒不會互相監視。(例如,您可能有一個程式同時被多個不相關的用戶使用,并且您希望確保用戶 A 的私人資料不可能“泄露”給用戶 B——將用戶的資料保存在不同的行程中將大大有助于執行該限制)
如果您希望您的執行緒/行程以不同級別的權限運行。在多行程模型中,您可以讓不同的行程作為具有不同訪問級別的不同用戶運行;而在單個多執行緒行程中,所有執行緒將作為同一用戶運行,因此彼此具有相同的特權/權限。
至于何時無法實作多執行緒行程:我能想到的唯一場景是在不支持多執行緒程式但支持多個行程的(舊)作業系統中。許多更古老的 Unix 變體就是這樣。
uj5u.com熱心網友回復:
Q1。當單臺機器不能多執行緒但可以多行程時?
A1:
當作業系統內核不支持本機執行緒并且應用程式的運行時未實作“綠色執行緒”時。(研究術語“原生執行緒”和“綠色執行緒”。)
當應用程式本身是單執行緒時。(在應用程式設計和實作的背景關系中研究術語“單執行緒”和“多執行緒”。)應用程式需要撰寫為多執行緒的。
Q2:單機多行程應用什么時候優于多執行緒應用?
A2:
當語言的多執行緒實作不能有效地使用多核時。例如,研究一些 Python 實作中的全域解釋器鎖 (GIL) 問題。
當程式員不具備開發多執行緒程式所需的并發編程技能時。例如,典型的 Java 本科課程并沒有深入了解真正理解 Java 并發編程所需的詳細程度。
還有其他“何時”適用于更具體的場景。
請注意,撰寫單執行緒應用程式比撰寫多執行緒應用程式更容易,因此使用多行程而不是多執行緒可能更容易。但這不是關于什么是可能的,甚至不一定更好。這些東西高度依賴于背景關系。這取決于程式、語言、開發人員的技能等。
盡管有上述所有情況,但在某些情況下,多執行緒可以提供比多行程更好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453956.html
