詳情戳擊下方連接javascript
學習進程、線程、協程,引伸一些內容html
爲何要學習進程和線程:java
進程和線程目的是爲了:提升執行效率python
現代操做系統好比Mac OS X,UNIX,Linux,Windows等,都是支持「多任務」的操做系統。程序員
什麼叫「多任務「呢?簡單地說,就是操做系統能夠同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕做業,這就是多任務,至少同時有3個任務正在運行。還有不少任務悄悄地在後臺同時運行着,只是桌面上沒有顯示而已。瀏覽器
如今,多核CPU已經很是普及了,可是,即便過去的單核CPU,也能夠執行多任務。因爲CPU執行代碼都是順序執行的,那麼,單核CPU是怎麼執行多任務的呢?網絡
答案就是操做系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反覆執行下去。表面上看,每一個任務都是交替執行的,可是,因爲CPU的執行速度實在是太快了,咱們感受就像全部任務都在同時執行同樣。多線程
真正的並行執行多任務只能在多核CPU上實現,可是,因爲任務數量遠遠多於CPU的核心數量,因此,操做系統也會自動把不少任務輪流調度到每一個核心上執行。併發
對於操做系統來講,一個任務就是一個進程(Process),好比打開一個瀏覽器就是啓動一個瀏覽器進程,打開一個記事本就啓動了一個記事本進程,打開兩個記事本就啓動了兩個記事本進程,打開一個Word就啓動了一個Word進程。異步
有些進程還不止同時幹一件事,好比Word,它能夠同時進行打字、拼寫檢查、打印等事情。在一個進程內部,要同時幹多件事,就須要同時運行多個「子任務」,咱們把進程內的這些「子任務」稱爲線程(Thread)。
因爲每一個進程至少要幹一件事,因此,一個進程至少有一個線程。固然,像Word這種複雜的進程能夠有多個線程,多個線程能夠同時執行,多線程的執行方式和多進程是同樣的,也是由操做系統在多個線程之間快速切換,讓每一個線程都短暫地交替運行,看起來就像同時執行同樣。固然,真正地同時執行多線程須要多核CPU纔可能實現。
咱們前面編寫的全部的Python程序,都是執行單任務的進程,也就是隻有一個線程。若是咱們要同時執行多個任務怎麼辦?
有兩種解決方案:
一種是啓動多個進程,每一個進程雖然只有一個線程,但多個進程能夠一塊執行多個任務。
還有一種方法是啓動一個進程,在一個進程內啓動多個線程,這樣,多個線程也能夠一塊執行多個任務。
固然還有第三種方法,就是啓動多個進程,每一個進程再啓動多個線程,這樣同時執行的任務就更多了,固然這種模型更復雜,實際不多采用。
總結一下就是,多任務的實現有3種方式:
- 多進程模式;
- 多線程模式;
- 多進程+多線程模式。
同時執行多個任務一般各個任務之間並非沒有關聯的,而是須要相互通訊和協調,有時,任務1必須暫停等待任務2完成後才能繼續執行,有時,任務3和任務4又不能同時執行,因此,多進程和多線程的程序的複雜度要遠遠高於咱們前面寫的單進程單線程的程序。
由於複雜度高,調試困難,因此,不是無可奈何,咱們也不想編寫多任務。可是,有不少時候,沒有多任務還真不行。想一想在電腦上看電影,就必須由一個線程播放視頻,另外一個線程播放音頻,不然,單線程實現的話就只能先把視頻播放完再播放音頻,或者先把音頻播放完再播放視頻,這顯然是不行的。
Python既支持多進程,又支持多線程,咱們會討論如何編寫這兩種多任務程序。
小結
線程是最小的執行單元,而進程由至少一個線程組成。如何調度進程和線程,徹底由操做系統決定,程序本身不能決定何時執行,執行多長時間。
多進程和多線程的程序涉及到同步、數據共享的問題,編寫起來更復雜。
總之一句話,具體案例具體分析。須要根據實際的狀況,精準的定位問題的所在,而不會盲目去作方案
併發 & 並行
併發 : 是指系統具備處理多個任務(動做)的能力
並行 : 是指系統具備 同時 處理多個任務(動做)的能力
並行是否是併發的一個子集
同步 與 異步
同步: 當進程執行到一個IO(等待外部數據)的時候,------等:同步
異步: ------不等:一直等到數據接收成功,再回來處理
任務: IO密集型
計算密集型
對於IO密集型的任務 : python的多線程的是有意義的
能夠採用多進程+協程
對於計算密集型的任務: python的多線程就不推薦,python就不適用了。固然了能夠用進程,也能夠改C
倆種任務爲什麼有不一樣的針對性,在學習完進程、線程結束以後就會知道爲什麼這樣了
進程不是越多越好,線程天然也不是越多越好,具體案例具體分析,請求上下文耗時
計算機操做系統發展史
簡單來講,能夠概述說計算機一共發展了四代
爲何要有操做系統?
現代計算機系統是由一個或者多個處理器,主存,磁盤,打印機,鍵盤,鼠標顯示器,網絡接口以及各類其餘輸入
輸出設備組成的複雜系統,每位程序員不可能掌握全部系統實現的細節,而且管理優化這些部件是一件挑戰性極強
的工做。因此,咱們須要爲計算機安裝一層軟件,成爲操做系統,任務就是用戶程序提供一個簡單清晰的計算機模
型,並管理以上全部設備。
定義也就有了:操做系統是一個用來協調、管理和控制計算機硬件和軟件資源的系統程序,它位於硬件和應用程序之間。
(程序是運行在系統上的具備某種功能的軟件,好比說瀏覽器,音樂播放器等。)
操做系統的內核的定義:操做系統的內核是一個管理和控制程序,負責管理計算機的全部物理資源,其中包括:文件系
統、內存管理、設備管理和進程管理。
1、真空管與穿孔卡片(無操做系統)
過程:
萬能程序員們將對應於程序和數據的已穿孔的紙帶(或卡片)裝入輸入機,而後啓動輸入機把程序和數據輸入計算機
內存,接着經過控制檯開關啓動程序針對數據運行;計算完畢,打印機輸出計算結果;用戶取走結果並卸下紙帶(或
卡片)後,才讓下一個用戶上機。
注意點:
程序員須要在牆上的計時錶上預定時間
同一時刻只有一個程序在內存中被CPU調用運行(串行的)
優缺點:
優勢:程序員在申請的時間段內獨享整個資源,即時的調試本身的程序,若是有bug能夠當場處理,
缺點:這對於計算機提供商來講是一種浪費(你買一臺電腦4000塊,那 一年中你用365比只用1天,確定是省成本的,
物盡其用)
2、晶體管和批處理系統
一代計算機的問題: 人機交互太多了(輸入--->計算--->輸出 輸入--->計算--->輸出 輸入--->計算--->輸出 ) 解決辦法: 把一堆人的輸入攢成一大波輸入,而後順序計算(這是有問題的,可是第二代計算沒有解決)再把計算結果攢成 一大波輸出,這就是批處理系統 操做系統前身: 在收集了大約一個小時的批量做業以後,這些卡片被讀入磁帶,而後磁帶被送到機房裏並裝到磁帶上。而後磁帶被送到 機房裏並裝到磁帶機上。隨後,操做員裝入一個特殊的程序(此乃現代操做系統的前身),它負責從磁帶上讀入第一個 做業(job,一個或一組程序)並運行,其輸出寫到第二個磁帶上,並且不打印。每一個做業結束後,操做系統自動的從 磁帶上讀入下一個做業而且運行。當一整批的做業所有結束後,操做員去下輸入和輸出磁帶,講輸入磁帶換成下一批做 業,而且把輸出磁帶拿到一臺1041機器上進行脫機(不與主計算機聯機)打印 優勢:批處理 缺點: 1 圖的中間還有倆小人 2 仍然是順序計算
3、集成電路芯片和多道程序設計
針對二代計算機的兩個主要問題 開發出SPOOLING技術: 卡片被拿到機房後可以很快的將做業從卡片讀入磁盤,因而任什麼時候刻當一個做業結束時,操做系統就能將一個做業從磁 帶讀出,裝進空出啦的內存區域運行,這種技術叫作同時的外部設備聯機操做:SPOOLING該技術同時用於輸出。當採 用了這種技術後,就不在須要IBM1401機了,也沒必要將磁帶搬來搬去了(中間倆小人失業了),強化了操做系統的功能 開發出多道程序設計,用於解決順序執行的問題: 在7094機上(程序運行的機器),若當前做業因等待磁帶或等待其餘IO操做而暫停,CPU就處於休閒狀態直至IO操做 完成,對於CPU密集的科學計算,IO操做少,浪費時間不明顯,對於商業數據處理,IO等待能到達80%~90%,因此必 須解決CPU浪費的現象。 解決方案:將內存分爲幾個部分,每一部分存放不一樣的做業,如圖1-5所示。當一個做業等待IO完成時,另外一個做業能夠 使用CPU,內存中放足夠的做業,則CPU的利用率能接近100% 此時的第三代計算機適合大型科學計算和繁忙的商務數據處理,但,本質上其還是一個批處理系統。 雖然解決了諸如以上問題,但多個做業必須在所有運行結束後,才能獲得結果,從一個做業的提交到運算結果取回每每 長達數小時。 想象一個場景:A君 B君 C君 三個程序員同時在調試程序,一旦A君寫錯一個逗號,那麼可能須要半天的時間才能看到結 果,由於B君C君的結果也同時運算出來了。時間必然要長。一言以蔽之:你們一塊兒存做業,你們一塊兒去數據(磁帶) 許多程序員懷念第一代獨享的計算機,能夠即時調試本身的程序。爲了知足程序員們很快能夠獲得響應,出現了分時操做系統 分時操做系統:多個聯機終端+多道技術 20個客戶端同時加載到內存,有17在思考,3個在運行,cpu就採用多道的方式處理內存中的這3個程序,因爲客戶提交的通常 都是簡短的指令並且不多有耗時長的,索引計算機可以爲許多用戶提供快速的交互式服務,全部的用戶都覺得本身獨享了計 算機資源
4、我的計算機
隨着大規模集成電路的發展,每平方釐米的硅片芯片上能夠集成數千個晶體管,我的計算機的時代就此到來。
5、須要知道的東西
每一個cpu都有其一套可執行的專門指令集,如SPARC和Pentium,其實每一個硬件之上都要有一個控制程序,cpu的指令集就是cpu的控制程序。
內核態於與用戶態指的是計算機的兩種工做狀態
即cpu的兩種工做狀態
(如今的操做系統都是分時操做系統,分時的根源來自於硬件層面操做系統內核佔用的內存與應用程序佔用的內存彼此之間隔離)
cpu經過psw(程序狀態寄存器)中的一個2進制位來控制cpu自己的工做狀態,即內核態與用戶態。
內核態:操做系統內核只能運做於cpu的內核態,這種狀態意味着能夠執行cpu全部的指令,能夠執行cpu全部的指令,這也意味着對計算機硬件資源有着徹底的控制權限,而且能夠控制cpu工做狀態由內核態轉成用戶態。
用戶態:應用程序只能運做於cpu的用戶態,這種狀態意味着只能執行cpu全部的指令的一小部分(或者稱爲全部指令的一個子集),這一小部分指令對計算機的硬件資源沒有訪問權限(好比I/O),而且不能控制由用戶態轉成內核態.