查看单个帖子
  #124 (permalink)  
旧 2008-03-11
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认 回复: 请教各位大大关于动态内存管理的问题……

引用:
作者: sjinny
pool和gc是很不同的……因为gc是独立线程,而且你无法修改它的代码来适应需求变化……但是pool如果作为一个模块,那么是可以合并到上层应用的线程中的,这样对于pool中的资源的分配和释放,其行为限制会小一些,因为你可以避开线程问题。而且作为一个模块,pool最终是可控的——你可以了解其背后的行为,你可以在其代码的层面来修改和定制。而且pool本身也可以放在栈中,可以说其与栈机制是不矛盾的……pool中也可以有pool,可以实现层级管理……
pool里面的实现我不清楚,他可能是独立线程监控缩小,可能是每次释放的时候check一下是否需要缩小。这一部分是可以单独优化和配置的。另外,这个pool我没有源代码,是整个framework (ADO.NET)的一部分。我最初也不知道这个pool的存在,只是觉得这么频繁地open/close connection会不会太慢。后来发现多虑了。

另外,这种需求也很难变化,至少对于那个pool我们的需求没有变化过。它也可以进行一定的配置,但默认的还不错所以我们也没有改过。GC也有一些类似的接口可以configure.

pool可以不可以在stack上也是取决于pool的design, 没有必要的feature只会让使用变得复杂。比如上面的ADO.NET的connection pool直接可以这么用:

代码:
using (SqlConnection conn = new SqlConnection(myConnectionString)) { conn.Open(); doSomething(conn); }
哪里都看不到那个pool. 但是他其实存在着。它就没有想要让别人介入它的生命周期。这也使得它非常好用。

引用:
作者: sjinny
我说的那3点的内容是资源管理机制应该符合什么样的标准……如果你使用现成的封装而不需要自己管理资源,自然不需要关心这个……
不,这个封装未必是现成的,我自己来做恐怕最终成果也就是那样。不会被局限在你那个“确定性”里面,因为它没有带来好处反而局限了抽象。
回复时引用此帖