程式執行緒、同步非同步、阻塞非阻塞、併發並行
基本概念
1 程式和執行緒
程式(Process ):
是Windows 系統中的一個基本概念,它包含著一個執行程式所需要的資源。一個正在執行的應用程式在作業系統中被視為一個程式, 程式可以包括一個或多個執行緒 。執行緒是作業系統分配處理器時間的基本單元,在程式中可以有多個執行緒同時執行程式碼。程式之間是相對獨立的,一個程式無法訪問另一個程式的資料(除非利用分散式計算方式),一個程式執行的失敗也不會影響其他程式的執行,Windows 系統就是利用程式把工作劃分為多個獨立的區域的。程式可以理解為一個程式的基本邊界。是應用程式的一個執行例程,是應用程式的一次動態執行過程。
執行緒(Thread ):
是程式中的基本執行單元,是作業系統分配CPU 時間的基本單位,一個程式可以包含若干個執行緒,在程式入口執行的第一個執行緒被視為這個程式的主執行緒。 在.NET 應用程式中,都是以 Main() 方法作為入口的,當呼叫此方法時系統就會自動建立一個主執行緒。執行緒主要是由 CPU 暫存器、呼叫棧和執行緒本地儲存器( Thread Local Storage , TLS )組成的。 CPU 暫存器主要記錄當前所執行執行緒的狀態,呼叫棧主要用於維護執行緒所呼叫到的記憶體與資料, TLS 主要用於存放執行緒的狀態資訊。
程式和執行緒的區別
程式和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程式有獨立的地址空間,一個程式崩潰後,在保護模式下不會對其它程式產生影響,而執行緒只是一個程式中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但在程式切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程式。
1) 簡而言之 , 一個程式至少有一個程式 , 一個程式至少有一個執行緒 .
2) 執行緒的劃分尺度小於程式,使得多執行緒程式的併發性高。
3) 另外,程式在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
4) 執行緒在執行過程中與程式還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程式的排程和管理以及資源分配。這就是程式和執行緒的重要區別。
2 同步( Sync )和非同步( Async )
同步:
所謂同步,就是發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回或繼續執行後續操作。
簡單來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事。
例如:B/S 模式中的表單提交,具體過程是:客戶端提交請求 -> 等待伺服器處理 -> 處理完畢返回,在這個過程中客戶端(瀏覽器)不能做其他事。
非同步:
非同步與同步相對,當一個非同步過程呼叫發出後,呼叫者在沒有得到結果之前,就可以繼續執行後續操作。當這個呼叫完成後, 一般通過狀態、通知和回撥來通知呼叫者。對於非同步呼叫,呼叫的返回並不受呼叫者控制。
對於通知呼叫者的三種方式,具體如下:
狀態
即監聽被呼叫者的狀態(輪詢),呼叫者需要每隔一定時間檢查一次,效率會很低。
通知
當被呼叫者執行完成後,發出通知告知呼叫者,無需消耗太多效能。
回撥
與通知類似,當被呼叫者執行完成後,會呼叫呼叫者提供的回撥函式。
例如:B/S 模式中的 ajax 請求,具體過程是:客戶端發出 ajax 請求 -> 服務端處理 -> 處理完畢執行客戶端回撥,在客戶端(瀏覽器)發出請求後,仍然可以做其他的事。
同步和非同步的區別:
總結來說,同步和非同步的區別:請求發出後,是否需要等待結果,才能繼續執行其他操作。
3 阻塞和非阻塞
阻塞和非阻塞這兩個概念與程式(執行緒)等待訊息通知( 無所謂同步或者非同步 ) 時的狀態有關。也就是說阻塞與非阻塞主要是程式(執行緒)等待訊息通知時的狀態角度來說的。
阻塞和非阻塞關注的是 程式在等待呼叫結果(訊息,返回值)時的狀態.
阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。
4 併發並行
併發:在作業系統中,是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行。 當有多個執行緒在操作時, 如果系統只有一個 CPU, 則它根本不可能真正同時進行一個以上的執行緒,它只能把 CPU 執行時間劃分成若干個時間段 , 再將時間 段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。 . 這種方式我們稱之為併發 (Concurrent) 。
並行: 當系統有一個以上CPU 時 , 則執行緒的操作有可能非併發。當一個 CPU 執行一個執行緒時,另一個 CPU 可以執行另一個執行緒,兩個執行緒互不搶佔 CPU 資源,可以同時進行,這種方式我們稱之為並行 (Parallel)
併發和並行的區別:
你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。
併發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能力。
所以我認為它們最關鍵的點就是:是否是『同時』。
二 非同步和多執行緒區別?(原理篇)
1 非同步和多執行緒有什麼區別?
其實,非同步是目的,而多執行緒是實現這個目的的方法。非同步是說, A 發起一個操作後(一般都是比較耗時的操作,如果不耗時的操作就沒有必要非同步了),可以繼續自顧自的處理它自己的事兒,不用幹等著這個耗時操作返回。
2 多執行緒和非同步操作的異同
多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。
3 非同步操作的本質
所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對DMA 這個詞不陌生,硬碟、光碟機的技術規格中都有明確 DMA 的模式指標,其實網路卡、音效卡、顯示卡也是有 DMA 功能的。 DMA 就是直 接記憶體訪問的意思,也就是說,擁有 DMA 功能的硬體在和記憶體進行資料交換的時候可以不消耗 CPU 資源。只要 CPU 在發起資料傳輸時傳送一個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發一箇中斷來通知操作完成。這些無須消耗 CPU 時間的 I/O 操作正是非同步操作的硬體基礎。所以即使在 DOS 這樣的單程式(而且無執行緒概念)系統中也同樣可以發起非同步的 DMA 操作。
4 執行緒的本質
執行緒不是一個計算機硬體的功能,而是作業系統提供的一種邏輯功能,執行緒本質上是程式中一段併發執行的程式碼,所以執行緒需要作業系統投入CPU 資源來執行和排程。
5 非同步操作的優缺點
因為非同步操作無須額外的執行緒負擔,並且使用回撥的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用回撥方式進行處理,與普通人的思維方式有些 初入,而且難以除錯。
6 多執行緒的優缺點
多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。
非同步與多執行緒, 從辯證關係上來看 , 非同步和多執行緒並不時一個同等關係 , 非同步是目的 , 多執行緒只是我們實現非同步的一個手段 . 什麼是非同步 : 非同步是當一個呼叫請求傳送給被呼叫者 , 而呼叫者不用等待其結果的返回 . 實現非同步可以採用多執行緒技術或則交給另外的程式來處理
三 非同步,多執行緒和並行的區別?(故事篇)
非專業人員,就用非專業的語言解釋下吧,比喻不夠貼切,但大概是那麼個意思,
先聽我講一個故事:
那還是10 年前,還沒有 12306 的年代,大家買票只能去火車站買。因為大家都要過年回家,都還不想等,火車站只有一個,視窗只有那麼多,頭疼啊。更頭疼的是,排到視窗的那個人,各種挑剔,不要貴的,不要晚上的,不要站票 ...... 跟售票員各種墨跡,後面的人更加著急,一個個義憤填膺,罵爹罵娘。
現在假設整個城市就只有1 個火車, 1 個售票員,每個乘客諮詢售票員後需要思考 1 分鐘再決定買哪趟車的票。
1. 非同步:在買票的人諮詢後,需要思考 1 分鐘,馬上靠邊站,但不用重新排隊,什麼時候想清楚可以立馬去跟售票員去買票。在該人站在旁邊思考的時候,後面的人趕緊上去接著買。這時候隊伍是很快的挪動的,沒有阻塞,售票員的最大化的效率。
2. 多執行緒:火車站開 n 個視窗(但還是隻有一個人售票),外面同時排 n 個隊,售票員回答諮詢者問題後,立馬馬上去下個視窗,然後繼續輪換到下個視窗 ..... 哪個視窗的人決定好了,售票員立馬過去買給他。這個時候乘客比較簡單,但萬一那個隊伍有人思考半天糾結,後面的人就悲劇了。
3. 並行:複製 n 個火車站,同時賣票,買票能力大大增強。大家也可以哪個火車站人少,就去那個買票。
可見:在只有一個火車站,且只有一個售票員的情況下,賣完一個再賣一個就會導致資源浪費,效率低下,隊伍卡死,很難往前挪動。1,2 優化的辦法都解決了隊伍不動,售票率低下的問題。但增加火車站,增加視窗,增加售票員才是好辦法。
結論:
1. 非同步和多執行緒其實效率差不多,但是開的視窗不多例如 3 個,同時有很多人都是去花 5 分鐘,而不是 1 分鐘去糾結的時候,多執行緒效率實際是低於非同步的,因為售票員還是常遇到 3 個隊伍同時卡在那糾結不能買票的時候。
2. 這 2 個概念拿來對比也有點不合適,因為他們不是一個概念,多執行緒的目的還是為了實現非同步,多執行緒應該是一種實現非同步的手段。非同步應該去跟同步比較才對。
3. 多執行緒比較簡單,但需要增設視窗,增加成本,且售票員比較累這類似 apache 下 php ,和 node.js 下 javascript 的關係,一個是多執行緒,但是是阻塞的,另外一個是單執行緒非同步非阻塞的。 php 的方案比較符合常規思維,但比較費記憶體, node.js 非阻塞,用較少的資源就能完成同樣的任務,但程式設計比較費神。
4. 並行,類似同時利用多核 cpu 的各個核去計算。併發可分為偽併發、真併發。前者例如單核處理器的併發,後者發是指多核處理器的併發。
5. 終極辦法是平行計算,並且每個 cpu 下進行非同步計算,這樣你的每個核都充分利用。只不過對程式設計要求太高了太高了,如果不是密集型計算,例如大型有限元計算(多采用併發),或者伺服器同時處理上千的訪問(多采用非同步或者多執行緒),還是老老實實的用傳統的辦法吧,畢竟常規程式的計算量對現在的硬體來說,問題都不大。
四 阻塞非阻塞與同步非同步的區別?(故事篇)
理解同步阻塞、同步非阻塞、非同步阻塞、非同步阻塞、非同步非阻塞
同步/ 非同步關注的是訊息通知的機制,而阻塞 / 非阻塞關注的是程式(執行緒)等待訊息通知時的狀態。
以小明下載檔案打個比方,從這兩個關注點來再次說明這兩組概念,希望能夠更好的促進大家的理解。
同步阻塞:小明一直盯著下載進度條,到 100% 的時候就完成。
同步體現在:等待下載完成通知;
阻塞體現在:等待下載完成通知過程中,不能做其他任務處理;
同步非阻塞:小明提交下載任務後就去幹別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。
同步體現在:等待下載完成通知,但是要在;
非阻塞體現在:等待下載完成通知過程中,去幹別的任務了,只是時不時會瞄一眼進度條;【小明必須要在兩個任務間切換,關注下載進度】
非同步阻塞:小明換了個有下載完成通知功能的軟體,下載完成就“叮”一聲。不過小明仍然一直等待“叮”的聲音(看起來很傻,不是嗎)。
非同步體現在:下載完成“叮”一聲通知;
阻塞體現在:等待下載完成“叮”一聲通知過程中,不能做其他任務處理;
非同步非阻塞:仍然是那個會“叮”一聲的下載軟體,小明提交下載任務後就去幹別的,聽到“叮”的一聲就知道完成了。
非同步體現在:下載完成“叮”一聲通知;
非阻塞體現在:等待下載完成“叮”一聲通知過程中,去幹別的任務了,只需要接收“叮”聲通知即可;【軟體處理下載任務,小明處理其他任務,不需關注進度,只需接收軟體“叮”聲通知,即可】
也就是說,同步/ 非同步是“下載完成訊息”通知的方式(機制),而阻塞 / 非阻塞則是在等待“下載完成訊息”通知過程中的狀態(能不能幹其他任務),在不同的場景下,同步 / 非同步、阻塞 / 非阻塞的四種組合都有應用。
所以,綜上所述,同步和非同步僅僅是關注的訊息如何通知的機制,而阻塞與非阻塞關注的是等待訊息通知時的狀態。也就是說,同步的情況下,是由處理訊息者自己去等待訊息是否被觸發,而非同步的情況下是由觸發機制來通知處理訊息者,所以在非同步機制中,處理訊息者和觸發機制之間就需要一個連線的橋樑:
在小明的例子中,這個橋樑就是軟體“叮”的聲音。
同步/ 非同步與阻塞 / 非阻塞 #
1 同步阻塞形式
效率是最低的,
拿上面的例子來說,就是你專心等待下載完成,什麼別的事都不做。
實際程式中:就是未對fd 設定 O_NONBLOCK 標誌位的 read/write 操作;
2 非同步阻塞形式
非同步操作是可以被阻塞住的,只不過它不是在處理訊息時阻塞,而是在等待訊息通知時被阻塞。
比如select 函式,假如傳入的最後一個 timeout 引數為 NULL ,那麼如果所關注的事件沒有一個被觸發,程式就會一直阻塞在這個 select 呼叫處。
3 同步非阻塞形式
實際上是效率低下的,
想象一下你一邊幹別的事情一邊還需要抬頭看下載完成沒有,如果把幹別的事情和觀察下載完成情況的位置看成是程式的兩個操作的話,這個程式需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的。
很多人會寫阻塞的read/write 操作,但是別忘了可以對 fd 設定 O_NONBLOCK 標誌位,這樣就可以將同步操作變成非阻塞的了。
4 非同步非阻塞形式
效率更高,
因為等待下載完成是你( 等待者 ) 的事情,而通知你則是電腦 ( 訊息觸發機制 ) 的事情,程式沒有在兩種不同的操作中來回切換。
至此,關於程式執行緒、同步非同步、阻塞非阻塞、併發並行已經講的差不多了,有講的不好的地方請大佬指出。同時也謝謝網上大佬的文章幫助我理解了這些概念。
參考連線:
https://www.zhihu.com/question/33515481/answer/58849148
https://www.cnblogs.com/dream844/archive/2012/06/12/2546083.html
https://www.jianshu.com/p/aed6067eeac9
https://www.zhihu.com/question/28550867/answer/55357128
About Me
........................................................................................................................ ● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除 ● 本文在itpub、部落格園、CSDN和個人微 信公眾號( xiaomaimiaolhr)上有同步更新 ● 本文itpub地址: http://blog.itpub.net/26736162 ● 本文部落格園地址: http://www.cnblogs.com/lhrbest ● 本文CSDN地址: https://blog.csdn.net/lihuarongaini ● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/ ● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA寶典今日頭條號地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ........................................................................................................................ ● QQ群號: 230161599 、618766405 ● 微 信群:可加我微 信,我拉大家進群,非誠勿擾 ● 聯絡我請加QQ好友 ( 646634621 ),註明新增緣由 ● 於 2020-03-01 06:00 ~ 2020-03-31 24:00 在西安完成 ● 最新修改時間:2020-03-01 06:00 ~ 2020-03-31 24:00 ● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解 ● 版權所有,歡迎分享本文,轉載請保留出處 ........................................................................................................................ ● 小麥苗的微店: https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麥苗出版的資料庫類叢書: http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麥苗OCP、OCM、高可用網路班: http://blog.itpub.net/26736162/viewspace-2148098/ ● 小麥苗騰訊課堂主頁: https://lhr.ke.qq.com/ ........................................................................................................................ 使用 微 信客戶端掃描下面的二維碼來關注小麥苗的微 信公眾號( xiaomaimiaolhr)及QQ群(DBA寶典)、新增小麥苗微 信, 學習最實用的資料庫技術。
........................................................................................................................ |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2678031/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 【OS】同步非同步/阻塞非阻塞、併發並行序列的區分非同步並行
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- 11、協程和io教程01 -- 併發 並行 同步 非同步 阻塞 非阻塞 以及 IO多路複用並行非同步
- 同步、非同步、阻塞、非阻塞的區別非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- java同步非阻塞IOJava
- 同步阻塞、同步非阻塞、多路複用的介紹
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- 單執行緒-非阻塞-長連結執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(下)伺服器模型執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(中)伺服器模型執行緒
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 非同步阻塞,Manager模組,執行緒非同步執行緒
- 【進階之路】併發程式設計(三)-非阻塞同步機制程式設計
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- 一篇文章讀懂阻塞,非阻塞,同步,非同步非同步
- 執行緒,程式,協程, 併發,並行,同步,非同步概念解析執行緒並行非同步
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- 【死磕NIO】— 阻塞、非阻塞、同步、非同步,傻傻分不清楚非同步
- Java 非阻塞 IO 和非同步 IOJava非同步
- python之IO併發-阻塞IO 非阻塞IO IO多路複用 非同步IO(協程)Python非同步
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數