国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        Linux應用程序設計:如何獲取線程棧的使用信息?

        2021-05-27 10:15
        道哥分享
        關注

        面對的問題

        對于線程的?臻g,相信各位小伙伴都不陌生。它有下面的這幾項特性:

        由操作系統分配固定的空間;

        使用一個棧寄存器來保存實時位置;

        后進先出。

        今天,我們不聊操作系統層面對棧的管理,只從應用程序的角度,來看一下如何實時獲取棧的使用情況。

        在一般的單片機/嵌入式程序開發過程中,在創建一個線程(或者稱作任務)的時候,是可以指定給該線程分配多少?臻g的。

        然后在調試的時候呢,周期性的打印出棧區的使用情況:消耗了多少空間,還剩余多少空間。

        這樣的話,跑完每一個測試用例之后,就能得到一個大致的統計數據,從而最終決定:需要給這個線程分配多少棧空間。

        例如:在 ucOS 系統中,提供了函數 NT8U OSTaskStkChk(INT8U prio, OS_STK_DATA  *p_stk_data),來獲取一個任務的棧使用信息。

        但是在 Linux 系統中,并沒有這樣類似的函數,來直接獲取棧使用信息。

        因此,為了得到此線程的已使用和空閑?臻g,必須通過其他的方式來獲取。

        下面,就提供 2 種解決方案:正規軍方式和雜牌軍方式!

        正規軍方式

        在 Linux 系統中,在創建一個線程的時候,是可以通過線程屬性來設置:為這個線程分配多少的棧(stack)空間的。

        如果應用程序不指定的話,操作系統就設置為一個默認的值。

        線程創建完畢之后,操作系統在內核空間,記錄了這個線程的一切信息,當然也就包括給它分配的?臻g信息。

        為了讓應用層能夠獲取到這個信息,操作系統也提供了相應的系統函數。代碼如下:

        pthread_attr_t attr;
        void *stack_addr;
        int stack_size;
        memset(&attr, 0, sizeof(pthread_attr_t));
        pthread_getattr_np(pthread_self(), &attr);
        pthread_attr_getstack(&attr, &stack_addr, &stack_size);
        pthread_attr_destroy(&attr);
        printf("statck top   = %p ", stack_addr);
        printf("stack bottom = %p ", stack_addr + stack_size);

        從上面這段代碼中可以看到,它只能獲取棧空間的地址開始以及總的空間大小,仍然不知道當前?臻g的實際使用情況!

        我找了一下相關的系統調用,Linux 似乎沒有提供相關的函數。

        怎么辦?只能迂回操作。

        我們知道,在 Linux x86 平臺上,寄存器 ESP 就是來存儲棧指針的。對于一個滿遞減類型的棧,這個寄存器里的值,就代表了當前棧中最后背使用的、那個棧空間的地址。

        因此,只要我們能夠獲取到 ESP 寄存器里的值,就相當于知道了當前這個棧有多少空間被使用了。

        那么怎樣來獲取 ESP 寄存器的值呢?既然是寄存器,那就肯定是使用匯編代碼了。

        很簡單,就 1 行:

        size_t esp_val;
        asm("movl %%esp, %0" : "=m"(esp_val) :);

        對不起,我錯了!應該是 2 行代碼,忘記變量定義了。

        對于匯編代碼不熟悉的小伙伴,可以參考之前總結的一篇文章:內聯匯編很可怕嗎?看完這篇文章,終結它!

        找到第 4 個示例,直接抄過來就行。

        好了,拿到了以上的所有信息,就可以計算出棧的已使用和空閑空間的大小了:

        1  2  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 中文字幕无码av| 成人网站18禁| 黄色视频在线观看18| 国产老熟女伦老熟妇露脸| 国产九九免费视频| 中文字幕一区二区三区擦澡| 无码簧片| 亚洲AV社区| 你懂的福利导航| 亚洲成av人片大线观看| 18禁久久| 熟女中文字幕在线| 新宾| 国产制服丝袜在线视频观看| 江都市| 亚洲国产| 无码av在线播放| 新乡县| 制服丝袜国产日韩酒店大堂经理| 亚洲狠狠| 美腿丝袜中文字幕精品| 国产丝袜精品在线| 丁香久久婷婷| 亚洲无码社区| 安丘市| 韩日一级| 女生洗鸡鸡喷尿的视频无马赛克?舒坦直叫的骚货视频?亚洲着九九九视频影院 | 国产精品va| 99久久精品国产毛片| 欧美BBXX| 国产做受| 东源县| 青青草99| 丝袜一级A片| 北条麻妃无码视频| 绥德县| 亚洲AV熟女| 亚洲精品久久久无码aⅴ片恋情| 耿马| 亚洲AV一卡二卡| 国产精品视频久久久|