⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9_2_3 多任务下的垃圾收集 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm

📁 主要介绍了多任务下面的一些数据结构和算法,比如树和图的一些遍历
💻 HTM
📖 第 1 页 / 共 5 页
字号:
href="C:\Documents and Settings\K&G\桌面\9_2_3 多任务下的垃圾收集 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files\style(1).css" 
type=text/css rel=stylesheet>
<DIV id=booknav2>
<DIV id=booknavtop>
<UL>
  <LI><A href="http://book.csdn.net/">首页</A> </LI>
  <LI><A href="http://book.csdn.net/book/morelz.aspx">精品连载</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/myclub.aspx">我的书友会</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/putblog.aspx">图书秀</A> </LI>
  <LI><A href="http://club.book.csdn.net/people/alllist.aspx">书架</A> </LI>
  <LI><A href="http://blog.csdn.net/group/bookread/" target=_blank>圈子</A> </LI>
  <LI><A href="http://down.csdn.net/app/list.php?tid=502" target=_blank>资源下载</A> 
  </LI>
  <LI><A href="http://bank.csdn.net/" target=_blank><FONT 
  style="FONT-WEIGHT: bold">银行</FONT></A> </LI></UL></DIV>
<SCRIPT type=text/javascript>
     function IsBlank(obj) //查看对象的值是否为空
    {
      if(obj.replace(/^\s+|\s+$/,"")=="")
		  {
		 
		    return true; 
		  }
		  else
		  {
		   return false;
		  }
		  
     }
    function SearchBook_Top()
    {
      if( !IsBlank(document.getElementById("txtTopKey").value))
      {
         var loc;
         var szType;
         if(document.getElementById("listSearchType").value==null)
          {    
            szType=  document.getElementById("listSearchType").options(document.getElementById("listSearchType").selectedIndex).value;  
          }
          else
          {
              szType= document.getElementById("listSearchType").value;
          }
          if(szType==1)
            loc="http://book.csdn.net/book/morelz.aspx?key="+escape(document.getElementById("txtTopKey").value);
          else
             loc="http://club.book.csdn.net/book/s.aspx?key="+escape(document.getElementById("txtTopKey").value);
          
          self.location=loc;
        
      } 
    }
  </SCRIPT>

<DIV id=booknavbottom2>
<DIV class=hotleft><A href="http://book.csdn.net/subject/allbook.htm" 
target=_blank>全部图书</A> <FONT color=red>推荐</FONT>:<A 
href="http://club.book.csdn.net/book/s.aspx?key=asp.net">ASP.NET</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=ajax">Ajax</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=spring">Spring</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=Hibernate">Hibernate</A> <A 
href="http://club.book.csdn.net/book/s.aspx?key=Java">Java</A></DIV>
<DIV class=hotright><SELECT id=listSearchType name=aa> <OPTION value=2 
  selected>书友会</OPTION> <OPTION value=1>连载</OPTION></SELECT><INPUT 
onkeypress=if(event.keyCode==13){SearchBook_Top();} id=txtTopKey maxLength=25><INPUT onclick=SearchBook_Top(); type=button value=搜索 name=提交></DIV></DIV></DIV>
<DIV class=area>
<SCRIPT 
src="9_2_3 多任务下的垃圾收集 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/BookDetailAd.js" 
type=text/javascript></SCRIPT>

<DIV class=col1>
<DIV class=lineBlue></DIV><!-- title -->
<DIV class=arcTitle>
<H1><A href="http://book.csdn.net/bookfiles/65">多任务下的数据结构与算法 </A></H1>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A 
href="http://book.csdn.net/bookfiles/65/100652570.shtml">9.2.3 多任务下的垃圾收集 
</A></DIV>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A class=url 
href="http://book.csdn.net/">http://book.csdn.net/</A> 2006-8-14 14:19:00 </DIV>
<DIV class=clear></DIV>
<DIV 
style="BORDER-RIGHT: #0b5f98 1px solid; BORDER-TOP: #0b5f98 1px solid; MARGIN: 0px auto; BORDER-LEFT: #0b5f98 1px solid; WIDTH: 700px; BORDER-BOTTOM: #0b5f98 1px solid">
<DIV 
style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FLOAT: left; PADDING-BOTTOM: 1px; WIDTH: 16px; COLOR: white; PADDING-TOP: 1px; BACKGROUND-COLOR: #0b5f98">图书导读 
</DIV>
<DIV 
style="PADDING-LEFT: 2px; FLOAT: right; WIDTH: 670px; LINE-HEIGHT: 16pt; TEXT-ALIGN: left"><!--导读-->
<H1 id=divCurrentNode 
style="PADDING-LEFT: 2px; FONT-SIZE: 12px; WIDTH: 100%; COLOR: #b83507; TEXT-ALIGN: left">当前章节:<A 
href="http://book.csdn.net/bookfiles/65/100652570.shtml"><FONT color=red>9.2.3 
多任务下的垃圾收集</FONT></A></H1>
<DIV id=divRelateNode style="PADDING-LEFT: 2px">
<DIV style="FLOAT: left; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652567.shtml">8.6.2 
线程池调度管理的编码实现</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652568.shtml">9.2.1 
垃圾收集算法简介</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652569.shtml">9.2.2 
用户层垃圾回收算法的实现</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A 
href="http://book.csdn.net/bookfiles/65/100652571.shtml">9.2.4 
使用垃圾回收算法来做内存泄漏检查</A></DIV></DIV></DIV></DIV>
<DIV class=clear></DIV></DIV><!-- main -->
<DIV id=main>
<DIV id=text>
<DIV id=csdn_zhaig_ad_yahoo_2></DIV>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><SPAN 
lang=EN-US>9.2.3</SPAN><SPAN lang=EN-US> &nbsp;</SPAN><SPAN 
style="FONT-FAMILY: 方正准圆简体">多任务下的垃圾收集</SPAN></H3>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">前面通过使用引用计数实现了一个用户程序层的垃圾回收算法,并且可以通过手工释放函数来实现对循环引用内存的释放,前面介绍的都是单任务下的情况,那么在多任务下有何区别呢?</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>1. </SPAN><SPAN 
style="FONT-FAMILY: 黑体">多任务下垃圾收集需要解决的问题</SPAN></H4>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">在多任务下,主要有以下三个问题要考虑。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">对引用计数进行增减操作时,如果有多个任务操作一块内存的引用计数,那么必须给引用计数的操作加上锁保护。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">分配内存、手工释放内存、垃圾收集三个函数里都需要操作哈希表,哈希表必须支持多任务。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>3) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">在多任务应用环境中,大部分分配的内存都只有一个任务访问它,有多个任务访问的内存只是极少数,如何解决单任务下垃圾收集高效率与多任务下垃圾收集效率低下的矛盾?</SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0pt">对第一、二个问题,只要加锁就可以解决</SPAN><SPAN 
style="FONT-FAMILY: 宋体; LETTER-SPACING: 0pt">;</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0pt">对第三个问题,可以再设计一个支持多任务下的垃圾收集模块。如果有多个任务共享的内存,则使用多任务下的垃圾收集模块,单任务访问的内存仍然使用前面实现的垃圾收集模块,这样避免全部使用同样的算法导致效率低下。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>2. </SPAN><SPAN 
style="FONT-FAMILY: 黑体">支持多任务垃圾收集的模块设计</SPAN></H4>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">下面就来设计支持多任务的垃圾收集模块,首先得将</SPAN><SPAN 
lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">修改掉,将里面的对引用计数操作全部上锁。但是要上锁,必须创建一把锁,在需要访问引用计数或需要操作哈希表时,均需要先获取锁,操作完后再解锁,这样还得将</SPAN><SPAN 
lang=EN-US>GCInit()</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,</SPAN><SPAN 
lang=EN-US>GC_Malloc()</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,</SPAN><SPAN 
lang=EN-US>GC_Collect()</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">等函数略作修改,为了有别于单任务的命名,可以在支持多任务的函数或类的命名前面加一个字符“</SPAN><SPAN 
lang=EN-US>M</SPAN><SPAN style="FONT-FAMILY: 华康简宋">”。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">多任务下的</SPAN><SPAN lang=EN-US>MGCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">类的编码实现如下。</SPAN></P>
<P class=4><STRONG><SPAN lang=EN-US>extern LOCK 
g_lock</SPAN></STRONG><STRONG><SPAN 
style="FONT-FAMILY: 宋体">;</SPAN></STRONG><STRONG><SPAN lang=EN-US>&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US>/* </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">用来保护引用计数读写及哈希表操作的锁</SPAN><SPAN lang=EN-US> 
*/</SPAN></P>
<P class=4><SPAN lang=EN-US>/* </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">支持垃圾内存回收的类</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">,使用模板实现</SPAN><SPAN lang=EN-US> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">template &lt;class T&gt; class </SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">MGCPtr </SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">public</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">:</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T 
*m_pAddr</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; /* </SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">用来记住定义的指针地址便于析构函数使用</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">public</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">:</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">MGCPtr(T *t = NULL) 
</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pAddr = t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
INT *p = (INT *)((char *)m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Lock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Unlock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -