工做中剛開始接觸Linux,基本上編程練手就從多線程Demo開始。首先因爲對於進程、線程這些基本概念進行了簡單的認知。編程
程序:硬盤中的二進制文件多線程
一般意義上就是咱們電腦本地保存的一些文件。好比我電腦上安裝好了一個QQ程序,如今它就躺在個人電腦硬盤中,我沒有去啓動它。這時就叫作一個程序。佈局
進程: 加載到內存中的二進制文件 + PCBspa
如今我運行QQ,計算機會將程序文件從硬盤加載到系統內存中而後執行。這時QQ進程啓動了,能夠查看 任務管理器 中QQ這個進程就存在。.net
進程啓動以後,全部的數據都加載到內存中。好比咱們Linux編譯生成一個可執行的 線程
計算機系統啓動了一個進程,那就須要去時時刻刻的管理這個進程,以便於去響應這個進程和進程結束以後的回收工做。3d
系統在新建一個進程的時候,會給這個進程分配 資源 和 進程控制塊(PCB)。具體狀況以下:指針
Linux系統啓動一個進程,會爲該進程分配一個 虛擬地址空間。blog
1) 對於32位系統,尋址指針爲4字節,對應的虛擬地址空間爲0 ~ 2^32,即 0-4G進程
2) 對於64位系統,尋址指針爲8字節,對應的虛擬地址空間爲0 ~ 2^64,即0-16G
圖2.1 虛擬地址空間
物理內存:【跳轉:參考連接1】
簡單說使用角度,就是你這個計算機插的內存條是多大的,那麼這就是他的物理內存。
CPU中的概念,物理內存就是CPU的地址線能夠直接進行尋址的內存空間大小。
好比8086只有20根地址線,那麼它的尋址空間就是1MB,咱們就說8086能支持1MB的物理內存,即便咱們安裝了128M的內存條在板子上,咱們也只能說8086擁有1MB的物理內存空間。
同理,32位的CPU就能夠支持最大4GB的物理內存空間了;64位的CPU就能夠支持最大16GB的物理內存空間了。因此想給電腦加內存條也不是能夠隨便加的。
虛擬內存:
從名字上看,「虛擬」的一塊內存。實際上只是一種內存管理手段。
以上面的進程建立時的4G虛擬內存舉例,並非真的從計算機的物理內存中分配一塊連續的4G內存空間給這個新建的進程使用。若是這樣的話,我們的32位計算機總共就4G大的物理內存,你要是啓動個幾十個進程不就把計算機的物理內存擠滿了。
事實上,在每一個進程建立加載時,內核只是爲進程「建立」了虛擬內存的佈局,實際上並不當即就把虛擬內存對應位置的程序數據和代碼(好比.text .data段)拷貝到物理內存中,只是創建好虛擬內存和磁盤文件之間的映射(叫作存儲器映射),等到運行到對應的程序時,纔會經過缺頁異常,來拷貝數據進入物理內存。
就像是生了孩子就得一生管着他、操心他同樣。那麼問題來了,你確定是操心本身家的孩子,不會去操心一個陌生的孩子,由於本身孩子確定本身認識。那麼系統是經過什麼來標誌、識別這個運行中的進程呢?---- 就是 PCB
內核區的進程控制PCB 會攜帶該進程的一些信息(如:進程狀態、進程標識.......),是系統感知該進程的惟一標識。Linux內核的進程控制塊是 task_struct結構體。【跳轉:參考文章連接1】
圖1.2 PCB結構體
線程:是cpu調度的最小單位。
一個進程啓動以後,能夠在這個進程中建立多個新的子線程。而後這個進程就退化成了一個線程(稱:主線程)。這樣該進程在運行時,就是主線程和被建立的多個子線程去輪流爭取CPU的時間片,執行各自線程中的處理動做。因此咱們說 線程是cpu調度的最小單位。
(1)進程:是資源分配的基本單位。
前面提到,系統在建立一個進程時會爲這個進程分配必定的資源。可是在新建線程時並無再爲這些個線程再次分配資源。因此新建的多個子線程共用該進程的地址空間。
(2)進程之間是相互獨立的。而線程間是有資源依賴關係的。
例如,咱們在一個父進程中,新建了多個子進程。在運行時,任何一個進程的終止,不會影響到其餘進程。
在一個主線程中,新建了多個子線程。在運行時,主線程終止,建立的所有子線程被迫終止(由於主線程結束,系統回收了進程資源,這些線程沒有了資源天然沒法正常運行)。