Linux 多線程(一)線程概念:線程概念、線程與進程、線程間的獨有與共享、多線程與多進程

  1. 線程概念
  2. 線程與進程
  3. 線程間的獨有與共享
  4. 多線程與多進程

線程概念

什麼是線程

線程是進程中的一條執行流,執行程序中的某部分代碼。linux下沒有具體實現的線程,只有庫函數用pcb來實現的線程,所以可以認爲,每個pcb就是一個線程,所以進程中都至少有一個線程,這些PCB共用進程中的同一個頁表和虛擬地址空間,比傳統的進程更加輕量化,所以這些線程在linux下也被稱爲輕量級進程

PCB也就是進程控制塊,在Linux下PCB可以實現對程序的調度運行,所以可以將其作爲一個執行流,來實現線程

爲什麼要使用線程呢?
  1. 創建一個新線程的代價要比創建一個新進程小得多
  2. 與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少很多
  3. 線程佔用的資源要比進程少很多

線程與進程

線程與進程

進程:是一個程序的動態執行,是系統資源分配的基本單位
線程:線程是進序中的一條執行流,是CPU調度的基本單位

在這裏插入圖片描述

我之前博客提到的進程其實都是單線程的進程,在linux其實每個pcb就可以理解爲一個執行流,也就是一個線程

在這裏插入圖片描述
從這兩幅圖可以看出來,linux下的進程其實是一個線程組,一個進程中可以包含多個線程,每一個線程都是進程中的一條執行流(PCB),這些線程在進程的內部運行,本質也就是在進程的虛擬地址空間中運行

線程之間共用進程中的同一個虛擬地址空間,通過同一個頁表來完成映射


線程間的獨有與共享

既然線程都處於同一個進程中,共用同一個虛擬地址空間和頁表,那麼它們之間還有哪些數據共享,哪些數據獨有呢?

獨有:
  • 標識符(唯一的標識符來區分線程)
  • 棧(獨有的函數棧,防止調用棧紊亂)
  • 寄存器(也就是PCB中的上下文數據,程序計數器,內存指針等)
  • 信號屏蔽字(因爲信號會打斷進程當前操作,讓他優先處理信號,但是一個信號只需要一個執行流去執行即可,如果不想該線程被打斷,則對該信號屏蔽,讓其他線程去執行)
  • errno(系統調用完畢後重置的一個全局變量,防止被其他線程覆蓋)
  • 優先級(各有各的調度優先級)
共享
  • 虛擬地址空間(代碼段/數據段, 線程之間數據和代碼都共享)
  • 文件描述符表(io信息)
  • 信號處理方式(信號是針對整個進程的,所以處理方式應該都一樣)

多線程與多進程

如果需要進行多任務處理,有兩種方法,一種是多線程,一種是多進程
多進程
在這裏插入圖片描述
多線程在這裏插入圖片描述

多線程的優點:
  • 線程的創建和銷燬成本低(從上面的圖可以看出來,創建多個線程只需要創建多個PCB)
  • 線程間調度成本低(使用同一個頁表,調度切換時不用切換頁表)
  • 線程間通信更加靈活(共用同一個虛擬地址空間,數據段共享,只需要獲取地址即可訪問數據)
多進程的優點:
  • 更具有健壯性,更加穩定(因爲異常,系統調用,信號等都是對整個進程生效,一旦出現進程出問題會影響所有線程)
共同優點
  • IO密集型程序:多任務並行處理(單磁盤可以並行壓縮IO等待事件/多磁盤可以實現同時處理)
  • CPU密集型程序:程序中進行大量的數據運算處理,CPU資源足夠,則可以同時處理,提高效率(線程數爲CPU核心數+1,多出來的一個是當某一線程阻塞時頂替用的。如果創建進程過多,會增加切換調度的成本)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章