Linux下C編程學習1---進程、線程

工做中剛開始接觸Linux,基本上編程練手就從多線程Demo開始。首先因爲對於進程、線程這些基本概念進行了簡單的認知。編程

1.程序的認識

程序:硬盤中的二進制文件多線程

  一般意義上就是咱們電腦本地保存的一些文件。好比我電腦上安裝好了一個QQ程序,如今它就躺在個人電腦硬盤中,我沒有去啓動它。這時就叫作一個程序。佈局

2.進程的認識

進程: 加載到內存中的二進制文件 + 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

  而 進程控制塊PCB就在 虛擬地址空間的內核區中。
 

 

圖2.1 虛擬地址空間

  

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段)拷貝到物理內存中,只是創建好虛擬內存和磁盤文件之間的映射(叫作存儲器映射),等到運行到對應的程序時,纔會經過缺頁異常,來拷貝數據進入物理內存。

2.2 進程控制塊 PCB

  就像是生了孩子就得一生管着他、操心他同樣。那麼問題來了,你確定是操心本身家的孩子,不會去操心一個陌生的孩子,由於本身孩子確定本身認識。那麼系統是經過什麼來標誌、識別這個運行中的進程呢?----  就是 PCB

  內核區的進程控制PCB  會攜帶該進程的一些信息(如:進程狀態、進程標識.......),是系統感知該進程的惟一標識。Linux內核的進程控制塊是 task_struct結構體。【跳轉:參考文章連接1

 

圖1.2 PCB結構體

3. 線程的認識

  線程:是cpu調度的最小單位。

  一個進程啓動以後,能夠在這個進程中建立多個新的子線程。而後這個進程就退化成了一個線程(稱:主線程)。這樣該進程在運行時,就是主線程和被建立的多個子線程去輪流爭取CPU的時間片,執行各自線程中的處理動做。因此咱們說  線程是cpu調度的最小單位。

3.1 進程和線程的差別

  (1)進程:是資源分配的基本單位。

  前面提到,系統在建立一個進程時會爲這個進程分配必定的資源。可是在新建線程時並無再爲這些個線程再次分配資源。因此新建的多個子線程共用該進程的地址空間。

  (2)進程之間是相互獨立的。而線程間是有資源依賴關係的。

  例如,咱們在一個父進程中,新建了多個子進程。在運行時,任何一個進程的終止,不會影響到其餘進程。

  在一個主線程中,新建了多個子線程。在運行時,主線程終止,建立的所有子線程被迫終止(由於主線程結束,系統回收了進程資源,這些線程沒有了資源天然沒法正常運行)。

相關文章
相關標籤/搜索