锁定老帖子 主题:项目事故和安全语言
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-26
buaawhl 写道 先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。 另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。 这里和是否32位到是没有关系,只是现在的os进程和进程是隔离的。进程和os也是隔离的。一般的用户经常都是user level的。比如win32的系统,进程用的api和os级别代码用的api更本是两套系统。你想越界,请先获得kernel的代码运行权限(比如写成某个驱动程序)。 进程内指针越界,这种情况多的很,但是影响范围也就是仅限于当前进程而已。 |
|
返回顶楼 | |
发表时间:2006-09-26
charon给的那个link打不开,不过至少知道有这么一回事了。 jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。 我怎么感觉这是说 handle 呢? 可有win32 malloc api的详细说明?我没有搜索到。 |
|
返回顶楼 | |
发表时间:2006-09-26
buaawhl 写道 charon给的那个link打不开,不过至少知道有这么一回事了。 jack给的信息。在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作。 我怎么感觉这是说 handle 呢? 可有win32 malloc api的详细说明?我没有搜索到。 呵呵 debug出来的,malloc() 然后跟踪下去. 或者你可以看下 MSDN:Platform SDK: Memory Management部分的信息,不过不是很详细。 |
|
返回顶楼 | |
发表时间: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字节的不算,那个是操作系统自己的消耗). |
|
返回顶楼 | |
发表时间:2006-09-26
中午睡了一大觉,醒来这么热闹了。
buaawhl一贯敢装牛人,这次倒要看看结果如何。 |
|
返回顶楼 | |
发表时间:2006-09-26
robbin 写道 完了,是不是因为Java太普及了,就没有人懂C了?
C指针引用越界,你怎么回收? 虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。 我给您解释,linux下。 一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。 你每次malloc都在这个堆里面分配一块出去。 地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。 如果越界到了数据段地址空间外,那么会core dump。 进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。 |
|
返回顶楼 | |
发表时间:2006-09-26
ddd 写道 robbin 写道 完了,是不是因为Java太普及了,就没有人懂C了?
C指针引用越界,你怎么回收? 虽然你是老大,不过我也得说,您在不掌握的领域内也不要动用这样的语气。 我给您解释,linux下。 一个进程开启,系统给分一个堆空间让你可以malloc,但这个堆空间是虚拟内存地址块。 你每次malloc都在这个堆里面分配一块出去。 地址越界,可以,只要你越界后的地址在堆地址空间内(这里论述还是不精确,应该是数据段,数据段包括堆,并且越界后的地址必须要已被映射),当时不会出现问题。 如果越界到了堆地址空间外,那么回core dump。 进程结束了,这个数据段被统一回收,你根本没有访问数据段外面的可能性,一访问立刻由cpu保证出现地址异常。 嗯,我查了一下,指针越界,在Unix上面确实会导致core dump,这里不会导致内存泄漏,我犯了一个明显的错误。 但不知我遇到那种情况做何解释?因为都是用户空间的进程,用PHP就内存泄漏,关闭PHP照样内存无法回收,只要不用PHP就一切回复正常。 |
|
返回顶楼 | |
发表时间:2006-09-26
结果是,我知道有这么回事了。 通过charon给的link,可以知道,通过handle进行堆的管理。以前的malloc API呢? 不过,jack给的那个图里面有Global Memory, Local Memory的区别。Global Memory应该是进程间通信使用的。不知道具体如何管理。 我也没有这些编程环境,也没有尝试。 另外,谢谢3D兄弟称我一声牛人。这个称呼我还听得很少。(窃喜中,对自己的能力有了新的认识,竟然也忝列牛人行列) 牛人这东西,还真需要相互吹捧,才铸造得出来。 一开始可能是客气,后来就成习惯了,就巩固了。 |
|
返回顶楼 | |
发表时间:2006-09-26
我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。
|
|
返回顶楼 | |
发表时间:2006-09-26
ddd 写道 我解释不了,不过还是那句话:不能解释不代表一定是apache或php的错。
我连换两个不同的Linux发行版本,并且都update到最新的patch,但是状况依旧,所以我相信kernel没有问题。 |
|
返回顶楼 | |