论坛首页 综合技术论坛

项目事故和安全语言

浏览 74457 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-09-26  
如果一个进程结束了,这个进程曾经占用的内存没被释放掉,是内核的责任,因为它的责任之一就是释放掉进程占用的内存,这是一个严格的规定,内核必须负这个责任。
你把所有进程杀光了,如果某个进程内存没释放,是内核的责任没尽到,如果内核本身内存占了那么大,就是内核的bug。两种情况内核都必须负全责。
用户进程犯了再大的错误,进程被杀掉后,内核也得保证这些错误就此消失,不能影响其他进程和内核。
0 请登录后投票
   发表时间:2006-09-26  
NT内核才开始用的规则。。。。98没听说过
0 请登录后投票
   发表时间: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的那张图里面已经画出来了.
我这儿再贴一张那篇文章里面的图,画得更清楚
  • 大小: 10.4 KB
0 请登录后投票
   发表时间:2006-09-26  
robbin 写道

如果像Java这种运行在VM上面,没有指针操作,比较安全的语言,即使内存泄漏,我都不会有太大担心,大不了重起JVM呗,有JVM作为一个安全的保障,不会危及操作系统。但是C/C++就不一样,这些东西一旦内存泄漏,就根本找不回来了,不重起整个操作系统,根本就没有戏,可以说危害极大。

其实很多Java开发的大型系统都有或轻或重的内存泄漏问题,即使很多大型企业的关键应用都是如此。但是很多大型行业应用,往往在晚上都会停掉AppServer进行备份和数据维护,因此只要你能够保证24小时连续运行内存泄漏不超出物理内存限制,也就不是什么问题了。

但是C/C++开发的系统,内存一旦泄漏,由于没有VM的安全保障,只能等待重起操作系统,但是对于这些行业应用来说,重起操作系统根本就是不可以接受的,你想,光是重起小型机操作系统,往往都要半个小时,你能受的了?


就你举的这个例子来说,总结一下,关键就是:java内存泄露最多重起JVM,而C/C++内存泄露最多重起操作系统。
有很大区别么?反正都是重起,不管需要3分钟还是半小时,如果都自动在夜里进行,又有何区别?

予以为没有讲到点子上。
0 请登录后投票
   发表时间:2006-09-26  

使用c++的时间表和charon差不多。还是头一次知道这个。
Process Control Block的结构可以跟踪维护一个堆的分配表。

0 请登录后投票
   发表时间:2006-09-26  
Lucas Lee 写道
反正都是重起,不管需要3分钟还是半小时,如果都自动在夜里进行,又有何区别?
予以为没有讲到点子上。

嘿嘿,看来这地理学天文学要改写了亚.

0 请登录后投票
   发表时间: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最方便。


0 请登录后投票
   发表时间: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有保护模式,但不那么完善,没什么系统在上面用这个模式).
0 请登录后投票
   发表时间:2006-09-26  
谢谢jack提供的两个关键词.
以下是win32下官方的说法:
Managing Heap Memory in Win32
没想到msdn也在网上发布了,当初可是每隔半年就去找最新的盗版光盘.
0 请登录后投票
   发表时间:2006-09-26  
说起286下面,Himem.sys曾经是我的最爱呀,这之前还有一个文件叫啥的,后来被Himem.sys代替了,忘了

Sidekick的时间应该是286的时候,忘了

Undocumented DOS里面将了一大堆这些东西,然后实现了DOS下面的一个简单的多任务系统

还有Norton 的一本叫做啥的,忘了

还有我在单位里对着HP UNIX,第一次把minix源代码看完的时候好像Linus刚刚开始不到2年,不过我并不知道,虽然我那时候真的有梦想实现扩展Minix实现自己的东西

0 请登录后投票
论坛首页 综合技术版

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