程序、執行緒基礎知識全家桶,30 張圖一套帶走
前言
先來看看一則小故事
我們寫好的一行行程式碼,為了讓其工作起來,我們還得把它送進城(程序)裡,那既然進了城裡,那肯定不能胡作非為了。
城裡人有城裡人的規矩,城中有個專門管轄你們的城管(作業系統),人家讓你休息就休息,讓你工作就工作,畢竟攤位不多,每個人都要佔這個攤位來工作,城裡要工作的人多著去了。
所以城管為了公平起見,它使用一種策略(排程)方式,給每個人一個固定的工作時間(時間片),時間到了就會通知你去休息而換另外一個人上場工作。
另外,在休息時候你也不能偷懶,要記住工作到哪了,不然下次到你工作了,你忘記工作到哪了,那還怎麼繼續?
有的人,可能還進入了縣城(執行緒)工作,這裡相對輕鬆一些,在休息的時候,要記住的東西相對較少,而且還能共享城裡的資源。
“哎喲,難道本文內容是程序和執行緒?”
可以,聰明的你猜出來了,也不枉費我瞎編亂造的故事了。
程序和執行緒對於寫程式碼的我們,真的天天見、日日見了,但見的多不代表你就熟悉它們,比如簡單問你一句,你知道它們的工作原理和區別嗎?
不知道沒關係,今天就要跟大家討論作業系統的程序和執行緒。
提綱正文
程序
我們編寫的程式碼只是一個儲存在硬碟的靜態檔案,通過編譯後就會生成二進位制可執行檔案,當我們執行這個可執行檔案後,它會被裝載到記憶體中,接著 CPU 會執行程式中的每一條指令,那麼這個執行中的程式,就被稱為「程序」。
現在我們考慮有一個會讀取硬碟檔案資料的程式被執行了,那麼當執行到讀取檔案的指令時,就會去從硬碟讀取資料,但是硬碟的讀寫速度是非常慢的,那麼在這個時候,如果 CPU 傻傻的等硬碟返回資料的話,那 CPU 的利用率是非常低的。
做個類比,你去煮開水時,你會傻傻的等水壺燒開嗎?很明顯,小孩也不會傻等。我們可以在水壺燒開之前去做其他事情。當水壺燒開了,我們自然就會聽到“嘀嘀嘀”的聲音,於是再把燒開的水倒入到水杯裡就好了。
所以,當程序要從硬碟讀取資料時,CPU 不需要阻塞等待資料的返回,而是去執行另外的程序。當硬碟資料返回時,CPU 會收到箇中斷,於是 CPU 再繼續執行這個程序。
程序 1 與程序 2 切換這種多個程式、交替執行的思想,就有 CPU 管理多個程序的初步想法。
對於一個支援多程序的系統,CPU 會從一個程序快速切換至另一個程序,其間每個程序各執行幾十或幾百個毫秒。
雖然單核的 CPU 在某一個瞬間,只能執行一個程序。但在 1 秒鐘期間,它可能會執行多個程序,這樣就產生並行的錯覺,實際上這是併發。
併發和並行有什麼區別?
一圖勝千言。
併發與並行程序與程式的關係的類比
到了晚飯時間,一對小情侶肚子都咕咕叫了,於是男生見機行事,就想給女生做晚飯,所以他就在網上找了辣子雞的菜譜,接著買了一些雞肉、辣椒、香料等材料,然後邊看邊學邊做這道菜。
突然,女生說她想喝可樂,那麼男生只好把做菜的事情暫停一下,並在手機菜譜標記做到哪一個步驟,把狀態資訊記錄了下來。
然後男生聽從女生的指令,跑去下樓買了一瓶冰可樂後,又回到廚房繼續做菜。
這體現了,CPU 可以從一個程序(做菜)切換到另外一個程序(買可樂),在切換前必須要記錄當前程序中執行的狀態資訊,以備下次切換回來的時候可以恢復執行。
所以,可以發現程序有著「執行 - 暫停 - 執行」的活動規律。
程序的狀態
在上面,我們知道了程序有著「執行 - 暫停 - 執行」的活動規律。一般說來,一個程序並不是自始至終連續不停地執行的,它與併發執行中的其他程序的執行是相互制約的。
它有時處於執行狀態,有時又由於某種原因而暫停執行處於等待狀態,當使它暫停的原因消失後,它又進入準備執行狀態。
所以,在一個程序的活動期間至少具備三種基本狀態,即執行狀態、就緒狀態、阻塞狀態。
程序的三種基本狀態上圖中各個狀態的意義:
- 執行狀態(Runing):該時刻程序佔用 CPU;
- 就緒狀態(Ready):可執行,但因為其他程序正在執行而暫停停止;
- 阻塞狀態(Blocked):該程序正在等待某一事件發生(如等待輸入/輸出操作的完成)而暫時停止執行,這時,即使給它CPU控制權,它也無法執行;
當然,程序另外兩個基本狀態:
- 建立狀態(new):程序正在被建立時的狀態;
- 結束狀態(Exit):程序正在從系統中消失時的狀態;
於是,一個完整的程序狀態的變遷如下圖:
程序五種狀態的變遷再來詳細說明一下程序的狀態變遷:
- NULL -> 建立狀態:一個新程序被建立時的第一個狀態;
- 建立狀態 -> 就緒狀態:當程序被建立完成並初始化後,一切就緒準備執行時,變為就緒狀態,這個過程是很快的;
- 就緒態 -> 執行狀態:處於就緒狀態的程序被作業系統的程序排程器選中後,就分配給 CPU 正式執行該程序;
- 執行狀態 -> 結束狀態:當程序已經執行完成或出錯時,會被作業系統作結束狀態處理;
- 執行狀態 -> 就緒狀態:處於執行狀態的程序在執行過程中,由於分配給它的執行時間片用完,作業系統會把該程序變為就緒態,接著從就緒態選中另外一個程序執行;
- 執行狀態 -> 阻塞狀態:當程序請求某個事件且必須等待時,例如請求 I/O 事件;
- 阻塞狀態 -> 就緒狀態:當程序要等待的事件完成時,它從阻塞狀態變到就緒狀態;
如果有大量處於阻塞狀態的程序,程序可能會佔用著實體記憶體空間,顯然不是我們所希望的,畢竟實體記憶體空間是有限的,被阻塞狀態的程序佔用著實體記憶體就一種浪費實體記憶體的行為。
所以,在虛擬記憶體管理的作業系統中,通常會把阻塞狀態的程序的實體記憶體空間換出到硬碟,等需要再次執行的時候,再從硬碟換入到實體記憶體。
虛擬記憶體管理-換入換出那麼,就需要一個新的狀態,來描述程序沒有佔用實際的實體記憶體空間的情況,這個狀態就是掛起狀態。這跟阻塞狀態是不一樣,阻塞狀態是等待某個事件的返回。
另外,掛起狀態可以分為兩種:
- 阻塞掛起狀態:程序在外存(硬碟)並等待某個事件的出現;
- 就緒掛起狀態:程序在外存(硬碟),但只要進入記憶體,即刻立刻執行;
這兩種掛起狀態加上前面的五種狀態,就變成了七種狀態變遷(留給我的顏色不多了),見如下圖:
七種狀態變遷導致程序掛起的原因不只是因為程序所使用的記憶體空間不在實體記憶體,還包括如下情況:
- 通過 sleep 讓程序間歇性掛起,其工作原理是設定一個定時器,到期後喚醒程序。
- 使用者希望掛起一個程式的執行,比如在 Linux 中用
Ctrl+Z
掛起程序;
程序的控制結構
在作業系統中,是用程序控制塊(process control block,PCB)資料結構來描述程序的。
那 PCB 是什麼呢?開啟知乎搜尋你就會發現這個東西並不是那麼簡單。
知乎搜 PCB 的提示打住打住,我們是個正經的人,怎麼會去看那些問題呢?是吧,回來回來。
PCB 是程序存在的唯一標識,這意味著一個程序的存在,必然會有一個 PCB,如果程序消失了,那麼 PCB 也會隨之消失。
PCB 具體包含什麼資訊呢?
程序描述資訊:
- 程序識別符號:標識各個程序,每個程序都有一個並且唯一的識別符號;
- 使用者識別符號:程序歸屬的使用者,使用者識別符號主要為共享和保護服務;
程序控制和管理資訊:
- 程序當前狀態,如 new、ready、running、waiting 或 blocked 等;
- 程序優先順序:程序搶佔 CPU 時的優先順序;
資源分配清單:
- 有關記憶體地址空間或虛擬地址空間的資訊,所開啟檔案的列表和所使用的 I/O 裝置資訊。
CPU 相關資訊:
- CPU 中各個暫存器的值,當程序被切換時,CPU 的狀態資訊都會被儲存在相應的 PCB 中,以便程序重新執行時,能從斷點處繼續執行。
可見,PCB 包含資訊還是比較多的。
每個 PCB 是如何組織的呢?
通常是通過連結串列的方式進行組織,把具有相同狀態的程序鏈在一起,組成各種佇列。比如:
- 將所有處於就緒狀態的程序鏈在一起,稱為就緒佇列;
- 把所有因等待某事件而處於等待狀態的程序鏈在一起就組成各種阻塞佇列;
- 另外,對於執行佇列在單核 CPU 系統中則只有一個執行指標了,因為單核 CPU 在某個時間,只能執行一個程式。
那麼,就緒佇列和阻塞佇列連結串列的組織形式如下圖:
就緒佇列和阻塞佇列除了連結的組織方式,還有索引方式,它的工作原理:將同一狀態的程序組織在一個索引表中,索引表項指向相應的 PCB,不同狀態對應不同的索引表。
一般會選擇連結串列,因為可能面臨程序建立,銷燬等排程導致程序狀態發生變化,所以連結串列能夠更加靈活的插入和刪除。
程序的控制
我們熟知了程序的狀態變遷和程序的資料結構 PCB 後,再來看看程序的建立、終止、阻塞、喚醒的過程,這些過程也就是程序的控制。
01 建立程序
作業系統允許一個程序建立另一個程序,而且允許子程序繼承父程序所擁有的資源,當子程序被終止時,其在父程序處繼承的資源應當還給父程序。同時,終止父程序時同時也會終止其所有的子程序。
建立程序的過程如下:
- 為新程序分配一個唯一的程序標識號,並申請一個空白的 PCB,PCB 是有限的,若申請失敗則建立失敗;
- 為程序分配資源,此處如果資源不足,程序就會進入等待狀態,以等待資源;
- 初始化 PCB;
- 如果程序的排程佇列能夠接納新程序,那就將程序插入到就緒佇列,等待被排程執行;
02 終止程序
程序可以有 3 種終止方式:正常結束、異常結束以及外界干預(訊號 kill
掉)。
終止程序的過程如下:
- 查詢需要終止的程序的 PCB;
- 如果處於執行狀態,則立即終止該程序的執行,然後將 CPU 資源分配給其他程序;
- 如果其還有子程序,則應將其所有子程序終止;
- 將該程序所擁有的全部資源都歸還給父程序或作業系統;
- 將其從 PCB 所在佇列中刪除;
03 阻塞程序
當程序需要等待某一事件完成時,它可以呼叫阻塞語句把自己阻塞等待。而一旦被阻塞等待,它只能由另一個程序喚醒。
阻塞程序的過程如下:
- 找到將要被阻塞程序標識號對應的 PCB;
- 如果該程序為執行狀態,則保護其現場,將其狀態轉為阻塞狀態,停止執行;
- 將該 PCB 插入的阻塞佇列中去;
04 喚醒程序
程序由「執行」轉變為「阻塞」狀態是由於程序必須等待某一事件的完成,所以處於阻塞狀態的程序是絕對不可能叫醒自己的。
如果某程序正在等待 I/O 事件,需由別的程序發訊息給它,則只有當該程序所期待的事件出現時,才由發現者程序用喚醒語句叫醒它。
喚醒程序的過程如下:
- 在該事件的阻塞佇列中找到相應程序的 PCB;
- 將其從阻塞佇列中移出,並置其狀態為就緒狀態;
- 把該 PCB 插入到就緒佇列中,等待排程程式排程;
程序的阻塞和喚醒是一對功能相反的語句,如果某個程序呼叫了阻塞語句,則必有一個與之對應的喚醒語句。
程序的上下文切換
各個程序之間是共享 CPU 資源的,在不同的時候程序之間需要切換,讓不同的程序可以在 CPU 執行,那麼這個一個程序切換到另一個程序執行,稱為程序的上下文切換。
在詳細說程序上下文切換前,我們先來看看 CPU 上下文切換
大多數作業系統都是多工,通常支援大於 CPU 數量的任務同時執行。實際上,這些任務並不是同時執行的,只是因為系統在很短的時間內,讓各個任務分別在 CPU 執行,於是就造成同時執行的錯覺。
任務是交給 CPU 執行的,那麼在每個任務執行前,CPU 需要知道任務從哪裡載入,又從哪裡開始執行。
所以,作業系統需要事先幫 CPU 設定好 CPU 暫存器和程式計數器。
CPU 暫存器是 CPU 內部一個容量小,但是速度極快的記憶體(快取)。我舉個例子,暫存器像是你的口袋,記憶體像你的書包,硬碟則是你家裡的櫃子,如果你的東西存放到口袋,那肯定是比你從書包或家裡櫃子取出來要快的多。
再來,程式計數器則是用來儲存 CPU 正在執行的指令位置、或者即將執行的下一條指令位置。
所以說,CPU 暫存器和程式計數是 CPU 在執行任何任務前,所必須依賴的環境,這些環境就叫做 CPU 上下文。
既然知道了什麼是 CPU 上下文,那理解 CPU 上下文切換就不難了。
CPU 上下文切換就是先把前一個任務的 CPU 上下文(CPU 暫存器和程式計數器)儲存起來,然後載入新任務的上下文到這些暫存器和程式計數器,最後再跳轉到程式計數器所指的新位置,執行新任務。
系統核心會儲存保持下來的上下文資訊,當此任務再次被分配給 CPU 執行時,CPU 會重新載入這些上下文,這樣就能保證任務原來的狀態不受影響,讓任務看起來還是連續執行。
上面說到所謂的「任務」,主要包含程序、執行緒和中斷。所以,可以根據任務的不同,把 CPU 上下文切換分成:程序上下文切換、執行緒上下文切換和中斷上下文切換。
程序的上下文切換到底是切換什麼呢?
程序是由核心管理和排程的,所以程序的切換隻能發生在核心態。
所以,程序的上下文切換不僅包含了虛擬記憶體、棧、全域性變數等使用者空間的資源,還包括了核心堆疊、暫存器等核心空間的資源。
通常,會把交換的資訊儲存在程序的 PCB,當要執行另外一個程序的時候,我們需要從這個程序的 PCB 取出上下文,然後恢復到 CPU 中,這使得這個程序可以繼續執行,如下圖所示:
程序上下文切換大家需要注意,程序的上下文開銷是很關鍵的,我們希望它的開銷越小越好,這樣可以使得程序可以把更多時間花費在執行程式上,而不是耗費在上下文切換。
發生程序上下文切換有哪些場景?
- 為了保證所有程序可以得到公平排程,CPU 時間被劃分為一段段的時間片,這些時間片再被輪流分配給各個程序。這樣,當某個程序的時間片耗盡了,程序就從執行狀態變為就緒狀態,系統從就緒佇列選擇另外一個程序執行;
- 程序在系統資源不足(比如記憶體不足)時,要等到資源滿足後才可以執行,這個時候程序也會被掛起,並由系統排程其他程序執行;
- 當程序通過睡眠函式 sleep 這樣的方法將自己主動掛起時,自然也會重新排程;
- 當有優先順序更高的程序執行時,為了保證高優先順序程序的執行,當前程序會被掛起,由高優先順序程序來執行;
- 發生硬體中斷時,CPU 上的程序會被中斷掛起,轉而執行核心中的中斷服務程式;
以上,就是發生程序上下文切換的常見場景了。
執行緒
在早期的作業系統中都是以程序作為獨立執行的基本單位,直到後面,電腦科學家們又提出了更小的能獨立執行的基本單位,也就是執行緒。
為什麼使用執行緒?
我們舉個例子,假設你要編寫一個視訊播放器軟體,那麼該軟體功能的核心模組有三個:
- 從視訊檔案當中讀取資料;
- 對讀取的資料進行解壓縮;
- 把解壓縮後的視訊資料播放出來;
對於單程序的實現方式,我想大家都會是以下這個方式:
單程序實現方式對於單程序的這種方式,存在以下問題:
- 播放出來的畫面和聲音會不連貫,因為當 CPU 能力不夠強的時候,
Read
的時候可能程序就等在這了,這樣就會導致等半天才進行資料解壓和播放; - 各個函式之間不是併發執行,影響資源的使用效率;
那改進成多程序的方式:
多程序實現方式對於多程序的這種方式,依然會存在問題:
- 程序之間如何通訊,共享資料?
- 維護程序的系統開銷較大,如建立程序時,分配資源、建立 PCB;終止程序時,回收資源、撤銷 PCB;程序切換時,儲存當前程序的狀態資訊;
那到底如何解決呢?需要有一種新的實體,滿足以下特性:
- 實體之間可以併發執行;
- 實體之間共享相同的地址空間;
這個新的實體,就是執行緒( Thread ),執行緒之間可以併發執行且共享相同的地址空間。
什麼是執行緒?
執行緒是程序當中的一條執行流程。
同一個程序內多個執行緒之間可以共享程式碼段、資料段、開啟的檔案等資源,但每個執行緒都有獨立一套的暫存器和棧,這樣可以確保執行緒的控制流是相對獨立的。
多執行緒執行緒的優缺點?
執行緒的優點:
- 一個程序中可以同時存在多個執行緒;
- 各個執行緒之間可以併發執行;
- 各個執行緒之間可以共享地址空間和檔案等資源;
執行緒的缺點:
- 當程序中的一個執行緒奔潰時,會導致其所屬程序的所有執行緒奔潰。
舉個例子,對於遊戲的使用者設計,則不應該使用多執行緒的方式,否則一個使用者掛了,會影響其他同個程序的執行緒。
執行緒與程序的比較
執行緒與程序的比較如下:
- 程序是資源(包括記憶體、開啟的檔案等)分配的單位,執行緒是 CPU 排程的單位;
- 程序擁有一個完整的資源平臺,而執行緒只獨享必不可少的資源,如暫存器和棧;
- 執行緒同樣具有就緒、阻塞、執行三種基本狀態,同樣具有狀態之間的轉換關係;
- 執行緒能減少併發執行的時間和空間開銷;
對於,執行緒相比程序能減少開銷,體現在:
- 執行緒的建立時間比程序快,因為程序在建立的過程中,還需要資源管理資訊,比如記憶體管理資訊、檔案管理資訊,而執行緒在建立的過程中,不會涉及這些資源管理資訊,而是共享它們;
- 執行緒的終止時間比程序快,因為執行緒釋放的資源相比程序少很多;
- 同一個程序內的執行緒切換比程序切換快,因為執行緒具有相同的地址空間(虛擬記憶體共享),這意味著同一個程序的執行緒都具有同一個頁表,那麼在切換的時候不需要切換頁表。而對於程序之間的切換,切換的時候要把頁表給切換掉,而頁表的切換過程開銷是比較大的;
- 由於同一程序的各執行緒間共享記憶體和檔案資源,那麼線上程之間資料傳遞的時候,就不需要經過核心了,這就使得執行緒之間的資料互動效率更高了;
所以,執行緒比程序不管是時間效率,還是空間效率都要高。
執行緒的上下文切換
在前面我們知道了,執行緒與程序最大的區別在於:執行緒是排程的基本單位,而程序則是資源擁有的基本單位。
所以,所謂作業系統的任務排程,實際上的排程物件是執行緒,而程序只是給執行緒提供了虛擬記憶體、全域性變數等資源。
對於執行緒和程序,我們可以這麼理解:
- 當程序只有一個執行緒時,可以認為程序就等於執行緒;
- 當程序擁有多個執行緒時,這些執行緒會共享相同的虛擬記憶體和全域性變數等資源,這些資源在上下文切換時是不需要修改的;
另外,執行緒也有自己的私有資料,比如棧和暫存器等,這些在上下文切換時也是需要儲存的。
執行緒上下文切換的是什麼?
這還得看執行緒是不是屬於同一個程序:
- 當兩個執行緒不是屬於同一個程序,則切換的過程就跟程序上下文切換一樣;
- 當兩個執行緒是屬於同一個程序,因為虛擬記憶體是共享的,所以在切換時,虛擬記憶體這些資源就保持不動,只需要切換執行緒的私有資料、暫存器等不共享的資料;
所以,執行緒的上下文切換相比程序,開銷要小很多。
執行緒的實現
主要有三種執行緒的實現方式:
- 使用者執行緒(User Thread):在使用者空間實現的執行緒,不是由核心管理的執行緒,是由使用者態的執行緒庫來完成執行緒的管理;
- 核心執行緒(Kernel Thread):在核心中實現的執行緒,是由核心管理的執行緒;
- 輕量級程序(LightWeight Process):在核心中來支援使用者執行緒;
那麼,這還需要考慮一個問題,使用者執行緒和核心執行緒的對應關係。
首先,第一種關係是多對一的關係,也就是多個使用者執行緒對應同一個核心執行緒:
多對一第二種是一對一的關係,也就是一個使用者執行緒對應一個核心執行緒:
一對一第三種是多對多的關係,也就是多個使用者執行緒對應到多個核心執行緒:
多對多使用者執行緒如何理解?存在什麼優勢和缺陷?
使用者執行緒是基於使用者態的執行緒管理庫來實現的,那麼執行緒控制塊(Thread Control Block, TCB) 也是在庫裡面來實現的,對於作業系統而言是看不到這個 TCB 的,它只能看到整個程序的 PCB。
所以,使用者執行緒的整個執行緒管理和排程,作業系統是不直接參與的,而是由使用者級執行緒庫函式來完成執行緒的管理,包括執行緒的建立、終止、同步和排程等。
使用者級執行緒的模型,也就類似前面提到的多對一的關係,即多個使用者執行緒對應同一個核心執行緒,如下圖所示:
使用者級執行緒模型使用者執行緒的優點:
- 每個程序都需要有它私有的執行緒控制塊(TCB)列表,用來跟蹤記錄它各個執行緒狀態資訊(PC、棧指標、暫存器),TCB 由使用者級執行緒庫函式來維護,可用於不支援執行緒技術的作業系統;
- 使用者執行緒的切換也是由執行緒庫函式來完成的,無需使用者態與核心態的切換,所以速度特別快;
使用者執行緒的缺點:
- 由於作業系統不參與執行緒的排程,如果一個執行緒發起了系統呼叫而阻塞,那程序所包含的使用者執行緒都不能執行了。
- 當一個執行緒開始執行後,除非它主動地交出 CPU 的使用權,否則它所在的程序當中的其他執行緒無法執行,因為使用者態的執行緒沒法打斷當前執行中的執行緒,它沒有這個特權,只有作業系統才有,但是使用者執行緒不是由作業系統管理的。
- 由於時間片分配給程序,故與其他程序比,在多執行緒執行時,每個執行緒得到的時間片較少,執行會比較慢;
以上,就是使用者執行緒的優缺點了。
那核心執行緒如何理解?存在什麼優勢和缺陷?
核心執行緒是由作業系統管理的,執行緒對應的 TCB 自然是放在作業系統裡的,這樣執行緒的建立、終止和管理都是由作業系統負責。
核心執行緒的模型,也就類似前面提到的一對一的關係,即一個使用者執行緒對應一個核心執行緒,如下圖所示:
核心執行緒模型核心執行緒的優點:
- 在一個程序當中,如果某個核心執行緒發起系統呼叫而被阻塞,並不會影響其他核心執行緒的執行;
- 分配給執行緒,多執行緒的程序獲得更多的 CPU 執行時間;
核心執行緒的缺點:
- 在支援核心執行緒的作業系統中,由核心來維護程序和執行緒的上下問資訊,如 PCB 和 TCB;
- 執行緒的建立、終止和切換都是通過系統呼叫的方式來進行,因此對於系統來說,系統開銷比較大;
以上,就是核心線的優缺點了。
最後的輕量級程序如何理解?
輕量級程序(Light-weight process,LWP)是核心支援的使用者執行緒,一個程序可有一個或多個 LWP,每個 LWP 是跟核心執行緒一對一對映的,也就是 LWP 都是由一個核心執行緒支援。
另外,LWP 只能由核心管理並像普通程序一樣被排程,Linux 核心是支援 LWP 的典型例子。
在大多數系統中,LWP與普通程序的區別也在於它只有一個最小的執行上下文和排程程式所需的統計資訊。一般來說,一個程序代表程式的一個例項,而 LWP 代表程式的執行執行緒,因為一個執行執行緒不像程序那樣需要那麼多狀態資訊,所以 LWP 也不帶有這樣的資訊。
相關推薦
程序、執行緒基礎知識全家桶,30 張圖一套帶走
前言 先來看看一則小故事 我們寫好的一行行程式碼,為了讓其工作起來,我們還得把它送進城(程序)裡,那既然進了城裡,那肯定不能胡作非為了。 城裡人有城裡人的規矩,城中有個專門管轄你們的城管(作業系統),人家讓你休息就休息,讓你工作就工作,畢竟攤位不多,每個人都要佔這個攤位來工作,城裡要工作的人多著去了。
程序、執行緒基礎知識點總結
總體的解釋: 轉自知乎:https://www.zhihu.com/question/25532384/answer/81152571 首先來一句概括的總論:程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。 下面細說背景: CPU+RAM+各種資源(比如顯示卡,光碟機,鍵盤,GP
Android 程序與執行緒基礎知識 及 如何停止程序
當一個程式第一次啟動的時候,Android會啟動一個LINUX程序和一個主執行緒。預設的情況下,所有該程式的元件都將在該程序和執行緒中執行。同時,Android會為每個應用程式分配一個單獨的LINUX使用者。Android會盡量保留一個正在執行程序,只在記憶體資源出現不足時
Python程序、執行緒、協程詳解、執行效能、效率(tqdm)
多程序實踐——multiprocessing 筆者最近在實踐多程序發現multiprocessing,真心很好用,不僅加速了運算,同時可以GPU呼叫,而且互相之間無關聯,這樣可以很放心的進行計算。 譬如(參考:多程序): from multiprocessing import Pool
程序、執行緒和多執行緒基本概念
程序、執行緒和多執行緒基本概念 一、概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。
執行緒基礎知識入門
xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 前言:什麼是執行緒?執行緒,有時被稱為輕量程序(Lightweight Pro
程序、執行緒與協程
程序 程序的出現是為了更好的利用CPU資源使到併發成為可能。 假設有兩個任務A和B,當A遇到IO操作,CPU默默的等待任務A讀取完操作再去執行任務B,這樣無疑是對CPU資源的極大的浪費。聰明的老大們就在想若在任務A讀取資料時,讓任務B執行,當任務A讀取完資料後,再切換到任務A執行。注意關
程序、執行緒與多執行緒
一、說說概念 1、程序(process) 狹義定義:程序就是一段程式的執行過程。 廣義定義:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。 簡單的來講程序的概念主
雜談(第1篇) | 程序、執行緒、協程的區別與聯絡
作為程式設計師,在面試的時候經常被問到:說說程序、執行緒、協程的區別。下面我們就總結一下。 1.面試答案 1.1 程序與執行緒的區別 總述:執行緒是程序的一個實體,一個程序至少有一個執行緒。 1.根本區別;程序是作業系統資源分配的基本
程序、執行緒、協程篇
本節內容 作業系統發展史介紹 程序、與執行緒區別 python GIL全域性直譯器鎖 執行緒 語法 join 執行緒鎖之Lock\Rlock\訊號量 將執行緒變為守護程序 Event事件 queue佇列 生產者消費者模型 Queue佇
Python—程序、執行緒、協程
一、執行緒 執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務 方法: start &
python 程序、執行緒
一、python程式的執行原理 許多時候,在執行一個python檔案的時候,會發現在同一目錄下會出現一個__pyc__資料夾(python3)或者.pyc字尾(python2)的檔案 Python在執行時,首先會將.py檔案中的原始碼編譯成Python的byte code(位元組碼),然後再由Python
java 程序、執行緒
程序是作業系統中執行的一個任務(一個任務程式執行在一個程序中),如一個qq程式就是一個程序。程序是一塊包含了某些資源的記憶體區域,作業系統利用程序把它的工作劃分為一些功能單元,這些功能單元就稱為程序。程序還擁有一個私有的虛擬地址空間僅能被它所包含的執行緒訪問。執行緒只能歸屬於一個程序且只能訪問該程序
任務、程序、執行緒之間的區別
任務(task)是最抽象的,是一個一般性的術語,指由軟體完成的一個活動。一個任務既可以是一個程序,也可以是一個執行緒。簡而
關於作業系統中程序、執行緒、和任務之間的關係
Vxworks系統中程序、執行緒和任務之間的關係  
python 程序、執行緒 (二)
一、多執行緒與多程序的對比 在python 程序、執行緒 (一)中簡單的說過,CPython中的GIL使得同一時刻只能有一個執行緒執行,即併發執行。並且即使是多核CPU,GIL使得同一個程序中的多個執行緒也無法對映到多個CPU上執行,這麼做最初是為了安全著想,慢慢的也成為了限制CPython效能的問題。 就
程序、執行緒、協程之概念理解
https://www.cnblogs.com/work115/p/5620272.html 一、概念 1、程序 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序
程序、執行緒和協程
一、程序 1、多工原理 多工是指作業系統同時可以執行多個任務。 單核CPU實現多工原理:作業系統輪流讓各個任務交替執行; 多核CPU實現多工原理:真正的執行多工只能在多核CPU上實現,多出來的任務輪流排程到每個核心上執行。 併發:看上去一起執行,任務數多
作業系統 第二章 6 管程、程序、執行緒
一、管程: 1、管程的組成: 一組區域性變數 對區域性變數操作的一組過程 對區域性變數進行初始化的語句。 2、管程的特點: 任何程序只能通過呼叫管程提供的過程入口才能進入管程訪問共享資料; 任何時刻,僅允許一個程序在管程中執行某個內部過
C#多執行緒基礎知識和小實踐
源文來源 :http://www.cnblogs.com/jackson0714/p/5100372.html 一、多執行緒介紹 C#通過多執行緒支援並行執行的程式碼。一個執行緒是一個獨立執行的路徑,可以同時與其他執行緒一起執行。一個C#客戶端程式(Console,WPF,W