LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: debianor

关于debian的内存管理

[复制链接]
 楼主| 发表于 2006-3-16 15:20:10 | 显示全部楼层
Post by maniac
我学过一点操作系统, 没听说过这种说法, 内存管理指的是合理使用内存 做为缓存的内存为什么要释放? 内存的速度都在至少1GBps/s以上, 当程序载入的时候会从硬盘读入需要的部分, 瓶颈是硬盘速度, 完全可以在读硬盘的时候一边清空内存, 一面将需要载入的部分写入刚清空的地方,根本不影响速度.
linux只有在内存不够的时候才会释放部分应用程序缓存和磁盘缓存,和程序载入是同步进行. 占用资源没什么大不了的, 只要在其他程序需要使用的时候及时放出就行了, linux又不是win98. 如果什么程序退出马上清空内存, 下一次运行的时候在重新读入, 然后保证内存最多只占用50%, 那和只有一半内存有什么区别?


存储管理的主要功能之一是:实现内存的分配和回收。

当进程执行结束后,存储管理器模块要及时回收该进程所占的内存资源,以便给其他进程分配空间。

C++里的析构函数就是在程序执行完的时候释放程序中对象所占的空间,以使其称为空闲空间;java, C#里的垃圾回收器也是由系统控制的自动回收已经无用的对象所占的空间。

你可以找本介绍操作系统原理的书看下,推荐你清华大学出版社出版的《计算机操作系统教程》很不错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-16 15:28:30 | 显示全部楼层
虽然linux的内存管理机制我不清楚,但是我想应该跟操作系统原理里说的不会有本质差别。
回复 支持 反对

使用道具 举报

发表于 2006-3-16 15:44:21 | 显示全部楼层
那么,如果你觉得这个是Bug的话,你看见内存没有释放的时候你的运行速度是否下降呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-16 15:49:58 | 显示全部楼层
Post by pluskid
那么,如果你觉得这个是Bug的话,你看见内存没有释放的时候你的运行速度是否下降呢?


我没说这是个bug,因为我没做过linux内核分析。

我之所以贴这个贴就是想了解一下linux的内存管理机制。

我只是描述我机子上发生的现象:640M的内存使用完后,鼠标会拖。然后我就想会不会是linux内存管理方面的问题。仅此而已。
回复 支持 反对

使用道具 举报

发表于 2006-3-16 20:23:53 | 显示全部楼层
内存的释放并不是说就要让这块内存里面什么也没有, 而是让它不再为某个应用程序所占有. Linux 中释放内存的时候, 很多时候是直接把它转成缓存, 然后, 当起动其它程序, 并且空闲的内存不够的时候, 也会迅速适当地释放一些缓存.

缓存是个微妙的概念, 它不是空闲内存, 却可以时刻被当成"空闲内存"来使用

当运行某个程序并关闭的时候, 空闲内存极有可能不会改变, 但是处于使用状态的内存的量却会减少, 相应地, 缓存也会变多. 这不是一定的, 但是常见的.

用 TOP 或者 FREE 命令, 观察 USED, BUFFERS, CACHED 这三种类型的内存就可以看到这种变化
回复 支持 反对

使用道具 举报

发表于 2006-3-17 16:10:55 | 显示全部楼层
Post by debianor
存储管理的主要功能之一是:实现内存的分配和回收。

当进程执行结束后,存储管理器模块要及时回收该进程所占的内存资源,以便给其他进程分配空间。

C++里的析构函数就是在程序执行完的时候释放程序中对象所占的空间,以使其称为空闲空间;java, C#里的垃圾回收器也是由系统控制的自动回收已经无用的对象所占的空间。

你可以找本介绍操作系统原理的书看下,推荐你清华大学出版社出版的《计算机操作系统教程》很不错。

你似乎根本没看我说了什么, 垃圾回收和缓存是两码事. 任何操作系统的书都会讲CPU缓存吧, 内存也是一样的. 没有人会说CPU的缓存要及时清空.
回复 支持 反对

使用道具 举报

发表于 2006-3-18 00:29:12 | 显示全部楼层
这就取决于你如何看待 buffer/cached的memory了
回复 支持 反对

使用道具 举报

发表于 2006-3-18 00:42:16 | 显示全部楼层
Post by debianor
存储管理的主要功能之一是:实现内存的分配和回收。

当进程执行结束后,存储管理器模块要及时回收该进程所占的内存资源,以便给其他进程分配空间。

C++里的析构函数就是在程序执行完的时候释放程序中对象所占的空间,以使其称为空闲空间;java, C#里的垃圾回收器也是由系统控制的自动回收已经无用的对象所占的空间。

你可以找本介绍操作系统原理的书看下,推荐你清华大学出版社出版的《计算机操作系统教程》很不错。

兄台……把概念理解清楚了再说不迟。

现代操作系统中有两个关键性的概念,其一是作为程序运行实体的进程(也叫任务),其二是进程运行的空间广度,也即地址空间。在x86体系下,地址有三级,其一是逻辑地址,也就是你写汇编时用的那种指定段和偏移的地址;其二是线性地址,不同的进程都可以有一个重合的线性地址集合,即线性地址空间;其三才是真实的物理地址空间。

而你所说的C++的析构函数其实是实现了线性地址空间层次上的资源回收。现代的操作系统普遍支持虚存特性,即把进程运行在其中的地址空间与实际的物理内存空间隔离开来,从而实现多任务“同时”运行。而在主流的32位地址总线系统中,进程可以寻址的线性地址空间是4GB,也就是说,你写程序时可以认为系统有4GB的内存——当然,大多数普通pc都没有这么奢侈的配置——而不必关心真实的物理内存大小,unix/linux的内核自然会把你的4GB的地址空间转换到也许只有512MB的真实物理内存上去运行。从这里就可以看出,当我在程序里malloc了10MB的一块内存时,其实只是将我的地址空间拉长了10MB,也就是告诉内核,“我这个程序现在运行在110MB的空间上,请你分配新的目录和页表以便寻址物理地址”云云,而并不是说真的立刻就在内存中划出10MB空间供使用。事实上,此刻在内存中,你的程序所占的物理地址也许只有5MB不到。

那为什么书上又要说“分配了内存就一定要释放”呢?这是因为你最大的地址空间是有限,对于通常的系统,这个限制是4GB。如果你只malloc不free,那么你的地址空间就被不断地拉长,最后超出4GB的限制,这时内核无法正确做地址转换,就会把向你的进程发送一个SIGSEGV信号,把你的进程强行kill掉,并释放起初为你的进程分配的所有资源,包括任务描述符,段表和页表等等。

而我们所说的操作系统的内存管理是负责逻辑、线性和物理地址转换,以及内存的监视,对缓冲和缓存进行管理的整个sub system,其重要的一个任务便是更加有效地使用内存,包括避免产生控制之外的内存,以及提高程序的响应速度。为此unix/linux的内核都会实现缓冲(cache)与缓存(buffer)两种机制(在2.6系列内核中似乎两部分已经统一了)。缓冲把程序的一部分内容放在内存内,因而你会发现当你关闭一个大的程序后,以后再启动同一程序的速度会变得很快,这其实是因为内核此时并没有从硬盘上读取可执行文件,而是直接执行了内存中的代码。缓存则主要用于硬件i/o操作,当你写一个大文件到硬盘时,你会发现硬盘灯并不是一直亮着,而是一下一下地闪烁,这就是因为数据先被缓存在内存中,到一定数量时才一次性写到硬盘中(也就是sync),这样大大提高了硬盘i/o的效率,也避免了硬盘无谓地损耗。

基于上述的原因,unix/linux内核会尽量使用多的物理内存做缓冲和缓存。但是当内存不够时,内核完全可以在可以忽略的时间内取得足够的内存分配给需要的程序。

上面这段话的关键点是不要搞混编程中的释放内存和内核中的管理内存两个概念。程序中操作的是线性地址空间,而只有内核才会和物理地址空间打交道。而不管你的程序写的多糟糕,只要进程结束,所有的内存立刻都会被内核回收做他用。并不是说如果我的程序malloc后没有free,那么这部分内存就再也没办法再使用了。
回复 支持 反对

使用道具 举报

发表于 2006-3-18 01:17:36 | 显示全部楼层
并,你说的那本教材太理论化了。我本科也用那本书,学过后只记了一脑子的概念,连真正是什么意思都不太明白。

推荐《Understanding Linux Kernel》3rd. Edition,这本书讲linux的内存管理很出色,而且是基于x86体系,比较具体。容易看懂。
回复 支持 反对

使用道具 举报

发表于 2006-3-18 01:20:10 | 显示全部楼层
晕……本版是不是不许讨论与debian无关的内容?
刚才那些东西,好像发在这里不是太合适?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表