計算機三大核心元件:cpu、記憶體和輸入輸出裝置(io)
開啟多執行緒的最根本的目的是為了充分利用cpu,提高計算機資源利用率。cpu是傳送執行命令的地方,其只能從記憶體裡讀取指令來執行,也是執行緒排程的執行者
拿io來說,在單執行緒的情況下,假如此時有乙個執行緒需要執行io,這個過程分2個階段,1、cpu排程該執行緒,讓該執行緒執行其要執行的任務;2、該執行緒執行其io操作,如果此時的io需要花費很長時間,那此時的cpu就會處於等待時間,換句話說cpu現在是空閒的,所以在多執行緒的情況下cpu就可以利用這個空閒時間去排程其他執行緒,讓他們執行各自的任務,這樣就提高了程式的執行效率
我們經常會聽到要好好使用cpu的資源,提高cpu利用率,要學習應對高負載的情況,那這個高負載其實大多數情況指的就是cpu負載。我們還會學習到乙個命令是top,這個命令可以得到他們的數值和其他系統指標。那麼什麼是cpu利用率,其實就是單位時間裡cpu被使用的時間,那麼為什麼cpu會沒有被使用到呢,我們經常可以看到cpu負載都是在3以上,也就是說如果cpu核心有四個的話,那麼同一時刻可能就有三個核心在工作,雖然核心的工作並不一定是平均分配的。cpu的工作時間並不等於使用時間,因為這個工作可能需要請求硬碟資源和系統資源,時間還有大部分花在了這些事情上了。所以有的人會說當應用是io密集型的時候,要使用更多的執行緒,因為更多的執行緒意味著更多的任務,也意味著每個cpu執行乙個任務的時間縮短了,所以花在io阻塞,socket阻塞的時間就少了,因為他們是非同步執行,也就可以提高cpu利用率了。
那麼cpu負載是什麼呢,其實就是所有cpu的執行的和在佇列裡等待的任務的數量,記住是所有cpu,所以4的負載率平均到每個cpu核心的任務數是4/邏輯cpu數,這個邏輯cpu數是因為有的cpu核心可以同時執行兩個執行緒,所以哪怕有兩個核心,我們也要當成有4個核心。負載數一般是每個核心承擔0.7個任務最好,這個不是什麼標準,我也不知道對不對,因為如果大於1,表示我們任務的延遲就比較大了,如果等於1,那麼cpu就基本沒閒著,對機器的損耗挺大的。
其實理解概念沒什麼用,我們給指導這裡面的原理,比如執行緒是怎麼被執行的,它是先告訴cpu我處於可執行狀態,然後cpu把他放到等待佇列裡或執行,cpu會為它分配時間片,時間片就是給予的cpu執行時間,這裡面通過乙個演算法,叫做執行緒排程演算法,有興趣的可以搜一下,有時間片,fifo,搶占式,優先順序幾種。當執行緒被執行後,它就會執行到時間片時間用完,如果這個執行緒都是io操作,那麼cpu就相當於什麼都沒幹了。
伺服器是怎麼處理高併發場景的?
其實伺服器並不是為每個請求建立乙個執行緒,由於client 在訪問tomcat的時候,需要建立乙個connector,這個建立connector的過程有可能因為各種原因而耗費一定的時間,比如網路原因,所以實際上tomcat預設採用執行緒池的方式,即用執行緒池儲存一定數量的連線,當有新的請求時,就從執行緒池取連線,不需要時就放回執行緒池,這種方式相對於乙個請求建立乙個執行緒,會更少的占用伺服器資源,更高效。另外tomcat的執行緒池有兩種基於方式:bio(阻塞)和nio(非阻塞)
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...
多執行緒原理(部分)
volatile修飾的變數能夠保證可見性,但不保證原子性,每個執行緒能夠獲取該變數的最新值。對volatile修飾的詞,程式在編譯的時候,會多乙個lock彙編指令如下圖所示 該lock指令有兩個主要作用 jmm主要是通過設定記憶體屏障來禁止指令重排序,下圖是匯程式設計序中的四種記憶體屏障型別 屏障型...
Dubbo 多執行緒通訊原理
本文 摘錄的時候,將一些與本流程無關的內容去掉了,如有需要請看原始碼。如果大家對dubbo rpc原理原理感興趣,可以看我之前寫過的另外一篇部落格 dubbo rpc源 碼解讀 併發情況下,dubbo的rpc模型如下圖所示 如圖所示,consumer端可能同時有多個執行緒呼叫provider的服務,...