線程概念
什么是線程
在一個(gè)程序里的一個(gè)執(zhí)行路線就叫做線程(thread)。更準(zhǔn)確的定義是:線程是“一個(gè)進(jìn)程內(nèi)部的控制序列” 一切進(jìn)程至少都有一個(gè)執(zhí)行線程線程在進(jìn)程內(nèi)部運(yùn)行,本質(zhì)是在進(jìn)程地址空間內(nèi)運(yùn)行在Linux系統(tǒng)中,在CPU眼中,看到的PCB都要比傳統(tǒng)的進(jìn)程更加輕量化透過(guò)進(jìn)程虛擬地址空間,可以看到進(jìn)程的大部分資源,將進(jìn)程資源合理分配給每個(gè)執(zhí)行流,就形成了線程 執(zhí)行流
LWP:light weight process 輕量級(jí)進(jìn)程
進(jìn)程:獨(dú)立地址空間,擁有 PCB線程:也有 PCB,但沒(méi)有獨(dú)立的地址空間(共享) 區(qū)別:在于是否共享地址空間。
獨(dú)居(進(jìn)程);合租(線程)。
Linux 下:
線程:最小的執(zhí)行單位
進(jìn)程:最小分配資源單位,可看成是只有一個(gè)線程的進(jìn)程。
一個(gè)進(jìn)程創(chuàng)建多少個(gè)線程,他們都共用一塊地址空間,但是線程越多,占用cpu越多,也就是cpu分的時(shí)間片越多,效率越高。因?yàn)榫€程是最小的執(zhí)行單位,要被執(zhí)行,必須要用cpu。
Linux內(nèi)核線程實(shí)現(xiàn)原理
類 Unix 系統(tǒng)中,早期是沒(méi)有“線程”概念的,80 年代才引入,借助進(jìn)程機(jī)制實(shí)現(xiàn)出了線程的概念。因此在這 類系統(tǒng)中,進(jìn)程和線程關(guān)系密切。
輕量級(jí)進(jìn)程(light-weightprocess),也有 PCB,創(chuàng)建線程使用的底層函數(shù)和進(jìn)程一樣,都是 clone從內(nèi)核里看進(jìn)程和線程是一樣的,都有各自不同的 PCB,但是 PCB 中指向內(nèi)存資源的三級(jí)頁(yè)表是相同的進(jìn)程可以蛻變成線程線程可看做寄存器和棧的集合在 linux 下,線程最是小的執(zhí)行單位;進(jìn)程是最小的分配資源單位
線程1和線程2程序內(nèi)部執(zhí)行的函數(shù)不會(huì)一樣,所以對(duì)應(yīng)的棧不一樣。
Linux操作系統(tǒng)中cpu劃分時(shí)間輪片的依據(jù)
查看 LWP 號(hào):ps –Lf pid** 查看指定線程的 lwp 號(hào)。不是線程ID**
注意
對(duì)于進(jìn)程來(lái)說(shuō),相同的地址(同一個(gè)虛擬地址)在不同的進(jìn)程中,反復(fù)使用而不沖突。原因是他們雖虛擬地址一樣,進(jìn)程的頁(yè)目錄、頁(yè)表、物理頁(yè)面各不相同。相同的虛擬地址,映射到不同的物理頁(yè)面內(nèi)存單元,最終訪問(wèn)不同的物理頁(yè) 面。線程不同。兩個(gè)線程具有各自獨(dú)立的 PCB,但共享同一個(gè)頁(yè)目錄,也就共享同一個(gè)頁(yè)表和物理頁(yè)面。所以 兩個(gè) PCB 共享一個(gè)地址空間。 實(shí)際上,無(wú)論是創(chuàng)建進(jìn)程的 fork,還是創(chuàng)建線程的 pthread_create,底層實(shí)現(xiàn)都是調(diào)用同一個(gè)內(nèi)核函數(shù) clone。
如果復(fù)制對(duì)方的地址空間,那么就產(chǎn)出一個(gè)“進(jìn)程”;如果共享對(duì)方的地址空間,就產(chǎn)生一個(gè)“線程”。因此:Linux 內(nèi)核是不區(qū)分進(jìn)程和線程的。只在用戶層面上進(jìn)行區(qū)分。所以,線程所有操作函數(shù) pthread_ 是 庫(kù)函數(shù),而非系統(tǒng)調(diào)用。*
線程共享資源
文件描述符表每種信號(hào)的處理方式當(dāng)前工作目錄用戶 ID 和組 ID內(nèi)存地址空間 (.text/.data/.bss/heap/共享庫(kù))沒(méi)有stack
線程非共享資源
線程 id處理器現(xiàn)場(chǎng)和棧指針(內(nèi)核棧)獨(dú)立的??臻g(用戶空間棧)errno 變量信號(hào)屏蔽字調(diào)度優(yōu)先級(jí)
線程優(yōu)、缺點(diǎn)
優(yōu)點(diǎn):
提高程序并發(fā)性開(kāi)銷小數(shù)據(jù)通信、共享數(shù)據(jù)方便創(chuàng)建一個(gè)新線程的代價(jià)要比創(chuàng)建一個(gè)新進(jìn)程小得多與進(jìn)程之間的切換相比,線程之間的切換需要操作系統(tǒng)做的工作要少很多線程占用的資源要比進(jìn)程少很多能充分利用多處理器的可并行數(shù)量在等待慢速I/O操作結(jié)束的同時(shí),程序可執(zhí)行其他的計(jì)算任務(wù)計(jì)算密集型應(yīng)用,為了能在多處理器系統(tǒng)上運(yùn)行,將計(jì)算分解到多個(gè)線程中實(shí)現(xiàn)I/O密集型應(yīng)用,為了提高性能,將I/O操作重疊。線程可以同時(shí)等待不同的I/O操作。
缺點(diǎn):
庫(kù)函數(shù),不穩(wěn)定 ,進(jìn)程中時(shí)庫(kù)函數(shù)調(diào)試、編寫(xiě)困難、gdb 不支持對(duì)信號(hào)支持不好 優(yōu)點(diǎn)相對(duì)突出,缺點(diǎn)均不是硬傷。線程間缺乏訪問(wèn)控制,編碼難度更高線程健壯性更低
Linux 下由于實(shí)現(xiàn)方法導(dǎo)致進(jìn)程、線程差別不是很大。
總結(jié)
以上是生活随笔為你收集整理的Linux系统编程----12(线程概念,Linux线程实现原理,栈中ebp指针和ebp指针,线程的优缺点和共享资源)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。