【操作系統】線程基礎知識

本文測試代碼的運行環境:
Centos7 x86_64
Kernel 3.10.0-693.5.2.el7.x86_64
gcc 版本 4.8.5
CPU:2 核

線程概念

線程是運行在進程之中的一個處理任務的分支,一個進程都包括一個主線程。
進程:資源分配、管理的基本單位(管理內存、管理打開的文件等)。
線程:調度、執行的基本單位。
在 Linux 中線程也叫做輕量級進程 LWP
每次創建一個新的進程,會分配一個新的虛擬地址空間。
每次創建一個新的線程,線程共用原來的虛擬地址空間。

從 Linux 內核的角度來說,其實它並沒有線程的概念。Linux 把所有線程都當做進程來實現,它將線程和進程不加區分的統一到了 task_struct 中。

線程之間共用的資源

  1. 虛擬地址空間。
  2. 文件描述符表。

線程創建的時候,加上了 CLONE_VM 標記,這樣線程的內存描述符將直接指向父進程的內存描述符。

if (clone_flags & CLONE_VM) {
	// current 是父進程而 tsk 在 fork() 執行期間是共享子進程
    atomic_inc(&current->mm->mm_users);
    tsk->mm = current->mm;
}

線程之間不共用的資源

  1. 棧。
  2. 上下文信息(寄存器信息)。
  3. errno(每個線程有自己單獨的錯誤碼)。

對於 Linux 進程或者說主線程,其 stack 是在 fork 的時候生成的,實際上就是複製了父親的 stack 空間地址,然後寫時拷貝 (cow) 以及動態增長。
然而對於主線程生成的子線程而言,其 stack 將不再是這樣的了,而是事先固定下來的。
線程棧不能動態增長,一旦用盡就沒了,這是和生成進程的 fork 不同的地方。

線程的優點

相比於進程來說:

  1. 創建和銷燬開銷更小。
  2. 切換調度的開銷更小。
  3. 線程佔用的資源更小。

多線程程序能夠充分利用多核處理器。
栗子:因爲我的虛擬機是 2 核的,所以 CPU 最多使用是 200%
在這裏插入圖片描述

線程的缺點

  1. 程序的健壯性降低,一個線程的異常終止會導致整個進程異常終止。
  2. 編程 && 調試難度增加(引入了線程安全問題)。

線程的用途

  1. 提升 CPU 密集型程序執行效率。
  2. 提高 IO 密集型程序的體驗。
    • 通過網絡進行 IO。
    • 響應 UI 界面。

EOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章