查看单个帖子
  #105 (permalink)  
旧 2008-03-10
sjinny 的头像
sjinny sjinny 当前离线
普通会员
 
注册日期: 2008-02-01
帖子: 66
sjinny 正向着好的方向发展
默认 回复: 请教各位大大关于动态内存管理的问题……

唉,今天的麻烦太多,心情十分不爽……

to Elminster:
1.永远都不会有富余资源,因为我们无法假设用户在使用我们的软件的同时不会想要使用其他软件做其他事……
2.硬件发展永远不会足够,因为当硬件性能增长了10%时,用户需求会增长得比10%更多。现在的硬件比起几十年前要强劲得太多,但是对于那些主流游戏,有多少电脑能够一直使用最佳的画质?对于那些常用软件,有多少在启动时完全不需要用户等待?无论是浏览器、office套件还是娱乐软件之类之类……有多少大型软件在出新版本时不需要用户升级硬件也能获得跟以前一样的性能?更何况很多普通用户没有能力或兴趣来优化自己的电脑……
3.我不需要复习也知道抢占,但是这只是在线程之间的协调机制。当你的线程获得了一定的时间片后,如何使用它是你自己的事情,相信这不需要复习也不难理解。
4.如果只看服务器而不看桌面电脑,那我也可以指着超级计算机说:“因为有这样的东西存在,所以任何软件优化都是多余的”。更何况及时在超级计算机上,软件优化也是很重要的。硬件的发展是为了让用户做更多的事情,而不是为了让软件开发人员挥霍。
5.是否不使用gc就必然延长开发周期?是否使用了gc就必然缩短开发周期?是否使用了gc就不仅能必然缩短开发周期而且还必然不带来其他副作用?
6.在我看来,内存管理的麻烦的根源就在于生命期模型。如果有个机制能够确保在内存块的生存期结束时就*一定*、*准时*调用我所指定的行为,并且对这行为没有太多限制,那么内存管理还有什么难处呢?特别是对于应用程序,剩下的无非是内存池之类之类的,这和其它非内存资源的管理比起来又能困难多少?
7.不知道那些设计gc的人有没有信心说“彻底”解决内存管理问题。
8.如果某个非内存资源是信用卡读写器(哪怕只是使这张卡作废也会让用户恼火的),如果某个非内存资源是指向某个机密数据库的连接,如果某个非内存资源是指向某个人的照片目录的文件描述符而错误的访问导致其内容被发送至网络或打印机……
9.如果某些网络连接管理出错,导致不同用户之间的数据包的混乱,那么可能多个用户的账户信息会被搞乱,而这在运行时不会有什么明显的征兆。如果内存访问导致程序崩溃,大多数用户只会习惯性地重启软件,可是其他方面的正确性用户往往不会每次都检查的……如果你能保证软件交付给用户后100%不出问题那当我没说。
10.“它们唯一的共同点只有都需要分配、都需要释放”。这就是关键:如何确保在最合适的时机执行“分配”?如何确保在最合适的时机执行“释放”?如何确保这些行为在一次生命周期中被执行一次且仅一次?如何确保在“分配”前和“释放”后的访问都会导致一次可控的异常抛出而不是整个系统挂掉?而无论是内存管理还是非内存管理,这些都是最大的麻烦(我不知道有没有“之一”)。如果你觉得非内存资源的管理不重要那当我没说。
11.析构函数最大的好处在于:它会被自动调用。如果把这个特性去掉了,那跟普通函数还有什么区别?貌似Dispose还比这种“析构函数”强点。using这种办法来实现RAII,其实是使用一种特定的方法来解决特定的问题(即实现RAII)。现实世界的复杂度太高,所以我们需要的是能够有一定程度的通用性的手段。


to fixopen:
的确,某个具体的内存管理方法是否是FILO的对我来说一点都不重要。重要的是能不能找到足够多的方法,并且它们能够用彼此的长处填补彼此的空白,从而形成一个有足够覆盖力的工具集。
我不太清楚“lexical scope”的确切含义。如果是特指栈,那么我要说我并不是想把栈用于一切。如果是泛指语法层面的模式,那么我要说我要的不仅是语法上的简洁有效,我同时也需要其背后的机制简洁有效。所以在栈和using这两者之间,我更喜欢栈。
就像我在上面to Elminster的10中所说,内存管理和其它非内存资源的管理的最大的麻烦来源之一就是生命期管理,而且现在普遍使用的生命期模型都是“分配-释放”这种最最简单的模型。所以在我看来最最关键的只是生命期问题,至于生命期结束时如何把内存还给系统这种事情并不是最大的麻烦。而生命期问题是多种资源管理的共同的问题。
至于FILO,那只是多种工具中的一种,我不记得哪个帖子里想要用它解决所有问题过,我只记得我说过很多次,这玩意的表达力有限,所以需要更多的工具来覆盖表达力盲区。
有一点我要强调:我寻求栈意外的管理手段是因为栈的表达力有限,它在它的覆盖范围之外的效果不好。如果能够使用using,那么也能够使用栈;如果能够使用栈,那么应该也能够使用using。但是问题在于,当无法使用栈的时候,能使用using吗?我觉得不能,因为不能使用栈的情况一般是程序员对生命期模型的了解不是很清楚,或者生命期模型与栈不相容。我要的是除了栈意外的、同样优秀但是表达力有所不同的工具,using不是这样的工具。我不想再争执“栈和using哪个更好”这个问题,因为这不是我最主要的问题。但是我还是要解释一下,我说using没有栈简洁,是因为使用栈时只需要使用花括号,而不需要按using这么多键。就像“x+y”这个式子比“横坐标加上纵坐标”这句话更简洁一样。



这个长贴再一次让我对一个问题加深了认识:“人与人的沟通是很困难的。”
我很多回帖都是在不断地解释大家对我的误解,而我真正想讨论和解决的问题却一直没有进展,也许我的表达能力实在太糟。

此帖于 2008-03-10 05:51 PM 被 sjinny 编辑.
回复时引用此帖