zoukankan      html  css  js  c++  java
  • [ 操作系统 ] 内存篇

       重新学习了下内存相关知识,仅做个人笔记。

    1. 内存管理的主要特点:

        无论物理内存多大,Linux都将充分利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高linux系统的数据访问性能。而windows是只在需要内存的时候才为应用程序分配内存,并不能充分利  用大容量的内存空间。 linux的这一特性主要是利用空闲的物理内存,划分出一部分空间,作为cache、buffers,以此提高数据访问性能。页面高速缓存(page cache)是linux内核实现的一种
    主要的磁盘缓存机制。主要用来减少对磁盘I/O操作。是通过把对磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。

        CPU不能直接访问外存,对外存的访问必须通过内存。

        减少磁盘的I/O操作能有效的提高linux数据访问性能,linux内核会在物理内存中,划分一段物理内存作为buffers和cache 来缓存一些程序调用过的磁盘数据,当程序再次访问
        这些数据的时候就直接到内存中获得。高速页面缓存是linux内核对内存的一种管理机制。

        linux对大容量的内存使用机制比windows强。
        windows是当应用程序需要内存才会分配内存,不能充分利用大容器内存的有效性。

    2. 物理内存、虚拟内存

          虚拟内存是为了满足物理内存不足而提出的策略,它是利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间被称为交换分区(Swap Space)
        Linux的内存管理采取的是分页存取的机制,为了保证物理内存得到充分的利用,内核会在适当的时候,将物理内存中不经常使用的数据块自动交换至虚拟内存中,而将经常使用的信息保留到物理内存。

        Linux内存运行机制:
            2.1 Linux系统会不时的进行页面交换操作,以保持尽可能多的空间物理内存
            2.2 Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux内核根据“经常使用”算法,仅将一些不经常使用的页面文件交换到虚拟内存。
            2.3 交换空间的页面在使用时会首先被交换到物理内存,如果此时物理内存不足时,很快又会被交换出去。

                            total       used       free     shared    buffers     cached
    Mem:                  3.6G       1.2G       2.4G       532K       192M       803M
    -/+ buffers/cache:              205M     3.4G
    Swap:                 999M         0B       999M

    total: 物理内存的总大小used:已经使用的物理内存大小free:空闲的物理内存大小
    shared: 多个进程共享的内存大小
    buffers/cached:磁盘缓存的大小
    Swap: 表示交换空间内存使用状态
    -buffers/cache used内存数:58M (第一部分的Mem used - buffers - cached)
    -buffers/cache used内存数:165M (第一部分的Mem free + buffers + cached)

    Linux内存缓存机制:

        buffers和cached都是内存操作,用来保存系统曾经打开过的文件及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取。

        buffers:存放目录里面有什么内容文件的属性及权限等。
        cached:缓存我们直接打开过的文件内容和程序。

    Linux内存释放的过程:

        sync:sync命令运行sync子例程,将所有未写的系统缓冲区写到磁盘中,包括修改的i-node、已延迟的块I/O和读写映射文件。为确保可靠,需执行两次。

    3. 进程地址空间和虚拟存储空间

     (1) 早期的内存分配机制:
            在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算 机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。
            某台计算机总的内存大小是 128M ,现在同时运行两个程序 A 和 B , A 需占用内存 10M , B 需占用内存 110 。计算机在给程序分配内存时会采取这样的方法:先将内存中的前 10M 分配给程序 A ,接着再从内存中剩余的 118M 中划分出 110M 分配给程序 B 。这种分配方法可以保证程序 A 和程序 B 都能运行,但是这种简单的内存分配策略问题很多。

            问题 1 :进程地址空间不隔离。
            问题 2 :内存使用效率低。
            问题 3 :程序运行的地址不确定。
        (2) 分段:
            程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。
            当创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟进程地址空间。

            人们之所以要创建一个虚拟地址空间,目的是为了解决进程地址空间隔离的问题。但程序要想执行,必须运行在真实的内存上,所以,必须在虚拟地址与物理地址间建立一种映射关系。这样,通过映射机制,当程序访问虚拟地址空间上的某个地址值时,就相当于访问了物理地址空间中的另一个值。人们想到了一种分段 (Sagmentation)的方法。它的思想是在虚拟地址空间和物理地址空间之间做一一映射。

            这种分段的方法虽然解决了上述问题一,三但并没有解决问题二,即内存使用效率问题。在分段的映射方法中,每次换入换出内存的都是整个程序,这样会造成大量的磁盘访问操作,导致效率低下。所以这种映射方法还是稍显粗糙,粒度比较大。
            实际上,程序的运行有局部性特点,在某个时间段内,程序只是访问程序的一小部分数据,也就是说,程序的大部分数据在一个时间段内都不会被用到。基于这种情况,人们想到了粒度更小的内存分割和映射方法,这种方法就是分页。

        (3) 分页
            分页的基本方法是,将地址空间分成许多的页。每页的大小由 CPU 决定,然后由操作系统选择页的大小。目前 Inter 系列的 CPU 支持 4KB 或 4MB 的页大小,而 PC上目前都选择使用 4KB 。
            在分段的方法中,每次程序运行时总是把程序全部装入内存,而分页的方法则有所不同。
            分页的思想是程序运行时用到哪页就为哪页分配内存,没用到的页暂时保留在硬盘上。当用到这些页时再在物理地址空间中为这些页分配内存,然后建立虚拟地址空间中的页和刚分配的物理内存页间的映射。

        下面通过介绍一个可执行文件的装载过程来说明分页机制的实现方法。
            一个可执行文件 (PE 文件 ) 其实就是一些编译链接好的数据和指令的集合,它也会被分成很多页,在PE文件执行的过程中,它往内存中装载的单位就是页。当一个PE文件被执行时,操作系统会先为该程序创建一个 4GB 的进程虚拟地址空间。虚拟地址空间只是一个中间层而已,它的功能是利用一种映射机制将虚拟地址空间映射到物理地址空间,所以,创建 4GB 虚拟地址空间其实并不是要真的创建空间,只是要创建那种映射机制所需要的数据结构而已,这种数据结构就是页目和页表。

        总结:
            32 位的CPU 的寻址空间是4G , 所以虚拟内存的最大值为4G , 而windows 操作系统把这4G 分成2 部分, 即2G 的用户空间和2G 的系统空间, 系统空间是各个进程所共享的, 他存放的是操作系统及一些内核对象等, 而用户空间是分配给各个进程使用的, 用户空间包括用: 程序代码和数据, 堆, 共享库, 栈。

  • 相关阅读:
    Struts2 HelloWorld_1
    Java Web JavaMail 邮件发送
    Struts2 ActionWildcard(通配符配置)约定优于配置
    Struts2 Action
    Struts2 struts2简介
    Struts2 ActionMethod DMI(动态方法调用)
    Java Web Servlet过滤器
    com学习笔记(2)基本的com接口QueryInterface的实现
    com学习笔记(4)动态链接
    silverlight Visifire图表转图片偷天换日的做法
  • 原文地址:https://www.cnblogs.com/hukey/p/6064768.html
Copyright © 2011-2022 走看看