操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    線程,協程,異步編程模型 1.線程編程模型

    我們知道線程是 cpu 調度的基本單位。

    如果是一個單核的cpu, 而且現在有3個線程需要執行。那么可能是 線程 1, 2, 3 通過 cpu分片, 輪流執行。

    那么 如果不將 cpu 進行分片, 而是 線程 1,2,3 輪流執行,那么使用時間應該是和 cpu分片的時間完全是一樣的。

    并且只是切換了2次上下文。那么是不是這樣執行的效率更高一些呢?多線程存在的意義又是什么呢?

    高并發服務器是進程還是線程_線程池實現多線程并發_線程是并發還是并行

    那么提到這個問題,不得不提的問題是 I/O。磁盤的讀寫,網絡數據的傳輸,音視頻的輸入輸出,都包含IO。我們在編程過程中,最重要的IO 就是磁盤IO和網絡IO。IO 是非常消耗時間的,它比執行其它程序更加消耗時間。

    那么看一下IO 執行的過程是什么樣的。有cpu ,硬盤,內存,這個時候想要進行文件的讀取。

    首先最容易想到的就是:cpu 直接讀取硬盤上的數據,然后將數據放到內存中。也就是文件讀取以后,會將文件的內容放到內存中。在整個IO 讀取過程中,cpu是全部被占用的。如果是以這種方式進行讀取的話,那么必然會造成 cpu分片和不分片的所需要的時間都是一樣的。

    線程是并發還是并行_高并發服務器是進程還是線程_線程池實現多線程并發

    但是實際的IO不是這樣的。在IO 執行過程中,有一個非常重要的概念是:DMA。 。

    在文件讀取過程中,cpu 并不是直接操作硬盤,而是通過對DMA直接下發指令,讓DMA完成文件的讀取。也就是第一步就是 : cpu 向 DMA下發指令,指令中包含磁盤信息和要讀取的文件的位置。然后DMA 告知硬盤進行文件的讀取。讀取的過程是將文件的內容加載到內存中。最終在讀取完畢以后,硬盤會給DMA一個反饋,讀取完成。DMA 最終以中斷的形式告知CPU ,文件讀取完成。然后cpu再去內存中取這一塊變量的值,最終就拿到了文件中的內容。

    線程是并發還是并行_高并發服務器是進程還是線程_線程池實現多線程并發

    然后我們看整個的過程,cpu 向DMA 下發指令以后,cpu 就處于一個空閑的狀態了。在當前狀態下高并發服務器是進程還是線程,cpu 可以去執行其它的線程。

    那么再來回顧當前的過程,首先是線程1,如果發現是 讀取文件,那么cpu就會發送 指令到 DMA, 進行文件的讀取。此時 cpu 是空閑的。然后假設同時 cpu 被線程 2占用了,然后發現又是讀取文件,那么這個時候又會發送指令到DMA 進行文件的讀取。以此類推。那么假設這時候這3個線程都在進行文件的讀取了,這時候cpu又可以騰出來去干其他的事情了。DMA在這段時間會進行文件的讀取。讀取完成,并且給了cpu一個中斷高并發服務器是進程還是線程,那么線程1,2,3 又會占用cpu的資源,繼續執行。

    那么很明顯在DMA執行的過程中,是不占用cpu的,cpu這個時候又可以去做其他的事情了,也就是被其他的線程占用。另外,DMA 進行讀取的時候,是可以復用的。因為cpu的線路是有多條的線路的。所以說DMA可以充分的利用這些線路。最終實現并行的讀取這些文件。通過以上這些,我們就可以大大提高cpu的利用效率。

    因此如果線程想要提高效率,是和IO是密切相關的。而我們的程序中,往往都含有IO。既然線程都已經有這么高的執行效率的,那么協程和異步分別是什么意思呢?

    高并發服務器是進程還是線程_線程池實現多線程并發_線程是并發還是并行

    2. 協程編程模型

    線程是操作系統級別的概念。在程序中,如果我們想要開辟多線程,那么我們需要調用系統底層的api,才能進行多線程的開辟。在線程開辟的過程中,會比較浪費cpu的時間。并且在線程運行過程中,會有用戶態和內核態的切換。這個切換,會占用較長的時間。因而會有一部分時間浪費在cpu切換這個時間點上。所以就有了協程。

    協程是編程語言級別的。我們可以像使用線程一樣使用協程。但是協程并不是線程,并不會告訴操作系統開辟了線程。因而協程是全程處于用戶態的。因而協程可以稱作是用戶自定義的線程。因而協程可以大量的開辟,并且不用擔心內核態和用戶態的切換。

    在一臺機器上,我們可以開辟的線程是有限的,在正常的機器上,開辟的幾百或者上千的線程就已經達到上限了。如果是利用go 去開辟協程的話,那么就可以隨隨便便開辟幾千萬個協程了。

    線程是并發還是并行_線程池實現多線程并發_高并發服務器是進程還是線程

    3. 異步編程模型

    看了線程和協程,我們最后來看一下異步。異步的編程其實是非常簡單的。例如我們上面說的DMA讀取磁盤就是異步的。在一些編程語言,比如 Node.js中,默認就是以 異步的方式來進行編程的。node.js 是單線程的,卻能夠應對高并發。最重要的原因也是它是異步的操作模型。也就是在單線程中會有很多的回調函數。

    總結

    無論你是一個初級開發者還是高級開發者,線程,協程,異步 都應該是你日常開發過程中繞不開的一個話題,所以作為軟件開發者的我們,真的很有必要詳細地了解。

    鳴謝

    線程/協程/異步編程模型

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有