线程基础知识
什么是線程
LWP:light weight process 輕量級的進程,本質仍是進程(在Linux環境下)
?????? 進程:獨立地址空間,擁有PCB
?????? 線程:也有PCB,但沒有獨立的地址空間(共享)
?????? 區別:在于是否共享地址空間。????? 獨居(進程);合租(線程)。
?????? Linux下:???? 線程:最小的執行單位
????????????? ???????????? 進程:最小分配資源單位,可看成是只有一個線程的進程。
?
Linux內核線程實現原理
類Unix系統中,早期是沒有“線程”概念的,80年代才引入,借助進程機制實現出了線程的概念。因此在這類系統中,進程和線程關系密切。
1. 輕量級進程(light-weight process),也有PCB,創建線程使用的底層函數和進程一樣,都是clone
2. 從內核里看進程和線程是一樣的,都有各自不同的PCB,但是PCB中指向內存資源的三級頁表是相同的
3. 進程可以蛻變成線程
4. 線程可看做寄存器和棧的集合
5. 在linux下,線程最是小的執行單位;進程是最小的分配資源單位
察看LWP號:ps –Lf pid 查看指定線程的lwp號。
?
三級映射:進程PCB --> 頁目錄(可看成數組,首地址位于PCB中) --> 頁表 --> 物理頁面 --> 內存單元
參考:《Linux內核源代碼情景分析》 ----毛德操
對于進程來說,相同的地址(同一個虛擬地址)在不同的進程中,反復使用而不沖突。原因是他們雖虛擬址一樣,但,頁目錄、頁表、物理頁面各不相同。相同的虛擬址,映射到不同的物理頁面內存單元,最終訪問不同的物理頁面。
但!線程不同!兩個線程具有各自獨立的PCB,但共享同一個頁目錄,也就共享同一個頁表和物理頁面。所以兩個PCB共享一個地址空間。
?????? 實際上,無論是創建進程的fork,還是創建線程的pthread_create,底層實現都是調用同一個內核函數clone。
?????? 如果復制對方的地址空間,那么就產出一個“進程”;如果共享對方的地址空間,就產生一個“線程”。
?????? 因此:Linux內核是不區分進程和線程的。只在用戶層面上進行區分。所以,線程所有操作函數 pthread_* 是庫函數,而非系統調用。
線程共享資源
?????? 1.文件描述符表
?????? 2.每種信號的處理方式
?????? 3.當前工作目錄
?????? 4.用戶ID和組ID
?????? 5.內存地址空間 (.text/.data/.bss/heap/共享庫)
?
線程非共享資源
?????? 1.線程id
?????? 2.處理器現場和棧指針(內核棧)
?????? 3.獨立的棧空間(用戶空間棧)
?????? 4.errno變量
?????? 5.信號屏蔽字
?????? 6.調度優先級
線程優、缺點
?????? 優點:?? 1. 提高程序并發性????? 2. 開銷小????? 3. 數據通信、共享數據方便
?????? 缺點:?? 1. 庫函數,不穩定????? 2. 調試、編寫困難、gdb不支持????? 3. 對信號支持不好
?????? 優點相對突出,缺點均不是硬傷。Linux下由于實現方法導致進程、線程差別不是很大。
?
轉載于:https://www.cnblogs.com/wanghao-boke/p/11352278.html
總結
- 上一篇: 成员访问控制符重载
- 下一篇: 只为那一刻与你相见剧情介绍