论坛首页 综合技术论坛

项目事故和安全语言

浏览 74459 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-09-26  
buaawhl 写道

先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。

另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。


这里和是否32位到是没有关系,只是现在的os进程和进程是隔离的。进程和os也是隔离的。一般的用户经常都是user level的。比如win32的系统,进程用的api和os级别代码用的api更本是两套系统。你想越界,请先获得kernel的代码运行权限(比如写成某个驱动程序)。

进程内指针越界,这种情况多的很,但是影响范围也就是仅限于当前进程而已。
0 请登录后投票
   发表时间:2006-09-26  

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。
0 请登录后投票
   发表时间:2006-09-26  
buaawhl 写道

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。


呵呵  debug出来的,malloc() 然后跟踪下去. 或者你可以看下 MSDN:Platform SDK: Memory Management部分的信息,不过不是很详细。

  • 描述: Managing Heap Memory in Win32
  • 大小: 137 KB
0 请登录后投票
   发表时间:2006-09-26  
buaawhl 写道

charon给的那个link打不开,不过至少知道有这么一回事了。
jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。

我怎么感觉这是说 handle 呢?

可有win32 malloc api的详细说明?我没有搜索到。


csdn上找到另一篇文章:
http://dev.csdn.net/article/83995.shtm
对堆讲的很清楚. 不过它有张直观的图片没有贴上
同一篇文章可以去看下面这个(这个布老大可能还是看不到)
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5

我的感觉在windows xp/2000下,杀掉进程并不会导致堆空间泄露.
其实测试一下很简单,写一段死循环的ruby/python程序,在cmd窗口下面跑,然后强行关闭,看有没有泄露,有多少泄露(几K字节的不算,那个是操作系统自己的消耗).
0 请登录后投票
   发表时间:2006-09-26  
中午睡了一大觉,醒来这么热闹了。
buaawhl一贯敢装牛人,这次倒要看看结果如何。
0 请登录后投票
   发表时间:2006-09-26  
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?

虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。

我给您解释,linux下。
一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。
你每次malloc都在这个堆里面分配一块出去。

地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。
如果越界到了数据段地址空间外,那么会core dump。

进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。
0 请登录后投票
   发表时间:2006-09-26  
ddd 写道
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?

虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。

我给您解释,linux下。
一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。
你每次malloc都在这个堆里面分配一块出去。

地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。
如果越界到了堆地址空间外,那么回core dump。

进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。


嗯,我查了一下,指针越界,在Unix上面确实会导致core dump,这里不会导致内存泄漏,我犯了一个明显的错误。


但不知我遇到那种情况做何解释?因为都是用户空间的进程,用PHP就内存泄漏,关闭PHP照样内存无法回收,只要不用PHP就一切回复正常。

0 请登录后投票
   发表时间:2006-09-26  

结果是,我知道有这么回事了。
通过charon给的link,可以知道,通过handle进行堆的管理。以前的malloc API呢?
不过,jack给的那个图里面有Global Memory, Local Memory的区别。Global Memory应该是进程间通信使用的。不知道具体如何管理。
我也没有这些编程环境,也没有尝试。

另外,谢谢3D兄弟称我一声牛人。这个称呼我还听得很少。(窃喜中,对自己的能力有了新的认识,竟然也忝列牛人行列)
牛人这东西,还真需要相互吹捧,才铸造得出来。
一开始可能是客气,后来就成习惯了,就巩固了。
0 请登录后投票
   发表时间:2006-09-26  
我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。
0 请登录后投票
   发表时间:2006-09-26  
ddd 写道
我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。


我连换两个不同的Linux发行版本,并且都update到最新的patch,但是状况依旧,所以我相信kernel没有问题。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics