傳媒公司做網(wǎng)站條件如何讓關(guān)鍵詞排名靠前
🐶博主主頁(yè):@??. 一懷明月??
???🔥專欄系列:線性代數(shù),C初學(xué)者入門訓(xùn)練,題解C,C的使用文章,「初學(xué)」C++,linux
🔥座右銘:“不要等到什么都沒(méi)有了,才下定決心去做”
🚀🚀🚀大家覺(jué)不錯(cuò)的話,就懇求大家點(diǎn)點(diǎn)關(guān)注,點(diǎn)點(diǎn)小愛(ài)心,指點(diǎn)指點(diǎn)🚀🚀🚀
目錄
線程
線程的概念
linux并不存在真正意義上的線程,而是利用進(jìn)程的資源模擬實(shí)現(xiàn)線程的
ps -aL
CPU 的局部性原理
cache:高速緩存
線程
線程的概念
線程是比進(jìn)程更加輕量化的執(zhí)行流/線程是在進(jìn)程內(nèi)部執(zhí)行的一種執(zhí)行流
在 Linux 中,線程是指在同一進(jìn)程內(nèi)并發(fā)執(zhí)行的輕量級(jí)執(zhí)行單元。與進(jìn)程不同的是,線程共享相同的地址空間和其他資源,包括文件描述符、信號(hào)處理和狀態(tài)信息。每個(gè)線程都有自己的棧,但它們共享數(shù)據(jù)段、代碼段和其他內(nèi)存部分。這使得線程之間的切換比進(jìn)程之間的切換更加高效。
線程是CPU調(diào)度的基本單位/進(jìn)程是承擔(dān)系統(tǒng)資源的基本實(shí)體
創(chuàng)建一個(gè)線程,只需要?jiǎng)?chuàng)建pcb,不需要?jiǎng)?chuàng)建虛擬地址空間、頁(yè)表等,多個(gè)進(jìn)程pcb指向一個(gè)虛擬地址空間即可
os如果支持線程,也必須管理線程,先描述,再組織,TCB(linux中不會(huì)單獨(dú)設(shè)計(jì)線程TCB,因?yàn)榫€程大多數(shù)東西,都是和PCB差不多,所以只需要復(fù)用即可,windows是單獨(dú)設(shè)計(jì)了一套TCB)
linux并不存在真正意義上的線程,而是利用進(jìn)程的資源模擬實(shí)現(xiàn)線程的
事例
#include<iostream> #include<pthread.h> #include<unistd.h>using namespace std;void* threadroutine(void* arg) { const char* threadname=(const char*)arg;while(true) { cout<<"I am a new thread"<<threadname<<endl; sleep(1); } }int main(){ //這里已經(jīng)有進(jìn)程了 pthread_t tid;pthread_create(&tid,nullptr,threadroutine,(void*)"thread 1");//主線程 while(true) { cout<<"I am main thread"<<endl; sleep(1); } return 0;}結(jié)果: [BCH@hcss-ecs-6176 2_21]$ ./testThread I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1[BCH@hcss-ecs-6176 2_21]$ while :; do ps ajx | head -1 && ps ajx | grep testThread | grep -v grep; sleep 1; done PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND從結(jié)果可以知道,主線程和新線程都向屏幕輸出了,并且通過(guò)ps指令檢測(cè)只有一個(gè)進(jìn)程
ps -aL
ps -aL 命令用于顯示系統(tǒng)中所有進(jìn)程的詳細(xì)信息,包括每個(gè)線程的信息。在 ps -aL 命令中,-a 選項(xiàng)表示顯示所有用戶的進(jìn)程,-L 選項(xiàng)表示顯示每個(gè)線程的信息。這樣,執(zhí)行該命令后會(huì)列出系統(tǒng)中所有進(jìn)程及其相關(guān)的線程信息。
事例
[BCH@hcss-ecs-6176 2_21]$ ps -aLPID LWP TTY TIME CMD//輕量級(jí)進(jìn)程 11501 11501 pts/5 00:00:00 testThread 11501 11503 pts/5 00:00:00 testThread 11780 11780 pts/1 00:00:00 ps 29191 29191 pts/2 00:00:00 top在pcb中有一個(gè)LWP字段,它和pid類似的
CPU調(diào)度的時(shí)候看的都是LWP
如果進(jìn)程里面只有一個(gè)pcb,那么這個(gè)線程的pid和lwp數(shù)值是一樣的
如果進(jìn)程里面只有多個(gè)pcb,那么這個(gè)主線程的pid和lwp數(shù)值是一樣的,其他線程的pcb和lwp是不一樣的
線程間通信的成本很低,因?yàn)樗麄児蚕淼氖峭环葙Y源,而進(jìn)程間通信的成本就比較高
線程之間切換,不用切換cpu中所有的寄存器
進(jìn)程之間切換,需要切換cpu中所有的寄存器
CPU 的局部性原理
CPU 的局部性原理是指在程序訪問(wèn)內(nèi)存時(shí),程序很可能會(huì)重復(fù)訪問(wèn)一組相鄰的內(nèi)存地址,而不是隨機(jī)地訪問(wèn)各個(gè)內(nèi)存地址。這種局部性原理通常分為兩種類型:時(shí)間局部性和空間局部性。
1. 時(shí)間局部性(Temporal Locality)
時(shí)間局部性是指如果一個(gè)數(shù)據(jù)被訪問(wèn)過(guò)一次,那么在不久的將來(lái)它可能會(huì)再次被訪問(wèn)。這意味著程序傾向于重復(fù)使用最近訪問(wèn)過(guò)的數(shù)據(jù)。CPU 利用時(shí)間局部性可以減少?gòu)膬?nèi)存中加載數(shù)據(jù)的次數(shù),提高程序的性能。
2. 空間局部性(Spatial Locality)
空間局部性是指如果一個(gè)數(shù)據(jù)被訪問(wèn)過(guò)一次,那么與該數(shù)據(jù)相鄰的數(shù)據(jù)也很可能會(huì)在不久的將來(lái)被訪問(wèn)。這意味著程序傾向于訪問(wèn)連續(xù)內(nèi)存地址中的數(shù)據(jù)。CPU 利用空間局部性可以通過(guò)預(yù)取緩存行等技術(shù)來(lái)提前加載相鄰數(shù)據(jù),減少訪問(wèn)延遲,進(jìn)而提高程序的性能。
cache:高速緩存
緩存的作用是提高 CPU 的性能。CPU 訪問(wèn)主內(nèi)存需要花費(fèi)很長(zhǎng)時(shí)間,而緩存可以存儲(chǔ) CPU 頻繁訪問(wèn)的指令和數(shù)據(jù),以便快速地響應(yīng) CPU 的訪問(wèn)請(qǐng)求。當(dāng) CPU 訪問(wèn)主內(nèi)存時(shí),如果所需數(shù)據(jù)已經(jīng)存儲(chǔ)在緩存中,則可以直接從緩存中獲取數(shù)據(jù),從而避免了訪問(wèn)主內(nèi)存所需的長(zhǎng)時(shí)間延遲。這種方式稱為緩存命中(cache hit)。
線程間切換,不需要切換cache
線程切換為什么效率高
1.寄存器切換的少
2.cache不需要重新切換
時(shí)間片也要被內(nèi)部的線程瓜分,時(shí)間片也是資源
?🌸🌸🌸如果大家還有不懂或者建議都可以發(fā)在評(píng)論區(qū),我們共同探討,共同學(xué)習(xí),共同進(jìn)步。謝謝大家! 🌸🌸🌸???