關於進程,線程,協程是面試中常常可見的問題,接下來這篇文章幫你梳理一下,讓你輕鬆應對面試官。python
一個程序的執行實例就是一個進程。每個進程提供執行程序所需的全部資源。(進程本質上就是資源的集合)程序員
進程擁有本身獨立的堆和棧,堆和棧都不共享,由操做系統進行調度。面試
線程是操做系統可以進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運做單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,每一個線程並行執行不一樣的任務。bash
線程擁有本身獨立的棧,可是堆是共享的,標準的線程也是由操做系統調度的。多線程
文末補充什麼是併發什麼是並行併發
來補充一下,拿個例子簡單理解進程,線程!socket
作個簡單的比喻:進程=火車,線程=車箱atom
• 線程在進程下行進(單純的車箱沒法運行)spa
• 一個進程能夠包含多個線程(一輛火車能夠有多個車箱)操作系統
• 不一樣進程間數據很難共享(一輛火車上的乘客很難換到另一輛火車,好比站點換乘)
• 同一進程下不一樣線程間數據很易共享(A車箱換到B車箱很容易)
• 進程要比線程消耗更多的計算機資源(採用多列火車相比多個車箱更耗資源)
• 進程間不會相互影響,一個線程掛掉將致使整個進程掛掉(一列火車不會影響到另一列火車, 可是若是一列火車上中間的一節車箱着火了,將影響到全部車箱)
• 進程能夠拓展到多機,進程最多適合多核(不一樣火車能夠開在多個軌道上,同一火車的車箱不能 在行進的不一樣的軌道上)
• 進程使用的內存地址能夠上鎖,即一個線程使用某些共享內存時,其餘線程必須等它結束,才能 使用這一塊內存。(好比火車上的洗手間)-"互斥鎖"
• 進程使用的內存地址能夠限定使用量(好比火車上的餐廳,最多隻容許多少人進入,若是滿了需 要在門口等,等有人出來了才能進去)-「信號量」
線程和進程的操做是由程序觸發系統接口,最後執行者是系統,本質是操做系統提供的功能,而協程操做是由程序員指定的。
協程共享堆,不共享棧。
多進程就是分享了系統的時間片,例如你能夠同時聽歌和聊qq
多線程就是,當一個進程中有些數據,每一個均可以被訪問,每一個數據均可以被每一個線程訪問。多線程是爲了同步完成多項任務,不是爲了提升運行效率,而是爲了提升資源使用效率來提升系統的效率。
多線程同步的問題,如何解決鴨(哲學家就餐問題) 1,簡單的操做交給atomic(保證一個原子週期完成)2,加鎖(互斥鎖,信號量,讀寫鎖,自旋鎖,python裏面有個GIL也能夠了解下哦)
加鎖後,對資源有全部權,在全部操做結束前,其餘想要這個資源的人,必須等着
若是面試官問了,進程和線程有什麼本質區別
能夠簡單地說:
進程間通訊方式大概有socket,pipe,file等,對線程來講是不同的,
假設n線程來講均可以看到全局的數據,直接進行通訊。
也就是說對於一個進程來講,你持有了一個頁表,對於同一個進程內的線程,是共享了同一個頁表。
固然你也能夠提出一些前面的區別,好比線程是啥,進程是啥,balala
複製代碼
補充一下併發和並行。由 Erlang 之父 Joe Armstrong舉一個栗子
併發是兩個隊列交替使用一臺咖啡機,並行是兩個隊列同時使用兩臺咖啡機,若是串行,一個隊列 使用一臺咖啡機,那麼哪怕前面那我的便祕了去廁所呆半天,後面的人也只能死等着他回來才能去 接咖啡,這效率無疑是最低的。
併發和並行均可以是不少個線程,就看這些線程能不能同時被(多個)cpu執行,若是能夠就 說明是並行,而併發是多個線程被(一個)cpu 輪流切換着執行。
這篇文章前先後後補充了一些東西,感受邏輯有點混了,太多東西了,不理解能夠評論或者郵箱(isysc1@163.com)我,我會及時回覆的,若是文章對你有幫助,請點贊,哈哈哈哈(づ ̄3 ̄)