<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                <!-- The Terminology Problem --> ## 術語問題 術語“并發”,“并行”,“多任務”,“多處理”,“多線程”,分布式系統(可能還有其他)在整個編程文獻中都以多種相互沖突的方式使用,并且經常被混為一談。 *Brian Goetz* 在他 2016 年《從并發到并行》的演講中指出了這一點,之后提出了合理的二分法: - 并發是關于正確有效地控制對共享資源的訪問。 - 并行是使用額外的資源來更快地產生結果。 這些定義很好,但是我們已有幾十年混亂使用和抗拒解決此問題的歷史了。一般來說,當人們使用“并發”這個詞時,他們的意思是“所有的一切”。事實上,我自己也經常陷入這樣的想法。在大多數書籍中,包括 *Brian Goetz* 的 《Java Concurrency in Practice》,都在標題中使用這個詞。 “并發”通常表示:不止一個任務正在執行。而“并行”幾乎總是代表:不止一個任務同時執行。現在你能看到問題所在了嗎?“并行”也有不止一個任務正在執行的語義在里面。區別就在于細節:究竟是怎么“執行”的。此外,還有一些場景重疊:為并行編寫的程序有時在單處理器上運行,而一些并發編程系統可以利用多處理器。 還有另一種方法,在減速發生的地方寫下定義(原文Here’s another approach, writing the definitions around where the slowdown occurs): **并發** 同時完成多任務。無需等待當前任務完成即可執行其他任務。“并發”解決了程序因外部控制而無法進一步執行的阻塞問題。最常見的例子就是 I/O 操作,任務必須等待數據輸入(在一些例子中也稱阻塞)。這個問題常見于 I/O 密集型任務。 **并行** 同時在多個位置完成多任務。這解決了所謂的 CPU 密集型問題:將程序分為多部分,在多個處理器上同時處理不同部分來加快程序執行效率。 上面的定義說明了這兩個術語令人困惑的原因:兩者的核心都是“同時完成多個任務”,不過并行增加了跨多個處理器的分布。更重要的是,它們可以解決不同類型的問題:并行可能對解決I / O密集型問題沒有任何好處,因為問題不在于程序的整體執行速度,而在于I/O阻塞。而嘗試在單個處理器上使用并發來解決計算密集型問題也可能是浪費時間。兩種方法都試圖在更短的時間內完成更多工作,但是它們實現加速的方式有所不同,這取決于問題施加的約束。 這兩個概念混合在一起的一個主要原因是包括Java在內的許多編程語言使用相同的機制 - **線程**來實現并發和并行。 我們甚至可以嘗試以更細的粒度去進行定義(然而這并不是標準化的術語): - **純并發**:仍然在單個CPU上運行任務。純并發系統比順序系統更快地產生結果,但是它的運行速度不會因為處理器的增加而變得更快。 - **并發-并行**:使用并發技術,結果程序可以利用更多處理器更快地產生結果。 - **并行-并發**:使用并行編程技術編寫,如果只有一個處理器,結果程序仍然可以運行(Java 8 **Streams**就是一個很好的例子)。 - **純并行**:除非有多個處理器,否則不會運行。 在某些情況下,這可能是一個有用的分類法。 支持并發性的語言和庫似乎是[抽象泄露(Leaky Abstraction)](https://en.wikipedia.org/wiki/Leaky_abstraction)一詞的完美候選。抽象的目標是“抽象出”那些對于手頭想法不重要的東西,以屏蔽不必要的細節。如果抽象是有漏洞的,那些碎片和細節就會不斷重新聲明自己是重要的,無論你廢了多少功夫來隱藏它們。 我開始懷疑是否真的有高度抽象。因為當編寫這類程序時,底層的系統、工具,甚至是關于CPU緩存如何工作的細節,都永遠不會被屏蔽。最后,如果你非常小心,你創作的東西在特定的情況下工作,但在其他情況下不工作。有時是兩臺機器的配置方式不同,有時是程序的估計負載不同。這不是Java特有的 - 這是并發和并行編程的本質。 你可能會認為[純函數式](https://en.wikipedia.org/wiki/Purely_functional)語言沒有這些限制。實際上,純函數式語言解決了大量并發問題,所以如果你正在解決一個困難的并發問題,你可以考慮用純函數語言編寫這個部分。但最終,如果你編寫一個使用隊列的系統,例如,如果該系統沒有被正確地調整,并且輸入速率也沒有被正確地估計或限制(在不同的情況下,限制意味著具有不同的影響的不同東西),該隊列要么被填滿并阻塞,要么溢出。最后,你必須了解所有細節,任何問題都可能會破壞你的系統。這是一種非常不同的編程方式。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看