搜索
bottom↓
回复: 19

期待RT-Thread能有垃圾回收机制

[复制链接]

出0入0汤圆

发表于 2010-10-7 12:18:35 | 显示全部楼层 |阅读模式
垃圾回收,虽然对实时性影响非常大,然而对一个系统而言,尤其一个完备的系统来说,是必要和重要的。
如果不是那样,一个简单的系统,在线程只有几个的时候,用户到是很容易处理,然而现在的RTT最多支持256个线程,如果这么多线程
在运行呢,可见都由用户程序处理,那么大的工作量用户能处理得来吗,就算能处理,这样的系统的效率,稳定性和可靠性,也是大打折扣的。

所以,垃圾回收属于系统层面,起码也应该有个接口,而且是可配置的接口,期待!
实时性是相对而言的吧,只要硬件跑得够快能够大大符合实际要求,也可称之为实时性操作系统吧,所以也没必要为了'实时‘而被'实时'束缚,现在基于RTT的GUI都有了,各种扩展功能也在不断加入。 可以说RT-Thread越来越强大了!

我想实现垃圾回收机制,不是随时都在处理的吧,有了这个机制,在需要的时候再运行,也不会太拖累系统的。
本人不才,经验生疏,不太理解 ffxz的所说的'内存空间着色处理',(得找些时间学习相关知识了,充电^_^),关于这个内存回收,我到是有一些初步的想法和分析:
在RT-Thread中,内存的泄露变主要是因为,线程的非正常退出或被强制删除或永远被挂起变成了死的无用的线程而造成。
在这些线程主要分成静态线程(rt_thread_init()所初始化)和动态线程(rt_thread_create()所创建)。而线程中内存的分配都是由堆(heap)或栈(stack)来完成的。所造成内存泄露,也就是所谓的垃圾。
在分配和获取内存的时候,如果对每一块内存进行相关记录或注_册,那么回收的时候也就容易了。

不知对不对,请各位大大们点评,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2010-10-7 12:37:41 | 显示全部楼层
不知道楼主所提的需要加入垃圾回收机制是只听到别人的讨论得来的呢还是看过源代码后得来的.

他们所讨论的是 "GUI应用下的内存碎片的优化"  及需要针对 pthread 专门加一个主动线程清理接口.

而非目前 RT-thread 完全没有这种机制.
目前 RT-thread 是被动地在运行idle线程时进行清理.

"然而现在的RTT最多支持256个线程“
是256级. 个数无限.

"内存的泄露变主要是因为"
"线程的非正常退出或被强制删除"
只要退出或被删除,动态线程就会被idle线程回收.
静态线程因为内存空间在编译时就已被分配. 不必要回收.
因为一般来讲.静态线程都是永不退出的线程.

"或永远被挂起变成了死的无用的线程而造成。"
本该运行的线程被永远挂起是应用程序写得不好造成的.
系统无法判断这个线程是长时间挂起还是永久挂起了.
因为在实际运行中.某些线程可能会因条件不足永远不会执行(如自毁系统).

"在分配和获取内存的时候,如果对每一块内存进行相关记录或注_册,那么回收的时候也就容易了。"
这是任何内存管理已经具备且必需具备的功能.

出0入0汤圆

发表于 2010-10-7 13:35:30 | 显示全部楼层
感觉有点无厘头

出0入0汤圆

发表于 2010-10-7 17:22:32 | 显示全部楼层
得分清一些概念的,什么是内存垃圾,哪些需要回收。。。finsh中就有个简单的垃圾回收机制

线程删除或退出并不一定就会造成垃圾(内存泄露),至少在系统层面是不会出现。内存垃圾一般指的是内存泄露,当系统中已经分配的一块内存不再被其它所引用时,如果没释放则形成内存泄露,最终形成一块块垃圾。垃圾回收则需要把这些内存给找出然后集中释放。这个找出过程是关键算法,它确实可以放到低优先级的线程中进行处理,但对内存分配器的锁确不可避免。

出0入0汤圆

发表于 2010-10-7 17:24:30 | 显示全部楼层
另外栈是不存在泄露的,主要出现在堆上

出0入0汤圆

 楼主| 发表于 2010-10-7 18:36:59 | 显示全部楼层
回复【1楼】aozima
...
-----------------------------------------------------------------------
你也许你不明白我所说的关注点。
你说的没错,确实是256级,由于是全抢占式,理论上可以建立很n个线程,n>>256
"只要退出或被删除,动态线程就会被idle线程回收",只是针线程的STACK(这个STACK也从系统Heap中获取的)和object的情况:
/* release thread's stack */
rt_free(thread->stack_addr);
/* delete thread object */
rt_object_delete((rt_object_t)thread);

你说的只是其一,关键的地方却给忽略掉了。
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧
尤其系统终存在各种复杂而又互相依赖的多个线程呢,长此以往,垃圾将变得越来越多多,到最后,任何线程(当然包括系统核心进程)也别想获取任何存储单元,造成的后果是什么?不说,你也想到了...

出0入0汤圆

 楼主| 发表于 2010-10-7 18:37:42 | 显示全部楼层
回复【2楼】mbbill
感觉有点无厘头
-----------------------------------------------------------------------
...
不明白怎么成了无厘头

出0入0汤圆

 楼主| 发表于 2010-10-7 18:38:30 | 显示全部楼层
回复【3楼】ffxz
得分清一些概念的,什么是内存垃圾,哪些需要回收。。。finsh中就有个简单的垃圾回收机制
线程删除或退出并不一定就会造成垃圾(内存泄露),至少在系统层面是不会出现。内存垃圾一般指的是内存泄露,当系统中已经分配的一块内存不再被其它所引用时,如果没释放则形成内存泄露,最终形成一块块垃圾。垃圾回收则需要把这些内存给找出然后集中释放。这个找出过程是关键算法,它确实可以放到低优先级的线程中进行处理,但对内存分配器的锁确不可避免。
-----------------------------------------------------------------------


==
惭愧,到目前为止,调试中,一般不用finsh或只用其中一二函数, finsh确实是个好东西!以后多用用, 顶!

出0入0汤圆

 楼主| 发表于 2010-10-7 18:39:16 | 显示全部楼层
回复【4楼】ffxz
另外栈是不存在泄露的,主要出现在堆上
-----------------------------------------------------------------------
是的。 ^_^

出0入663汤圆

发表于 2010-10-7 18:50:57 | 显示全部楼层
回复【5楼】itspy 独舞
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧
-----------------------------------------------------------------------

OS为什么要给APP擦屁股?

出0入0汤圆

 楼主| 发表于 2010-10-7 20:42:14 | 显示全部楼层
回复【9楼】gzhuli 咕唧霖
回复【5楼】itspy 独舞
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧  
-----------------------------------------------------------------------
os为什么要给app擦屁股?
-----------------------------------------------------------------------

错了,我的本意不是说所有的APP都应该由OS来决定。我是想应该是os的‘垃圾回收的’功能。
做个比较吧,比如,只是比如说,如果XP没有类似机制,那随便写个程序,内存随便申请,那不是病毒了,谁还能用得了?

出0入0汤圆

发表于 2010-10-7 21:10:59 | 显示全部楼层
看到这里才明白楼主的意思。。。
差不多就是像linux那样的对吧。

出0入0汤圆

发表于 2010-10-7 21:24:25 | 显示全部楼层
那可能有点麻烦了。windows下面是进程退出后,系统才对该进程相关的核心对象进行回收。线程的退出并不会回收。另外,如果在windows拼命的申请资源,比如核心对象,比如socket之类的,也会导致蓝屏的。windows核心对象部分是不会被换页换出去的。
RTT里面没有进程的概念。这里操作有难度的。另外,RTT的设计思想上面主要应用是在单片机上面,应该不会有程序的频繁启动退出的。除非是在类似手机/pda之类的应用,可能会频繁的应用程序启动与退出。

出0入0汤圆

发表于 2010-10-7 21:43:45 | 显示全部楼层
这个在线程上没有考虑,在应用模块上有考虑,只是不知道现在shaolin实现情况如何

BTW,你这个确实不叫垃圾回收

出0入663汤圆

发表于 2010-10-7 22:44:48 | 显示全部楼层
回复【10楼】itspy 独舞
回复【9楼】gzhuli 咕唧霖
回复【5楼】itspy 独舞  
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧   
-----------------------------------------------------------------------  
os为什么要给app擦屁股?
-----------------------------------------------------------------------
错了,我的本意不是说所有的app都应该由os来决定。我是想应该是os的‘垃圾回收的’功能。
做个比较吧,比如,只是比如说,如果xp没有类似机制,那随便写个程序,内存随便申请,那不是病毒了,谁还能用得了?
-----------------------------------------------------------------------

不能把桌面系统的做法套在嵌入式系统上。而且,XP也确实是随便写个程序就能弄死掉的。
RT-Thread的大部分目标平台连MPU都没有,APP出错就随时可以把OS干掉,不要说OS给APP擦屁股了。

出0入0汤圆

 楼主| 发表于 2010-10-7 23:17:26 | 显示全部楼层
回复【12楼】oldtom
那可能有点麻烦了。windows下面是进程退出后,系统才对该进程相关的核心对象进行回收。线程的退出并不会回收。另外,如果在windows拼命的申请资源,比如核心对象,比如socket之类的,也会导致蓝屏的。windows核心对象部分是不会被换页换出去的。
rtt里面没有进程的概念。这里操作有难度的。另外,rtt的设计思想上面主要应用是在单片机上面,应该不会有程序的频繁启动退出的。除非是在类似手机/pda之类的应用,可能会频繁的应用程序启动与退出。
-----------------------------------------------------------------------
RT-Thread是有Lwip的,没错吧,而发行了多个带lwip的版本,lwip中带有socket,而demo是基于阻塞设计的socket。
lwip基于核心进程tcp_ip_thread,如果这个进程产生了意外(但从例程中还是莫名的被阻塞掉了,原因是什么,待查),毫无疑问,基于socket设计的其他线程则永远死掉,无所事事。系统网络功能也不能再恢复。解决的办法系统只能重新启动或者线程重新启动。如果线程重新启动带来的问题就是内存碎片问题。嵌入式系统的内存是有限的,内存碎片问题不能很好解决,则该系统也将不会运行多久。总不能让系统复位再复位来解决吧。

出0入0汤圆

发表于 2010-10-8 02:20:10 | 显示全部楼层
回复【9楼】gzhuli 咕唧霖
回复【5楼】itspy 独舞
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧  
-----------------------------------------------------------------------
os为什么要给app擦屁股?
-----------------------------------------------------------------------

同意9楼观点.

出0入0汤圆

发表于 2010-10-8 14:32:01 | 显示全部楼层
回复【15楼】itspy  独舞
回复【12楼】oldtom
那可能有点麻烦了。windows下面是进程退出后,系统才对该进程相关的核心对象进行回收。线程的退出并不会回收。另外,如果在windows拼命的申请资源,比如核心对象,比如socket之类的,也会导致蓝屏的。windows核心对象部分是不会被换页换出去的。
rtt里面没有进程的概念。这里操作有难度的。另外,rtt的设计思想上面主要应用是在单片机上面,应该不会有程序的频繁启动退出的。除非是在类似手机/pda之类的应用,可能会频繁的应用程序启动与退出。
-----------------------------------------------------------------------
rt-thread是有lwip的,没错吧,而发行了多个带lwip的版本,lwip中带有socket,而demo是基于阻塞设计的socket。
lwip基于核心进程tcp_i......
-----------------------------------------------------------------------

我觉得这种情况是应该是从核心的tcp_thread里面查错让它不会意外死掉,而不是首先考虑死掉以后再恢复它。

出0入0汤圆

发表于 2010-10-8 18:07:50 | 显示全部楼层
回复【16楼】rainyss  
回复【9楼】gzhuli 咕唧霖
回复【5楼】itspy 独舞
如果线程中有动态的获得内存呢(rt_malloc),idle能回收什么?怎么回收?多考虑这些情况吧  
-----------------------------------------------------------------------
os为什么要给app擦屁股?
-----------------------------------------------------------------------
同意9楼观点.
-----------------------------------------------------------------------
严重同意

出0入0汤圆

发表于 2010-10-8 22:14:25 | 显示全部楼层
回复【15楼】itspy  独舞
回复【12楼】oldtom
那可能有点麻烦了。windows下面是进程退出后,系统才对该进程相关的核心对象进行回收。线程的退出并不会回收。另外,如果在windows拼命的申请资源,比如核心对象,比如socket之类的,也会导致蓝屏的。windows核心对象部分是不会被换页换出去的。
rtt里面没有进程的概念。这里操作有难度的。另外,rtt的设计思想上面主要应用是在单片机上面,应该不会有程序的频繁启动退出的。除非是在类似手机/pda之类的应用,可能会频繁的应用程序启动与退出。
-----------------------------------------------------------------------
rt-thread是有lwip的,没错吧,而发行了多个带lwip的版本,lwip中带有socket,而demo是基于阻塞设计的socket。
lwip基于核心进程tcp_i......
-----------------------------------------------------------------------

LZ此言差矣.



依你之见,如果tcp_ip_thread线程因为某种原因挂起之后,那该对相关的内存进行回收?
那如果假如线程因为因为等待某个事件而挂起,就得对他的内存进行回收?你自己仔细思考下,这样合理吗?有可操作性吗?


就你前面说的tcp_ip_thread线程挂起,导致网络应用相关的线程也随之挂起,出现这种问题,应该去解决根源,而不是去想着回收资源。

毕竟嵌入式系统和windows系统之类不太一样。

9楼观点虽然不雅确是正确的。呵呵。应用层的设计的不合理,却要OS来弥补。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 05:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表