真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是defunct僵尸線程

這篇文章主要介紹“什么是defunct僵尸線程”,在日常操作中,相信很多人在什么是defunct僵尸線程問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”什么是defunct僵尸線程”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的中江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

前言

  • 目前大家偶爾會(huì)討論RT-Thread線程退出的問題,如main線程,return后,怎么處理的?RAM等資源,是否得到釋放。

  • 最近在看線程相關(guān)的內(nèi)核源碼,基于內(nèi)核對(duì)象rt_object管理方法,梳理一下線程退出后的處理流程。

  • rt_thread_defunct,僵尸線程的鏈表結(jié)構(gòu),為什么叫【僵尸】,我查的字典。作用,回收刪除的線程的內(nèi)存(堆)資源。

線程初始化與創(chuàng)建

  • rt_thread_init:靜態(tài)初始化一個(gè)線程,線程結(jié)構(gòu)體、線程棧,都是全局的變量。rt_thread_detach后,這個(gè)線程的內(nèi)核對(duì)象從內(nèi)核容器鏈表里移除,【但】線程結(jié)構(gòu)體、線程棧,因?yàn)槭庆o態(tài)全局的,無法釋放。若下次再想初始化并使用這個(gè)線程,依舊可以使用這個(gè)detach后的現(xiàn)有的線程結(jié)構(gòu)體、線程棧進(jìn)行初始化。靜態(tài)線程的特點(diǎn):初始化后,內(nèi)存的占用,就不會(huì)改變。

  • rt_thread_create:動(dòng)態(tài)創(chuàng)建一個(gè)線程。需要使能:RT_USING_HEAP,堆管理。創(chuàng)建的線程【結(jié)構(gòu)體】與【線程棧】都是動(dòng)態(tài)申請(qǐng)出來的。刪除這個(gè)線程時(shí),需要調(diào)用rt_thread_delete。刪除后,線程的【結(jié)構(gòu)式】與【線程?!空加玫膬?nèi)存(堆)空間,可以釋放。刪除后,這個(gè)線程不存在了,想再次開啟使用,需要重新創(chuàng)建。動(dòng)態(tài)線程的特點(diǎn):刪除后,內(nèi)存資源可以釋放。

線程的資源回收

  • RT-Thread 只回收rt_thread_create的線程內(nèi)存資源。

  • 靜態(tài)初始化或動(dòng)態(tài)創(chuàng)建線程時(shí),會(huì)注冊(cè):rt_thread_exit,線程退出后,會(huì)調(diào)用rt_thread_exit。

  • rt_thread_exit中,第一步:把線程從調(diào)度鏈表移除。第二步:靜態(tài)的線程,會(huì)調(diào)用:rt_object_detach,從內(nèi)核對(duì)象容器里移除線程內(nèi)核對(duì)象;動(dòng)態(tài)線程,會(huì)把線程的結(jié)構(gòu)體指針(操作句柄),加入rt_thread_defunct僵尸線程鏈表中,而不是立即釋放線程占用的內(nèi)存。僵尸線程的操作,是在idle線程中執(zhí)行。第三步:執(zhí)行線程調(diào)度,切換線程。在idle線程執(zhí)行,應(yīng)該是保證這個(gè)線程刪除后,立即調(diào)度切換線程,線程的資源回收不需要太高的優(yōu)先級(jí)。

  • idle 線程中: rt_thread_idle_excute 負(fù)責(zé)查看rt_thread_defunct僵尸線程鏈表是否為空,如果不為空,則執(zhí)行內(nèi)存釋放的操作。從線程鏈表移除、釋放線程棧、釋放內(nèi)核結(jié)構(gòu)體。注意,只有動(dòng)態(tài)創(chuàng)建的線程,執(zhí)行此操作。

/* 來自:rt_thread_idle_excute 片段 */

        /* remove defunct thread */
        rt_list_remove(&(thread->tlist));
        /* release thread's stack */
        RT_KERNEL_FREE(thread->stack_addr);
        /* delete thread object */
        rt_object_delete((rt_object_t)thread);

main線程退出

  • 上面梳理了線程的退出,僵尸線程的處理流程,main線程的退出,基本上也可以梳理流程了

  • 靜態(tài)的main線程,未使能:RT_USING_HEAP,退出后,內(nèi)存資源不會(huì)釋放。

  • 動(dòng)態(tài)的main線程,使能了:RT_USING_HEAP后,退出后,內(nèi)存資源得到釋放。

  • 實(shí)際對(duì)比內(nèi)存資源的釋放大小,發(fā)現(xiàn),動(dòng)態(tài)申請(qǐng),會(huì)額外占用一點(diǎn)內(nèi)存資源,如12字節(jié),這部分在后面內(nèi)存管理后再深入的梳理。

動(dòng)態(tài)線程的資源回收:

RT_USING_HEAP main存在時(shí):線程棧大小為2048

msh >free
total memory: 89568
used memory : 10656
maximum allocated memory: 10656

main不存在時(shí):

msh >free
total memory: 89568
used memory : 8456
maximum allocated memory: 10656

main的線程棧,return后的資源:2200 Bytes空間

2048 ??臻g + 12Byte(rt_malloc管理占用)
128Byte rt_thread結(jié)構(gòu)體大小,sizeof(struct rt_thread) + 12Byte(rt_malloc管理占用,內(nèi)核對(duì)象)。

合計(jì):2048+12+128+12 = 2200。

總結(jié)

  • 熟悉RT-Thread線程的初始化、創(chuàng)建、脫離(反初始化)、刪除等操作。

  • 熟悉動(dòng)態(tài)創(chuàng)建的線程,刪除后,加入僵尸線程鏈表,內(nèi)存資源回收流程。

  • 理解普通線程如main線程的退出流程。

  • 帶著問題后續(xù)繼續(xù)研究以下知識(shí)點(diǎn):

  • 調(diào)度器的工作流程,在哪里執(zhí)行?如何運(yùn)作?

  • 線程定時(shí)器,每個(gè)線程都會(huì)創(chuàng)建一個(gè),線程刪除后,定時(shí)器資源的回收流程。

rt_thread_delete /* 線程的定時(shí)器,使用detach方式,定時(shí)器資源回收流程 */

rt_timer_detach(&(thread->thread_timer)); /* 定時(shí)器資源的回收流程 */
  • 創(chuàng)建線程時(shí),我把線程的名字(name)改為RT_NULL,依舊可以正常的運(yùn)行,但這樣是否有影響?

  • rt_thread 結(jié)構(gòu)體中:內(nèi)核對(duì)象的鏈表用于加入內(nèi)核對(duì)象容器,成員:tlist的工作流程。

  • 歷史問題:rt_thread結(jié)構(gòu)體:

/**
* Thread structure
*/
struct rt_thread
{
   /* rt object */
   char        name[RT_NAME_MAX];                      /**< the name of thread */
   rt_uint8_t  type;                                   /**< type of object */
   rt_uint8_t  flags;                                  /**< thread's flags */

#ifdef RT_USING_MODULE
   void       *module_id;                              /**< id of application module */
#endif

   rt_list_t   list;                                   /**< the object list */

是否可以改為如下:

/**
 * Thread structure
 */
struct rt_thread
{
    struct rt_object parent;                            /**< inherit from rt_object */

到此,關(guān)于“什么是defunct僵尸線程”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


網(wǎng)站欄目:什么是defunct僵尸線程
標(biāo)題網(wǎng)址:http://weahome.cn/article/jspphh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部