锁定老帖子 主题:项目事故和安全语言
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-26
如果一个进程结束了,这个进程曾经占用的内存没被释放掉,是内核的责任,因为它的责任之一就是释放掉进程占用的内存,这是一个严格的规定,内核必须负这个责任。
你把所有进程杀光了,如果某个进程内存没释放,是内核的责任没尽到,如果内核本身内存占了那么大,就是内核的bug。两种情况内核都必须负全责。 用户进程犯了再大的错误,进程被杀掉后,内核也得保证这些错误就此消失,不能影响其他进程和内核。 |
|
返回顶楼 | |
发表时间:2006-09-26
NT内核才开始用的规则。。。。98没听说过
|
|
返回顶楼 | |
发表时间:2006-09-26
buaawhl 写道 结果是,我知道有这么回事了。 通过charon给的link,可以知道,通过handle进行堆的管理。以前的malloc API呢? 不过,jack给的那个图里面有Global Memory, Local Memory的区别。Global Memory应该是进程间通信使用的。不知道具体如何管理。 我也没有这些编程环境,也没有尝试。 那篇文章里面解释了: 引用 C/C++ 运行时 (CRT) 分配程序:提供了 malloc() 和 free() 以及 new 和 delete 操作符。如 Microsoft Visual Basic 和 Java 等语言也提供了新的操作符并使用垃圾收集来代替堆。CRT 创建自己的私有堆,驻留在 Win32 堆的顶部。 实际上jack的那张图里面已经画出来了. 我这儿再贴一张那篇文章里面的图,画得更清楚 |
|
返回顶楼 | |
发表时间:2006-09-26
robbin 写道 如果像Java这种运行在VM上面,没有指针操作,比较安全的语言,即使内存泄漏,我都不会有太大担心,大不了重起JVM呗,有JVM作为一个安全的保障,不会危及操作系统。但是C/C++就不一样,这些东西一旦内存泄漏,就根本找不回来了,不重起整个操作系统,根本就没有戏,可以说危害极大。 其实很多Java开发的大型系统都有或轻或重的内存泄漏问题,即使很多大型企业的关键应用都是如此。但是很多大型行业应用,往往在晚上都会停掉AppServer进行备份和数据维护,因此只要你能够保证24小时连续运行内存泄漏不超出物理内存限制,也就不是什么问题了。 但是C/C++开发的系统,内存一旦泄漏,由于没有VM的安全保障,只能等待重起操作系统,但是对于这些行业应用来说,重起操作系统根本就是不可以接受的,你想,光是重起小型机操作系统,往往都要半个小时,你能受的了? 就你举的这个例子来说,总结一下,关键就是:java内存泄露最多重起JVM,而C/C++内存泄露最多重起操作系统。 有很大区别么?反正都是重起,不管需要3分钟还是半小时,如果都自动在夜里进行,又有何区别? 予以为没有讲到点子上。 |
|
返回顶楼 | |
发表时间:2006-09-26
使用c++的时间表和charon差不多。还是头一次知道这个。 Process Control Block的结构可以跟踪维护一个堆的分配表。 |
|
返回顶楼 | |
发表时间:2006-09-26
Lucas Lee 写道 反正都是重起,不管需要3分钟还是半小时,如果都自动在夜里进行,又有何区别?
予以为没有讲到点子上。 嘿嘿,看来这地理学天文学要改写了亚. |
|
返回顶楼 | |
发表时间:2006-09-26
buaawhl 写道 不过,jack给的那个图里面有Global Memory, Local Memory的区别。Global Memory应该是进程间通信使用的。不知道具体如何管理。 一般开发上基本不理会这些Global Memory, Local Memory的区别的,windows这些好多都是历史遗留的,特别是在windows 16环境中。开发的时候要么就用crt的memory api 要么用 c++的new 和 delete. 极少需要自己管理那么多的heap操作. 如果想知道Global Memory, Local Memory的区别,查下MSDN最方便。 |
|
返回顶楼 | |
发表时间:2006-09-26
jack 写道 buaawhl 写道 先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。 另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。 这里和是否32位到是没有关系,只是现在的os进程和进程是隔离的。进程和os也是隔离的。一般的用户经常都是user level的。比如win32的系统,进程用的api和os级别代码用的api更本是两套系统。你想越界,请先获得kernel的代码运行权限(比如写成某个驱动程序)。 进程内指针越界,这种情况多的很,但是影响范围也就是仅限于当前进程而已。 有那么一点点关系,pc用的x86 cpu在32位(386)开始才真正提供了完善的保护模式和环0-环3的特权执行模式以及4G的寻址空间.16位的时候基本上是各进程共享地址空间的实模式(286有保护模式,但不那么完善,没什么系统在上面用这个模式). |
|
返回顶楼 | |
发表时间:2006-09-26
|
|
返回顶楼 | |
发表时间:2006-09-26
说起286下面,Himem.sys曾经是我的最爱呀,这之前还有一个文件叫啥的,后来被Himem.sys代替了,忘了
Sidekick的时间应该是286的时候,忘了 Undocumented DOS里面将了一大堆这些东西,然后实现了DOS下面的一个简单的多任务系统 还有Norton 的一本叫做啥的,忘了 还有我在单位里对着HP UNIX,第一次把minix源代码看完的时候好像Linus刚刚开始不到2年,不过我并不知道,虽然我那时候真的有梦想实现扩展Minix实现自己的东西 |
|
返回顶楼 | |