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