`
jupiterpan
  • 浏览: 20654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

转:Linux内存机制

阅读更多
转帖:http://hi.baidu.com/sinfiasong/blog/item/ee622ff55caf8924bc3109fa.html

Linux的产生与发展,更多的应用与服务器,那么对于linux的各个管理机制要非常清楚,一个完整的linux系统主要有存储管理,内存管理,文件系统和进程管理等几方面组成,贴出一些以前学习过的一个很好的文章。与大家共享!

  以下主要说明swap和buffer cache机制

  Linux支持虚拟内存(virtual memory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(swap space)。

  一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。

  有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。

  许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

  注意,如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。

  Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。

  可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。

  高速缓冲

  与访问(真正的)的内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段e-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(disk buffering),被用作此目的的内存称为高速缓冲(buffer cache)。

  但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。

  对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。

  大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(write-through):数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(write-back)。后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。

  针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。

  由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,sync命令倾空(flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。

  在Linux中,bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。

  缓存(cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。

  缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用:

  它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。

  如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。

  这就是一般情况下linux内存的一般机制,当然linux内存的运行机制远远比这个复杂,但是只有了解了这个机制,我们管理服务器才能得心应手!
分享到:
评论

相关推荐

    Linux内存分页机制原理

    ### Linux内存分页机制原理详解 #### 一、引言 在现代操作系统中,内存管理是确保系统稳定性和性能的关键技术之一。Linux作为一款广泛使用的开源操作系统,其内存管理机制非常成熟且高效。本文旨在深入解析Linux...

    linux核心中的内存管理和缓冲机制

    一、Linux内存管理 1. 分区与地址空间:Linux内存分为物理内存和虚拟内存。物理内存是实际的RAM,而虚拟内存则是硬盘上的一个区域,通过交换空间模拟RAM。Linux使用页全局目录(PGD)、页中间目录(PMD)、页表目录...

    linux 内存映射机制

    Linux内存映射机制是一种操作系统内核管理内存的方式,它涉及到虚拟地址到物理内存地址的转换过程。在X86架构的Linux系统上,内存映射机制确保每个进程能够通过虚拟内存寻址到高达4GB的地址空间,而物理内存的实际...

    一种Linux内存管理机制.pdf

    Linux内存管理机制包括多种层次和策略,旨在高效地分配和回收内存,避免内存耗尽和系统崩溃。本文将深入探讨Linux内存管理模型、伙伴系统、Slab分配流程以及内存回收策略。 首先,Linux内存管理模型将物理内存划分...

    Linux内存管理机制的分析与研究

    ### Linux内存管理机制的分析与研究 #### 一、引言与重要性 内存管理作为操作系统的核心组件之一,其重要性和复杂性不言而喻。Linux操作系统,以其强大的灵活性和可定制性,提供了丰富的内存管理机制,使得即使是...

    01-Linux内存管理之二:在X86上的虚拟内存管理.rar

    Linux内存管理是操作系统的核心组成部分,尤其在X86架构上,其复杂性和高效性都体现了Linux的优秀设计。本文将深入探讨Linux在X86平台上如何实现虚拟内存管理,包括虚拟地址空间的划分、页表机制、内存分配与回收、...

    易语言linux内存操作源码

    易语言Linux内存操作源码是针对Linux操作系统设计的编程代码,主要目的是为了在Linux环境下进行内存管理与操作。易语言是一种中国本土开发的、面向普通用户的编程语言,它以其简单的语法和直观的编程界面,降低了...

    linux-memory-manage.rar_Linux 内存管理_linux_memory_内存管理 linux_内存管理

    本资料集“Linux内存管理”深入探讨了Linux内核如何高效地管理内存资源,包括物理内存、虚拟内存、交换空间等多个方面。以下是关于Linux内存管理的关键知识点: 1. 物理内存:在Linux中,物理内存是指计算机硬件中...

    linux内存管理结构图

    Linux内存管理是操作系统的核心部分,它负责有效地分配和回收系统中的物理和虚拟内存。在Linux中,内存被划分为多个区域(Zone)和节点(Node),以优化内存的使用和性能。以下是对这些概念的详细解释: 1. **节点...

    linux下内存管理

    2. 虚拟内存(Virtual Memory):Linux采用了虚拟内存机制,使得每个进程都有自己的独立地址空间。通过页表映射,物理内存和虚拟内存之间可以进行动态转换,提高了内存利用率。 3. 分页与分段:Linux内存管理的基础...

    Linux内存管理 vs. Windows 2000内存管理

    - **Linux内存模型**:Linux采用的是完全分页的内存模型,这意味着所有物理内存都被划分为固定大小的页面(通常为4KB),并且每个进程都有自己的独立地址空间。Linux支持物理内存和虚拟内存的概念,通过页表映射...

    Linux 内存泄露查找

    需要注意的是,mtrace只能检测通过malloc/free机制分配和释放的内存,对于其他类型的内存错误(比如越界访问),还需要结合其他工具和技术来进行诊断。希望本文能够帮助开发者更好地理解和应用mtrace工具,提高软件...

    Linux虚拟内存管理.pdf

    Linux虚拟内存的实现需要6种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制和内存共享机制。 在Linux中,虚拟内存管理是通过地址映射机制把用户程序的逻辑地址映射到物理地址...

    嵌入式Linux内存与性能详解-史子旺

    《嵌入式Linux内存与性能详解》一书由史子旺撰写,专注于深入解析Linux内存管理机制以及如何在嵌入式环境中优化系统性能。Linux内存管理是操作系统的核心部分,理解和掌握这一领域对于开发者来说至关重要,尤其是在...

    嵌入式Linux内存与性能详解

    本资源《嵌入式Linux内存与性能详解》详细阐述了这些关键领域,为理解嵌入式系统的内在机制提供了深入见解。 1. **嵌入式系统概述**:嵌入式系统通常具有特定功能,它们在硬件限制下运行,如处理能力、内存大小和...

    linux内存管理总结

    以下是Linux内存管理的一些关键知识点: 1. **内存管理工具**: - CodeViz:这是一个用于生成代码调用关系图的工具,可以帮助开发者理解代码间的调用结构,虽然在描述中没有详细展开,但它是分析Linux内核源码的...

    linux 内存运行原理自己的总结

    - 分页机制:Linux将内存划分为固定大小的页,便于管理和分配。 - 内存区域:如TEXT(代码段)、DATA(初始化数据)、BSS(未初始化数据)和堆栈等。 2. **虚拟内存** - 交换空间:当物理内存不足时,Linux会将...

    Linux内存管理中的Slab分配机制.pdf

    Linux 内存管理中的 Slab 分配机制 Linux 操作系统 的内存管理机制中,Slab 分配机制 plays a crucial role in optimizing memory allocation and deallocation. This mechanism is designed to minimize memory ...

    linux学习资料——内存管理

    首先,Linux内存管理的目标是高效地分配、使用和回收内存,同时确保数据的一致性和安全性。它包括了物理内存、虚拟内存以及交换空间的管理。 1. **物理内存**:Linux将物理内存划分为多个称为页(Page)的固定大小...

Global site tag (gtag.js) - Google Analytics