Linux 程序與執行緒

2022-06-26 06:21:15 字數 2074 閱讀 4651

程序就是在作業系統中執行的程式,是作業系統資源管理的最小單位。乙個程序可以管理多個執行緒,執行緒相對輕量,可以共享程序位址空間

乙個進行在執行的過程中,不可能一直佔據著cpu進行邏輯運算,中間很可能在進行磁碟i/o或者網路i/o,為了充分利用cpu運算資源,有人設計了執行緒的概念。執行緒最大的特點就是和建立它的進行共享位址空間

開多個程序提高cpu利用率的難點?缺點?

有人認為要提公升cpu的利用率,開多個程序可以達到,但是開多個程序的話,程序間通訊又是個麻煩的事情,畢竟程序之間位址空間是獨立的,沒法像執行緒那樣做到資料的共享,需要通過其他的手段來解決,如管道等

執行緒有核心執行緒、使用者執行緒還有協程。一般作業系統都會分為核心態和使用者態,使用者態執行緒之間的位址空間是隔離的,而在核心態,所有執行緒都共享同一核心位址空間。

由來:不管是使用者執行緒還是核心執行緒,和程序一樣,均由作業系統的排程器來統一排程。所以開闢太多執行緒,系統排程的開銷會很大,另外執行緒本身的資料結構需要占用記憶體,頻繁建立和銷毀執行緒會加大系統的壓力

執行緒可以在初始化的時候批量建立執行緒,然後使用者後續通過佇列等方式提交業務邏輯,執行緒池中的執行緒進行邏輯的消費工作,這樣就可以在操作的過程中降低執行緒建立和銷毀的開銷,但是排程的開銷還是存在的

由來:在多核場景下,如果是i/o密集型場景,就算開多個執行緒來處理,也未必能提公升cpu的利用率,反而會增加執行緒切換的開銷。另外,多執行緒之間假如存在臨界區或共享資料,那麼同步的開銷也是不可忽略的。

協程是輕量級執行緒,在乙個使用者執行緒上可以跑多個協程,這樣就可以提公升單核的利用率。

協程不像程序或執行緒,可以讓系統負責相關的排程工作,協程是處於乙個執行緒當中的,系統無感知的,所以需要在該執行緒中阻塞某個協程的話,就需要手工程序排程

1. 多程序的出現是為了提公升cpu的利用率,特別是i/o密集型運算,不管是多核還是單核,開多個程序必然能有效提公升cpu的利用率。

2. 多執行緒是可以共享同一程序位址空間上的資源,為了降低執行緒建立和銷毀的開銷,又出現了執行緒池的概念。

3. 為了提公升使用者執行緒的最大利用率,又有了協程的概念。

1. 在乙個cpu中,同一時刻最多只能支援有線的程序或執行緒同時執行(這取決於cpu核數量)。但是在乙個執行的作業系統上往往可以執行很多程序,假如執行的程序佔據程序時間很長,就有可能讓其他程序餓死。為了解決這個問題,作業系統引入了程序排程器來進行程序的切換,目的是輪流讓其他程序獲取cpu資源

2. 在每個程序執行完畢時,系統可以進行排程的工作,但是系統不可能總是在等程序執行完才排程,不然其他程序估計還沒被排程就餓死了。系統還需要乙個重要的機制:中斷機制,來周期性地觸發排程演算法進行程序切換

3. 需要程序切換的場景有以下幾種:

1. 該程序分配的cpu的時間片用完

2. 該程序主動放棄cpu(例如ip操作,某些程序的工作大部分為io操作,佔據cpu空跑會導致資源浪費,這樣的程序需要主動放棄cpu)

3. 某一程序搶占cpu獲得執行機會

4. 乙個程序在某一時刻只能存在乙個cpu的執行佇列裡

memcached是一款服務記憶體管理軟體,它主要是由pthread建立的使用者工作執行緒模型來處理主要邏輯的

1. mthread主線程,主要監聽socket事件,並建立連線,然後把連線和相應的時間分發到cq連線佇列中(每個分執行緒都擁有乙個連線佇列)

2. cthread分執行緒,用於從連線佇列中獲取連線的讀寫時間, 並進行業務邏輯的處理工作

3. memcached在建立工作執行緒的時候,同樣會用pipe管道呼叫建立管道,用於和主線程之間的通訊

4. 在業務邏輯繁忙並且i/o開銷比較大的情況下,多執行緒模型提高系統的吞吐率。但缺點是當多執行緒同時訪問同一資料的時候就存在競爭,需要額外的併發解決開銷(鎖)

5. 加入系統中線程數量開得太多,那麼執行緒切換的開銷也會上公升,需要根據實際場景謹慎設定執行緒池的大小

nginx只要建立cpu核心數量相等的工作程序,即可滿足高併發、搞吞吐量的需求,原因是它的每個工作程序都有乙個基於i/o多路復用的epoll池子,這樣每個程序只有在事件被觸發的場景下才進行工作,否則就會讓出cpu進行其他事件的處理,特別是upstream的場景下,工作程序可以悠閒地等待後端資料準備好之後再進行工作,cpu的利用率也大大提公升

在nginx中master程序通過fork呼叫派生完子程序後,又通過socketpair建立了管理來程序父子程序之間的通訊

Linux程序與執行緒

每個程序都有乙個位址空間和乙個控制線程。如果乙個程序中有多個控制線程,那麼就是多執行緒的情況。程序是資源分配的最小單位,執行緒是cpu排程的最小單位。程序與執行緒的區別 或者說在已經有程序的情況下,為什麼還需要執行緒 1.多執行緒可以表達為在相同位址空間下的程式並行執行,多程序可以表達為在不同位址空...

Linux之路 程序與執行緒(實驗)

實驗1.建立倆個程序,讓子程序讀取乙個檔案,父程序等待子程序讀完檔案後繼續執行 include include include include int main else printf 開啟檔案成敗 exit 3 else return 0 實驗2,執行緒共享程序中的資料,在程序中直接引用並輸出該資...

Linux程序與執行緒之五

每日一結 一 共享記憶體 核心空間預留出來的一塊記憶體,用於程序間通訊 1 int shmget key t key,size t size,int shm 功能 獲取共享記憶體段的id 引數 key ipc private 或 ftok size 申請的共享記憶體段大小 4k的倍數 shm ipc...