導航:首頁 > 操作系統 > linux線程回收

linux線程回收

發布時間:2023-03-31 21:30:21

linux的C語言開線程後如何歸還使用的內存

線程自身用的內存,是在棧上系統自動分配,或自己配置(操作系統提供了可編程配置參數,但也是操作系統在管理)。線程運行完成後返回棧內存操作系統會自動回收。需要注意的是,如果是在線程運行中中,使用malloc或操作系統的內存分配函數分配的內存,需要在線程返回前或返回後顯示釋放。自己編寫代碼,顯示調用free或操作系統提供的內存釋放函數。

⑵ c/c++ linux c 多線程 pthread_detach(id); phthread_join(id,0);

有區別。


只用1可以。同時使用1,2是不可以的。


一般情況下,線程終止後,其終止狀態一直會保留到其他線程調用pthread_join獲取它的狀態為止。但是線程也可以設置為detach狀態,這樣的線程一旦終止就立即回收它佔用的所有資源,而不保留終止狀態。

注意:

  1. 不能對已經detach狀態的線程調用pthread_join。

  2. 對一個尚未detach的線程調用phread_join或phread_detach都可以把該線程設置為datach,也就是說,不能對同一線程調用兩次pthread_join,或者如果已經對一個線程調用了pthread_detach就不能再調用pthread_join了。

  3. phtread_join是阻塞式的,需要等待這個線程終止,而phread_datach是不阻塞的,所以可以用phread_datach來銷毀終止線程

⑶ linux rcu鎖問題怎麼查

眾所周知,為了保護共享數據,需要一些同步機制,如自旋鎖(spinlock),讀寫鎖(rwlock),它們使用起來非常簡單,而且是一種很有效的同步機制,在UNIX系統和Linux系統中得到了廣泛的使用。但是隨著計算機硬體的快速發展,獲得這種鎖的開銷相對於CPU的速度在成倍地增加,原因很簡單,CPU的速度與訪問內存的速度差距越來越大,而這種鎖使用了原子操作指令,它需要原子地訪問內存,也就說獲得鎖的開銷與訪存速度相關,另外在大部分非x86架構上獲取鎖使用了內存柵(Memory Barrier),這會導致處理器流水線停滯或刷新,因此它的開銷相對於CPU速度而言就越來越大。

在操作系統中,數據一致性訪問是一個非常重要的部分,通常我們可以採用鎖機制實現數據的一致性訪問。例如,semaphore、spinlock機制,在訪問共享數據時,首先訪問鎖資源,在獲取鎖資源的前提下才能實現數據的訪問。這種原理很簡單,根本的思想就是在訪問臨界資源時,首先訪問一個全局的變數(鎖),通過全局變數的狀態來控制線程對臨界資源的訪問。但是,這種思想是需要硬體支持的,硬體需要配合實現全局變數(鎖)的讀-修改-寫,現代CPU都會提供這樣的原子化指令。採用鎖機制實現數據訪問的一致性存在如下兩個問題:

1、 效率問題。鎖機制的實現需要對內存的原子化訪問,這種訪問操作會破壞流水線操作,降低了流水線效率。這是影響性能的一個因素。另外,在採用讀寫鎖機制的情況下,寫鎖是排他鎖,無法實現寫鎖與讀鎖的並發操作,在某些應用下回降低性能。

2、 擴展性問題。當系統中CPU數量增多的時候,採用鎖機制實現數據的同步訪問效率偏低。並且隨著CPU數量的增多,效率降低,由此可見鎖機制實現的數據一致性訪問擴展性差。

為了解決上述問題,Linux中引進了RCU機制。該機制在多CPU的平台上比較適用,對於讀多寫少的應用尤其適用。RCU的思路實際上很簡單,下面對其進行描述:

1、 對於讀操作,可以直接對共享資源進行訪問,但是前提是需要CPU支持訪存操作的原子化,現代CPU對這一點都做了保證。但是RCU的讀操作上下文是不可搶占的(這一點在下面解釋),所以讀訪問共享資源時可以採用read_rcu_lock(),該函數的工作是停止搶占。

2、 對於寫操作,其需要將原來的老數據作一次備份(),然後對備份數據進行修改,修改完畢之後再用新數據更新老數據,更新老數據時採用了rcu_assign_pointer()宏,在該函數中首先屏障一下memory,然後修改老數據。這個操作完成之後,需要進行老數據資源的回收。操作線程向系統注冊回收方法,等待回收。採用數據備份的方法可以實現讀者與寫者之間的並發操作,但是不能解決多個寫著之間的同步,所以當存在多個寫者時,需要通過鎖機制對其進行互斥,也就是在同一時刻只能存在一個寫者。

3、 在RCU機制中存在一個垃圾回收的daemon,當共享資源被update之後,可以採用該daemon實現老數據資源的回收。回收時間點就是在update之前的所有的讀者全部退出。由此可見寫者在update之後是需要睡眠等待的,需要等待讀者完成操作,如果在這個時刻讀者被搶占或者睡眠,那麼很可能會導致系統死鎖。因為此時寫者在等待讀者,讀者被搶占或者睡眠,如果正在運行的線程需要訪問讀者和寫者已經佔用的資源,那麼死鎖的條件就很有可能形成了。

⑷ linux回收站在哪裡

在linux中沒有統一的回收站,回收站都是桌面環境自動添加的。在使用rm命令刪除文件時,應該在確認要刪除的情況下刪除,不然文件刪錯後就無法找回了。
探究的一般過程是從發現問題、提出問題開始的,發現問題後,根據自己已有的知識和生活經驗對問題的答案作出假設.設計探究的方案,包括選擇材料、設計方法步驟等.按照探究方案進行探究,得到結果,再分析所得的結果與假設是否相符,從而得出結論.並不是所有的問題都一次探究得到正確的結論.有時,由於探究的方法不夠完善,也可能得出錯誤的結論.因此,在得出結論後,還需要對整個探究過程進行反思.探究實驗的一般方法步驟:提出問題、做出假設、制定計劃、實施計劃、得出結論、表達和交流.
科學探究常用的方法有觀察法、實驗法、調查法和資料分析法等.
觀察是科學探究的一種基本方法.科學觀察可以直接用肉眼,也可以藉助放大鏡、顯微鏡等儀器,或利用照相機、錄像機、攝像機等工具,有時還需要測量.科學的觀察要有明確的目的;觀察時要全面、細致、實事求是,並及時記錄下來;要有計劃、要耐心;要積極思考,及時記錄;要交流看法、進行討論.實驗方案的設計要緊緊圍繞提出的問題和假設來進行.在研究一種條件對研究對象的影響時,所進行的除了這種條件不同外,其它條件都相同的實驗,叫做對照實驗.一般步驟:發現並提出問題;收集與問題相關的信息;作出假設;設計實驗方案;實施實驗並記錄;分析實驗現象;得出結論.調查是科學探究的常用方法之一.調查時首先要明確調查目的和調查對象,制訂合理的調查方案.調查過程中有時因為調查的范圍很大,就要選取一部分調查對象作為樣本.調查過程中要如實記錄.對調查的結果要進行整理和分析,有時要用數學方法進行統計.收集和分析資料也是科學探究的常用方法之一.收集資料的途徑有多種.去圖書管查閱書刊報紙,拜訪有關人士,上網收索.其中資料的形式包括文字、圖片、數據以及音像資料等.對獲得的資料要進行整理和分析,從中尋找答案。

⑸ linux線程分離是什麼意思

線程分離
在任意一個時間點上,線程是可結合(joinable)或者是可分離的(detached)。一個可結合線程是可以被其他線程收回資源和殺關閉。在被回收之前,他的存儲器資源(棧等)是不釋放的。而對於detached狀態的線程,其資源不能被別的線程收回和關閉,只有等到線程結束才能由系統自動釋放
默認情況,線程狀態被設置為結合的。所以為了避免資源泄漏等問題,一個線程應當是被顯示的join或者detach的,否則線程的狀態類似於進程中的Zombie Process。會有部分資源沒有被回收的。

⑹ linux內存回收的三種方式

1. 快速內存回收:處於get_page_from_freelist()函數中,在遍歷zonelist過程中,對每個zone都在分配前進行判斷,如果分配後zone的空閑內存數量 < 閥值 + 保留頁框數量,那麼此zone就會進行快速內存回收。其中閥值可能是min/low/high的任何一種,因為在快速內存分配,慢速內存分配和oom分配過程中如果回收的頁框足夠,都會調用到get_page_from_freelist()函數,所以快速內存回收不僅僅發生在快速內存分配中,在慢速內存分配過程中也會發生。
2. 直接內存回收:處於慢速分配過程中,直接內存回收只有一種情況下會使用,在慢速分配中無法從zonelist的所有zone中以min閥值分配頁框,並且進行非同步內存壓縮後,還是無法分配到頁框的時候,就對zonelist中的所有zone進行一次直接內存回收。注意,直接內存回收是針對zonelist中的所有zone的,它並不像快速內存回收和kswapd內存回收,只會對zonelist中空閑頁框不達標的zone進行內存回收。在直接內存回收中,有可能喚醒flush內核線程。
3. kswapd內存回收:發生在kswapd內核線程中,每個node有一個swapd內核線程,也就是kswapd內核線程中的內存回收,是只針對所在node的,並且只會對分配了order頁框數量後空閑頁框數量 < 此zone的high閥值 + 保留頁框數量的zone進行內存回收,並不會對此node的所有zone進行內存回收。

⑺ linux 常見命令 lsof,ps,ln...

[TOC]

可以列出被進程所打開的文件的信息。被打開的文件可以是

1.普通的文件
2.目錄抽象為特殊文件
3.網路文件系統的文件,抽象為文件
4.字元設備文件在linux抽象為文件
5.(函數)共享庫
6.管道,命名管道
7.符號鏈接
8.底層的socket字流,網路socket,unix域名socket
9.在linux裡面,很多東西都抽象為文件,提供了統一的訪問介面

屬性第一個字元:

rwx=0x111,二進製表示

列出所有進程

-ef f:father

ps –el ,
e:every :顯示所有進程信息,等價於A
a:all :顯示除了當前終端進程外的其他進程
l: long 長格式顯示進程信息。

linux 線程狀態:

ps工具標識進程的5種狀態碼:

chmod 對象 +/- 模式
對象:u(user),g(group),o(other),a(all)
模式:r,w,x

由於inode號碼與文件名分離,這種機制導致了一些Unix/Linux系統特有的現象。

軟體不關閉情況下更新:寫入同名不同inode的文件,下次啟動由於老的inode已經丟失,操作系統回收原來的Block。

綜上,總結一下軟鏈接和硬鏈接的區別:

參考: 阮一峰的網路日誌:理解inode

Ctrl+z 暫停進程執行

uname -m 顯示機器的處理器架構(2)
uname -r 顯示正在使用的內核版本

jobs: 查看後台任務
fg +jobNum: 將後台任務調到前台

未完,不定期更新中...

⑻ linux 創建了一個線程,如果沒有停止線程。這個線程為循環跑還是截止

除非你的線程答埋函數內部有循環,否則哪來的什麼循環跑,
你的線程函數返回了,線程就結束了
——當然,你需要回收線程資源。

void *ThreadFunc(void *)
{
printf("Hello world\n");
return NULL;
}

例如這樣的線程鄭舉碰函數喊談,它輸出Hello world後,返回了,線程就結束了。

⑼ linux線程的創建、退出、等待、取消、分離

返回值:成功:0,錯誤:出錯編號。
pthread不是Linux系統默認的庫而是POSIX線程庫。在Linux中將其作為一個庫來使用,因此編譯時需要加上-pthread以顯式鏈接該庫

返回線程ID
線程標識符在進程中是唯一的,即分別屬於兩不同進程的兩個線程可能有相同的線程標識符

retval:返回信息

參數表:
thread: 要等待的線程的pid
retval:用來存儲被等待線程的返回值
返回0:成功;返回錯誤號:失敗
主線程阻塞自己,等待子線程結束,然後回收子線程資源

可以設置線程能否被取消和取消後是否立即執行

參數表
state:PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE
oldstate:指針類型,上一次取消狀態的指針,可設NULL

type:PTHREAD_CANCEL_ASYNCHRONOUS立即取消
PTHREAD_CANCEL_DEFERRED等待事件(如pthread_join時)才取消

在任何一個時間點上,線程是可結合的(joinable),或者是分離的(detached)。一個可結合的線程能夠被其他線程收回其資源和殺死,只有當pthread_join()函數返回時,創建的線程才算終止,才能釋放自己佔用的系統資源;在被其他線程回收之前,它的存儲器資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動釋放。 因此為了避免內存泄漏,所有線程的終止,要麼已設為DETACHED,要麼就需要使用pthread_join()來回收

返回0成功,錯誤號失敗
分離後不可以再合並。該操作不可逆

綜合以上要想讓子線程總能完整執行(不會中途退出),

註:很多地方參照了黃茹老師主編的《Linux環境高級程序設計》

閱讀全文

與linux線程回收相關的資料

熱點內容
安卓手機微信發不出視頻怎麼弄 瀏覽:229
壓縮機專用工具 瀏覽:575
qtcreator可以編譯cp嗎 瀏覽:405
小項目是雲伺服器還是本地好 瀏覽:14
墨痕齋是什麼游戲的伺服器 瀏覽:942
word文件如何壓縮大小 瀏覽:279
遵義聯通伺服器地址是什麼 瀏覽:29
ansys約束命令流 瀏覽:814
解壓軟體電腦版如何下載 瀏覽:791
閃電匕首演算法球 瀏覽:692
linuxredis停止命令 瀏覽:670
大麥賬號怎麼加密 瀏覽:113
穿越火線怎麼找伺服器 瀏覽:526
秘密加密社交軟體app 瀏覽:256
c語言編譯器怎麼找文件 瀏覽:836
數學不好能編程嗎 瀏覽:254
微雲里的視頻加密 瀏覽:41
3大加密貨幣交易平台 瀏覽:647
鈑金激光切割機編程 瀏覽:496
vivo手機手電筒app在哪裡 瀏覽:787