新聞中心
隨著計(jì)算機(jī)的發(fā)展,操作系統(tǒng)也在不斷的發(fā)展?,F(xiàn)在的操作系統(tǒng)越來(lái)越復(fù)雜,功能也越來(lái)越強(qiáng)大。Linux操作系統(tǒng)是目前更受歡迎的開源操作系統(tǒng)之一。但是隨著計(jì)算機(jī)的性能不斷提高,硬件操作速度迅速增長(zhǎng),對(duì)于操作系統(tǒng)提出了更高的要求。操作系統(tǒng)的核心部分是進(jìn)程管理,而進(jìn)程管理涉及到進(jìn)程切換。對(duì)于Linux操作系統(tǒng)而言,進(jìn)程切換最關(guān)鍵的問(wèn)題就是函數(shù)調(diào)用棧切換。因此,本文將會(huì)對(duì)Linux函數(shù)調(diào)用棧切換代價(jià)進(jìn)行分析,幫助我們更好地了解Linux操作系統(tǒng)。

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括通山網(wǎng)站建設(shè)、通山網(wǎng)站制作、通山網(wǎng)頁(yè)制作以及通山網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,通山網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到通山省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
一、函數(shù)調(diào)用棧的概念與實(shí)現(xiàn)
在介紹Linux函數(shù)調(diào)用棧切換代價(jià)之前,我們首先必須了解什么是函數(shù)調(diào)用棧以及它的實(shí)現(xiàn)。
函數(shù)調(diào)用棧(Call Stack)是程序在運(yùn)行過(guò)程中用來(lái)存儲(chǔ)函數(shù)調(diào)用關(guān)系的一種數(shù)據(jù)結(jié)構(gòu)。在函數(shù)調(diào)用時(shí),會(huì)將調(diào)用者現(xiàn)場(chǎng)的信息保存在當(dāng)前棧幀中,然后將被調(diào)用函數(shù)的參數(shù)傳遞過(guò)去,同時(shí)被調(diào)用函數(shù)的返回地址等信息被保存在新的棧幀中,然后將控制權(quán)交給被調(diào)用函數(shù)。被調(diào)用函數(shù)執(zhí)行完畢之后,將返回地址等信息從棧幀中取出,恢復(fù)調(diào)用者現(xiàn)場(chǎng),然后將控制權(quán)交回給調(diào)用者。整個(gè)過(guò)程是一個(gè)典型的棧結(jié)構(gòu),因此被稱為函數(shù)調(diào)用棧。
在Linux中,函數(shù)調(diào)用棧是通過(guò)系統(tǒng)堆棧來(lái)實(shí)現(xiàn)的。具體而言,當(dāng)一個(gè)程序開始運(yùn)行時(shí),系統(tǒng)會(huì)在進(jìn)程地址空間中分配一段區(qū)域作為棧區(qū)域,用于存放程序運(yùn)行時(shí)所需要的數(shù)據(jù),包括函數(shù)調(diào)用產(chǎn)生的棧幀。這個(gè)棧區(qū)域通常在高地址向低地址生長(zhǎng)。當(dāng)程序運(yùn)行時(shí),每次函數(shù)調(diào)用都會(huì)產(chǎn)生一個(gè)新的棧幀,保存在棧區(qū)域的棧頂。棧幀包括函數(shù)調(diào)用時(shí)需要保存的現(xiàn)場(chǎng)信息,以及函數(shù)參數(shù)、返回值等信息。當(dāng)函數(shù)調(diào)用結(jié)束后,棧幀被彈出,回收棧空間,控制返回到調(diào)用者函數(shù)。
二、函數(shù)調(diào)用棧的切換
函數(shù)調(diào)用棧是系統(tǒng)在運(yùn)行時(shí)必須維護(hù)的數(shù)據(jù)結(jié)構(gòu)之一,而進(jìn)程的上下文切換中,函數(shù)調(diào)用棧的切換也是非常重要的部分。上下文切換是指進(jìn)程在切換執(zhí)行時(shí)所保存的狀態(tài)信息。其中包括程序計(jì)數(shù)器、寄存器信息、進(jìn)程標(biāo)識(shí)符、內(nèi)存地址空間等信息。當(dāng)進(jìn)程發(fā)生切換時(shí),系統(tǒng)要保存當(dāng)前進(jìn)程的上下文信息,切換到將要執(zhí)行的進(jìn)程的上下文信息。在Linux中,當(dāng)發(fā)生進(jìn)程切換時(shí),需要保存當(dāng)前進(jìn)程的狀態(tài)到PCB(進(jìn)程控制塊)中,然后調(diào)度新的進(jìn)程開始執(zhí)行。
在進(jìn)行進(jìn)程切換時(shí),需要涉及到函數(shù)調(diào)用棧的切換。具體而言,在進(jìn)程切換時(shí)需要保存當(dāng)前進(jìn)程棧幀的信息,同時(shí)恢復(fù)切換進(jìn)程的棧幀信息。這個(gè)過(guò)程需要將當(dāng)前進(jìn)程的棧幀狀態(tài)(如寄存器信息、局部變量、參數(shù)、返回值等)保存到當(dāng)前進(jìn)程的棧幀中,然后將棧幀彈出,保存到PCB中,最后恢復(fù)新進(jìn)程的棧幀信息。這個(gè)過(guò)程需要用到很多匯編指令,如push、pop等。因此,函數(shù)調(diào)用棧切換也是進(jìn)程切換代價(jià)的一部分。
三、函數(shù)調(diào)用棧切換代價(jià)分析
在分析函數(shù)調(diào)用棧切換代價(jià)時(shí),我們需要考慮以下幾個(gè)方面。
1. 保存現(xiàn)場(chǎng)
在進(jìn)行進(jìn)程切換時(shí),需要保存當(dāng)前進(jìn)程的運(yùn)行狀態(tài)信息。這些信息包括程序計(jì)數(shù)器、寄存器狀態(tài)、指令地址、進(jìn)程標(biāo)識(shí)符等。對(duì)于函數(shù)調(diào)用棧而言,保存現(xiàn)場(chǎng)就意味著需要將當(dāng)前進(jìn)程的棧幀信息保存到棧中。這些信息包括寄存器狀態(tài)、局部變量、參數(shù)等。在保存現(xiàn)場(chǎng)的過(guò)程中,需要消耗大量的時(shí)間和空間。
2. 切換棧幀
在進(jìn)程切換時(shí),需要切換到新的進(jìn)程的棧幀。這個(gè)過(guò)程需要用到很多匯編指令,如push、pop等。在切換棧幀時(shí),需要將當(dāng)前進(jìn)程的棧幀信息彈出,同時(shí)將新進(jìn)程的棧幀信息壓入棧中。這個(gè)過(guò)程需要涉及較多的匯編指令,也會(huì)耗費(fèi)大量的時(shí)間和資源。
3. 內(nèi)存壓縮
在進(jìn)行函數(shù)調(diào)用棧切換時(shí),需要對(duì)內(nèi)存進(jìn)行壓縮。這個(gè)過(guò)程需要保證新的棧幀能夠順利的添加到棧中,同時(shí)也需要保證棧的空間足夠。這個(gè)過(guò)程需要涉及到內(nèi)存中的大量數(shù)據(jù)的移動(dòng)和重組,因此也會(huì)耗費(fèi)大量的時(shí)間和資源。
四、結(jié)論
在計(jì)算機(jī)操作系統(tǒng)中,函數(shù)調(diào)用棧切換代價(jià)是進(jìn)程切換時(shí)必須要考慮的一個(gè)問(wèn)題。在Linux操作系統(tǒng)中,函數(shù)調(diào)用棧切換代價(jià)包括保存現(xiàn)場(chǎng)、切換棧幀和內(nèi)存壓縮等過(guò)程。這些過(guò)程需要耗費(fèi)大量的時(shí)間和資源,因此我們需要盡可能地優(yōu)化這些過(guò)程,使其更大程度的降低系統(tǒng)的運(yùn)行代價(jià)。同時(shí),我們也需要盡可能地避免進(jìn)程切換,減少函數(shù)調(diào)用棧切換過(guò)程帶來(lái)的開銷,從而提高系統(tǒng)的運(yùn)行效率。
相關(guān)問(wèn)題拓展閱讀:
- 嵌入式與Linux(五):Linux線程
嵌入式與Linux(五):Linux線程
姓名:王央京 學(xué)號(hào):學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:
【嵌牛導(dǎo)讀】本文介紹了Linux線程的相關(guān)信息
【嵌牛鼻子】Linux線程
【嵌牛提問(wèn)】在了解Linux系統(tǒng)后,能否具體介紹線程的概念?
【嵌牛正文】
類Unix系統(tǒng)中,早期是沒有“線程”概念的,80年代才引答握態(tài)入,借助進(jìn)程機(jī)制實(shí)現(xiàn)出了線程的概念。因此在這類系統(tǒng)中,進(jìn)程和線程關(guān)系密切。一個(gè)進(jìn)程可以有多個(gè)線程,這個(gè)進(jìn)程本身也叫做線程只不過(guò)是主線程。通常主線程分配任務(wù)給子線程做。程序設(shè)計(jì)時(shí)候就可以某一時(shí)刻不止做一件事情,每一個(gè)線程處理各自獨(dú)立的任務(wù)。
多個(gè)線程可以訪問(wèn)相同的存儲(chǔ)地址空間和文件描述符。同一進(jìn)程內(nèi)的線程共享以下數(shù)據(jù):全局內(nèi)存、進(jìn)程指令、打開的文件、信號(hào)處理函數(shù)和信號(hào)處置、當(dāng)前工作目錄、用戶ID和用戶組ID、大多數(shù)數(shù)據(jù)。每個(gè)線程有各自的線程ID、寄存器(包括程序計(jì)數(shù)器和棧指針)、棧、errono、信號(hào)掩碼、優(yōu)先級(jí)。
線程的優(yōu)點(diǎn)有提高程序并發(fā)性、開銷小和數(shù)據(jù)通信、共享數(shù)據(jù)方便等。線程的缺點(diǎn)有庫(kù)函數(shù)不穩(wěn)定、調(diào)試編寫困難、gdb不支持、對(duì)信號(hào)支持不好等。除此之外,多線程內(nèi)如果其中一個(gè)線程出現(xiàn)了 除0、野指針 等問(wèn)題會(huì)造成該線程崩潰,進(jìn)而導(dǎo)致整個(gè)進(jìn)程終止。同時(shí),線程是進(jìn)程的執(zhí)行分支,線程出異常,就類似進(jìn)程出異常,進(jìn)而觸發(fā)信號(hào)機(jī)制,終止進(jìn)程,進(jìn)程終止,該進(jìn)程內(nèi)的所有線程也就隨即退出。
從上述分析來(lái)看,線程的優(yōu)點(diǎn)相對(duì)突出,缺點(diǎn)均不是硬傷。Linux下由于實(shí)現(xiàn)方法導(dǎo)致進(jìn)程、線程差別不是很大。
線程有一套完整的與其有關(guān)的函數(shù)庫(kù)調(diào)用,它們中的絕大多數(shù)函數(shù)名都以pthread_開頭。為了使用這些函數(shù)庫(kù)調(diào)用,我們必須定義宏_REENTRANT,在程序中包含頭文件pthread.h,并且在編譯程序皮嘩時(shí)需要用選項(xiàng)-lpthread來(lái)鏈接線程庫(kù)。其中常用的函數(shù)庫(kù)如下:
1. pthread_self函數(shù)獲取線程ID,其作用對(duì)應(yīng)進(jìn)程中g(shù)etpid()函數(shù)。
2. pthread_create函數(shù)創(chuàng)建一個(gè)新線程,其作用對(duì)應(yīng)進(jìn)程中fork()函數(shù)。
3. pthread_exit函數(shù)將單個(gè)線程退出,其作用對(duì)應(yīng)進(jìn)程中exit()函數(shù)
4. pthread_join函數(shù)阻塞等待線程退出,獲取線程退出狀態(tài)其作用,對(duì)清源應(yīng)進(jìn)程中waitpid()函數(shù)。
5. pthread_cancel函數(shù)殺死(取消)線程其作用,對(duì)應(yīng)進(jìn)程中kill()函數(shù)。
6. pthread_detach函數(shù)實(shí)現(xiàn)線程分離。
linux 函數(shù)調(diào)用棧切換代價(jià)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 函數(shù)調(diào)用棧切換代價(jià),Linux函數(shù)調(diào)用棧切換代價(jià)分析,嵌入式與Linux(五):Linux線程的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站欄目:Linux函數(shù)調(diào)用棧切換代價(jià)分析(linux函數(shù)調(diào)用棧切換代價(jià))
文章起源:http://fisionsoft.com.cn/article/dpphijp.html


咨詢
建站咨詢
