精华内容
下载资源
问答
  • 操作系统——存储管理:分区、分页、分段、请求式分页虚拟内存 1. 综述  突然把这么多概念弄到一起,让人有点儿困惑。自己的一些理解:  分区式管理:最简单直观的方式,内存分配一个区,将整个进程放入...

    操作系统——存储管理:分区、分页、分段、请求式分页和虚拟内存

    1. 综述

      突然把这么多概念弄到一起,让人有点儿困惑。自己的一些理解:

      分区式管理:最简单直观的方式,在内存中分配一个区,将整个进程放入这个区。缺点是会产生外碎片,即时间长了会在分区之间产生难以被利用的小空间。

      分页式管理:将内存分成固定大小的页,分配若干页将整个进程载入。页面可以不连续是其重要优点,不会产生外碎片,更有效地利用了内存,不过会产生一些内碎片,即分配给进程的最后一个页往往不能正好用完,不过在页面大小不是很大的时候可以接受。

      分段式管理:将程序分为若干个段,如数据段和代码段,加以不同的保护。施加保护是分段式的优点,但其仍是向分区式管理一样的连续分配。

      段页式管理:同样将程序分段,加以不同的保护,但是各段不再连续分配,而采用分页式离散分配。

      以上四种全是实存管理。即进程要么全部载入内存中,要么就不能载入。

     

    2. 请求式分页和虚拟内存

      请求式分页:将进程放入虚拟内存中,由于一个进程的页面不会同时全部被用到,只将需要用到的页面调入物理内存。即进程并没有整个在物理内存中。

      几个请求式分页的概念:(博客链接:请求式分页中的内存分配)

      固定分配:物理内存中分配给进程的内存块数一定。

      可变分配:物理内存先分配给进程一些内存块,如不够,可适当增加。

      局部置换:发生在分配的内存块已用完,又发生了缺页时,只能置换本来就是自己的内存块。

      全局置换:发生在分配的内存块已用完,又发生了缺页时,可以置换到操作系统保留的空闲页。这其实相当于增加了进程占有的内存块数。

      三种分配方式:固定分配局部置换、可变分配全局置换、可变分配局部置换。固定分配、全局置换不能组合。

     

    转载于:https://www.cnblogs.com/yongheng20/p/5869359.html

    展开全文
  • 分页式内存管理:将内存分成固定大小的页,一般是4k,将程序按页分切割。分配给程序的页可以物理上不连续,不会产生外部碎片,但是最后一个页的4k不一定用的完,就会产生内部碎片。 分段式内存管理:将程序按照数据...

    内存访问

    分区式内存管理:将整个程序一次性加载到内存的一个区域中。会产生区外无法利用的外部碎片。

    分页式内存管理:将内存分成固定大小的页,一般是4k,将程序按页分切割。分配给程序的页可以物理上不连续,不会产生外部碎片,但是最后一个页的4k不一定用的完,就会产生内部碎片。

    分段式内存管理:将程序按照数据段和代码段在不同的安全级别上进行划分若干段,每一段分配连续的物理内存。

    段页式内存管理:在分段式的基础上,对每一段进行分页,使物理地址离散。

    上述内存访问都是进程全部加载到内存中。。。

    请求式分页和虚拟内存:请求式分页式将进程放到虚拟内存中,由于程序的局部性原理,只需要将用到的页面调入物理内存。

    概括:

    分页式:提高了内存利用率

    分段式:便于管理员/编译器对内存进行管理

    段页式:结合上述两种方式的优点

    展开全文
  • 内存区域划分: 地址:通常所说的地址,都是内存的地址,...实际上进程,程序访问的地址是虚拟地址。我们所说的程序地址空间叫做进程的虚拟地址空间。进程访问内存数据的时候,先将虚拟地址转化为物理地址然后访问

    内存区域划分:
    在这里插入图片描述
    地址:通常所说的地址,都是内存的地址,是内存单元的编号。程序运行时,就会将指令和数据放到指定的内存当中去。而程序只有在运行的时候才会占据内存,因此程序地址空间又被叫做进程地址空间

    我们来看一段代码:
    在这里插入图片描述我们都知道,一块内存空间只能存储一个数据不可能存储两个数据,并且地址空间相同,所指向的数据就一定相同,但是为什么上面地址相同,所指向的数据却不同,是内存分配错误吗?

    实际上在进程中,程序访问的地址是虚拟地址。我们所说的程序地址空间叫做进程的虚拟地址空间。进程访问内存数据的时候,先将虚拟地址通过页表映射转化为物理地址然后访问
    在这里插入图片描述创建子进程会复制父进程大部分的pcb,也会复制虚拟地址空间和页表,所以刚开始父进程和子进程通过页表映射,会映射到同一块物理地址,但是当子进程的数据要发生改变时,系统会重新为子进程开辟一块空间,此时虽然父子进程的g_val虚拟地址相同,但是页表映射的物理地址不同。

    虚拟地址空间实际上是系统给进程所描述的一个假的地址空间,是一个mm_struct结构体,并且每个进程都有自己独立的虚拟地址空间,也就是每个进程都有自己的mm_struct结构体描述。

    系统为每个进程都描述一个完整的、连续的虚拟地址空间,实际物理内存用的时候再给进程分配。这样的话,对于每个进程自己感觉都有一块完整的、连续的内存可以使用。

    为什么我们不能直接访问物理内存?

    设想,如果我们有16M物理内存空间,系统为每个进程描述一个完整的、连续的空间,内存中有4M和8M的进程,现有一个5M的进程,要被加载到内存中运行。4M进程已经运行完,可以拿出内存,8M进程还在继续运行,现在内存碎片加起来足够5M,但是进程需要连续的空间,内存中没有连续的5M,此时5M进程就不能被加载到内存中运行,只能等8M进程运行完,5M才能被加载到内存,这样不仅浪费了内存,运行效率也会降低。
    在这里插入图片描述
    系统为每个进程描述一块完整的、连续的虚拟地址,若这个虚拟地址可以通过页表映射到物理地址,映射到的物理地址可以不连续,只要物理内存有空间存储,这样就可以将内存碎片利用起来,就实现了数据在物理内存上的离散式存储,可以提高内存利用率

    另一方面就是访问的安全性。如果一个进程中有恶意程序,若直接访问物理内存,可能会篡改其他进程的数据,这样其他进程就会崩掉。但虚拟地址通过页表进行映射,页表中会有内存访问控制,映射的过程中会查看此进程是否有访问权限等信息,这样就会提高访问的安全性。

    总结:

    虚拟地址空间,是系统为每个进程通过mm_struct结构体虚拟的一个地址空间,使用虚拟地址空间的目的是为了让进程能够访问一块连续的、完整的地址,并且经过页表映射到物理内存后,可以实现数据在物理内存上的离散式存储,提高内存利用率,并且在页表中可以进行内存访问控制,让进程更加安全。

    虚拟地址如何通过页表获取物理地址—内存管理方式

    分段式内存管理: 将地址空间分为多段(代码段、数据段…),便于编译器进行地址管理。

    分段式虚拟地址组成:段号+段内的偏移地址;在系统中有一个段表:一个个段表项(段号,物理内存起始地址)

    段内偏移:具体一个变量首地址相对于内存起始段地址的偏移。
    在这里插入图片描述通过虚拟内存地址段号从段表中找出对应的段号,再通过对应的物理内存起始段地址映射到物理内存,再通过虚拟内存的段内偏移找到唯一的物理地址。

    分页式内存管理: 将地址空间分为多个小块(页),实现数据离散式存储,提高内存利用率。

    分页式虚拟地址组成:页号+页内偏移;系统中有一个页表(页号,物理内存块起始地址、权限控制、缺页中断位…)
    在这里插入图片描述与分段式内存管理相似,通过虚拟内存的页号找到页表的对应页号,再通过对应物理起始块地址映射到物理内存,再通过虚拟内存的页内偏移找到唯一的物理地址。

    假设物理内存大小为4G,页的大小为4096字节,页数为4G / 4096 = 2^20,意味着页号占了虚拟地址的高20位,低12位就是页内偏移。

    段页式:将虚拟地址空间进行分段,在每个分段内进行分页式管理,集合了分段分页的优点进行内存管理。

    缺页中断:

    磁盘有两种分区:交换分区(swap)、文件分区(filesystem)
    交换分区:当物理内存不够用的时候,将物理内存中不活跃的数据,交换到磁盘的交换分区上,腾出内存用于新的数据处理。交换分区只有一个。
    文件分区:用来进行磁盘文件存储。文件分区可有多个。

    缺页中断:当我们通过虚拟地址访问物理内存的时候,发现数据没有在物理内存中,被交换到交换分区中,则触发缺页中断,通过内存置换算法,重新将数据加载到内存中。

    LRU----最近最久未使用置换算法

    基本思想:置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理,刚被访问的页面,可能马上又要被访问;而较长时间内没有被访问的页面,可能最近不会被访问。

    展开全文
  • 程序是不占用内存的,存储磁盘,只有当运行时才会将数据载入内存中。进程的狭义概念是一个正在运行的程序(进程详解看上一篇博客),因此进程是有地址空间的。 进程虚拟地址空间 假设现在有一个进程,它有一个...

    平时我们都知道地址,是内存单元的编号,指针则是存储变量地址的变量。
    那么程序是否会有地址呢?程序是不占用内存的,存储在磁盘中,只有当运行时才会将数据载入内存中。进程的狭义概念是一个正在运行中的程序(进程详解看上一篇博客),因此进程是有地址空间的

    进程虚拟地址空间
    假设现在有一个进程,它有一个变量a=100,此时我们创建一个该进程的子进程,子进程的一个特点是代码共享,数据独有。
    然后在子进程中修改a的值为1,然后运行

    int main()
    {
    
            pid_t pid=fork();
            int a=100;
            if(pid==0)
            {
                    a=1;
                    printf("a=%d \n",a);
                    //printf("Pa=%d \n",&a);
            }
            else
            {
                    printf("a=%d \n",a);
                    //printf("Pa=%d \n",&a);
            }
            return 0;
    }
    
    

    运行结果如下,a的值在子进程中确实发生了改变
    在这里插入图片描述
    那么,这两个进程中的a的地址是否相等呢?
    在这里插入图片描述
    两个进程中a的地址是相同的,但是同一块内存空间是不能同时存放两个相同的值的,数据不同,说明这两个进程中的a的地址肯定不是同一块内存空间,那么为什么终端显示上显示这两个a的地址相同呢?

    实际上进程访问的地址都是虚拟地址,而我们常说的进程地址空间其实是进程的虚拟地址空间。

    如何虚拟一个内存空间?
    在LINUX系统下,虚拟地址空间实际上是一个 mm_struct的结构体,是对一块内存空间的描述,通过这个描述向进程虚拟出一个连续的,完整的内存空间。
    如下图:在这里插入图片描述
    为什么需要虚拟地址?

    为了让进程不直接访问物理内存
    如过进程直接访问物理内存:
    1.进程中的代码数据使用的是连续的地址空间,如果直接使用连续的物理内存会造成内存浪费。
    2.直接访问物理内存会因为缺乏内存访问控制而导致进程的不安全

    如何通过虚拟内存访问物理内存?
    操作系统在为进程创建一个虚拟地址空间的时候,同时也创建了一个页表用于映射虚拟内存与物理内存的关系。

    再回到上面的那个问题,在创建子进程的时候,其实就是复制父进程的PCB,同时父进程的虚拟地址空间也会被复制过去,因此在终端上显示的地址值才会是相同的,但实际上在物理内存中,当子进程中的a发生改变的时候,操作系统已经在内存上开辟了一块新的空间,用于这个改变后的a的数据存储,然后页表中关于a在物理内存上的映射也会改变到新开辟的内存空间上。
    这种方式也被成为写时拷贝技术

    写时拷贝技术:两个进程一开始指向同一块空间,等待发生改变的时候,再给子进程重新开辟空间
    目的是提高子进程的创建效率。

    使用虚拟地址可以实现数据在内存上的离散式存储,提高内存利用率。
    并且可以在页表中实现内存访问控制。

    虚拟地址空间:操作系统向进程通过 mm_struct结构体描述的一个虚假的,连续的,完整的地址空间。

    三种内存管理方式:

    分页式内存管理

    分页式内存管理的虚拟地址组成:页号+页内偏移
    页号:页表中页表项的编号。
    页内偏移:具体一个变量首地址相较于内存页起始位置的偏移量。

    页表主要功能:映射虚拟地址与物理地址的关系/提供内存访问控制

    访问方式:通过虚拟地址中的页号和页内偏移通过页表找到进程中数据在物理内存上的位置。

    页表组成如下:

    页号 物理块号
    2 5
    1 6
    0 7

    物理内存块号*物理内存块大小+虚拟地址中偏移量=物理内存地址

    假设内存大小为4G,页大小是4096字节,则意味着页号的位是虚拟地址的高二十位,低十二位为页内便宜。
    (4G=2^32, 4096=2^12, 4G/4096=2^20)

    分页式内存内存管理的优点:将物理内存进行分块管理,通过页表映射虚拟地址与物理内存关系实现数据的离散式存储,提高内存利用率。

    分段式内存管理

    虚拟地址组成:段号+段内偏移

    访问方式:通过段表映射进程数据集在物理内存中的位置

    段表

    段号 物理段起始地址

    进程首先通过虚拟地址中的信息找到段号,通过段号在段表中找到在物理内存中的起始位置,然后加上段内偏移,就可以得到进程中某个数据集的物理内存地址。

    优点:使程序员对内存的管理更加方便,将内存段分为了代码段,初始化全局段等等段,什么变量就在什么段申请空间。

    段页式内存管理

    顾名思义,就是将分页式与分段式结合起来的一种内存管理方式。

    虚拟地址组成:段号+段内页号+页内偏移
    段表:段号 段内页表起始地址
    页表:页号 物理块号

    访问原理:先将进程数据分成若干段,为每个段进行命名,再将若干段分成若干页

    访问方式:进程首先是通过自己的分段找到在段表中相应的段号,然后通过该段表项找到页表始址,通过页表项中的物理块号和页内偏移访问物理内存空间。
    在这里插入图片描述

    以上三种内存管理方式
    分页式:提高了内存利用率
    分段式:便于管理员/编译器对内存进行管理
    段页式:结合了以上两种方式的优点

    展开全文
  • 操作系统之分页式内存管理1

    千次阅读 2015-03-10 10:27:33
    1.分页内存管理的核心就是:页面的翻译。 对于任何一个虚拟页面,系统要知道该页面是否物理内存?如果的话,对应的物理页面是哪一个?如果不,就会产生一个缺页中断,并将该虚页从磁盘转到内存,然后将分配...
  • 虚拟内存 分页

    2015-10-11 16:51:27
    虚拟内存 分页昨天参加XX头条笔试,关于内存管理的两道题,赞。 原题: 程序读取数据时为什么用虚拟地址,而不直接用物理地址? 为什么要分页? 第1题:我当时想,是啊,为什么不直接用物理地址,用虚拟地址还要...
  • 进程运行时不用的,或暂时不用的,或某种条件下才用的程序和数据,全部驻留于内存中是对宝贵的主存资源的一种浪费,大大降低了主存利用率。 于是,提出了这样的问题:作业提交时,先全部进入辅助存储器,作
  • 虚拟地址空间进行分段,(代码段/数据段、堆、栈、参数、环境变量),根据使用一个空间的性质,不同的分段,分配虚拟地址,有助于编译器的内存管理 虚拟地址的组成:段表 + 段内的偏移量 操作系统有一个...
  • 内存是用于存放数据的硬件,程序执行前需要先放到内存中才能被CPU处理 进程执行的原理 逻辑地址和物理地址 三种装入方式 绝对装入(单道程序阶段,此时还没有产生操作系统) 编译,链接后得到的装入模块的指令...
  • 先说下什么是页(页面):就是将用户的程序的的地址空间分成固定大小的区域,称为”页“,或者”页面...第5章虚拟存储器,学习了请求分页式管理方式(除了解决碎片问题外,又“扩充”了内存的大小(虚拟)) ...
  • 一、虚拟内存分页式内存管理 1、分页式内存管理的基础: 把进程的相对地址空间,或者说逻辑地址空间,等分成若干个大小相等的块,称为页,页的大小一般不大4k,2k或者1k。 那么页的大小决定了我们将来内存...
  • 之所以会先学OS里面的...那关于分配与回收这个问题,咱们之前介绍了一系列的呃传统的内存管理方案,包括基本分页基本分段,基本断页,还有什么固定分区,动态分区等等一系列的存储管理方式,那这些传统的存储管...
  • 在分页存储管理方式,如果不具备页面对换功能,则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。 虚拟内存技术 即拿出一...
  • 文章目录虚拟内存的基本思想进程运行内存模型分页段页存储分页和分段的区别 虚拟内存的基本思想 按照固定大小将进程的地址空间分为多个页面,每一个页面内部都有连续的地址.这些页被映射到物理内存,但是并不是所有...
  • 逻辑地址(Logical Address) 逻辑地址是指程序产生的与段相关的段内偏移地址。 例如,C语言编程读取的指针变量本身的值就是逻辑地址(也就是程序可以看到的... 这是应用程序可以看到的地址,分段和分页机制对应...
  • 页面置换算法最佳置换算法(Optimal,OPT)先入先出置换算法(First-In First-Out,FIFO) 最佳置换算法(Optimal,OPT) 最佳置换算法是一种理想化的算法。...【例题】一个分页式虚拟存储管理的系统,一
  • 内存管理虚拟分配

    千次阅读 2013-06-15 22:11:39
    分页内存分配和分段内存分配可以解决程序在内存中离散存放的问题,但是,这个两种方式都要求程序将整个装入内存。如果程序比内存大,那么分页和分段都无法解决这个问题。其实一个程序短时间内的执行可能局限于某小...
  • 引言:前面几篇笔记,我们介绍到内存管理的多种方式,包括单道编程下固定加载地址,多道编程下固定分区、非固定分区、分页式内存管理,这些是内存管理模式不断演进的过程,本篇笔记将介绍现今广泛使用的段页式...
  • 基于分页虚拟内存方案,通常每个进程都有一个唯一的页表,对应于每个进程都有自己的虚拟地址空间。 页表项的格式为: P位:由于一个进程可能只有一些页内存,因此每个页表项需要有一位(P)来表示它所...
  • ‘虚拟地址’如何通过页表获取到‘真实地址’(物理地址)的?...分页式虚拟地址组员:页号+页内偏移; 系统有一个页表(页号,物理内存块起始地址,权限控制,缺页中断位…) 段页式内存管理: 将虚
  • 1、实现分页式存储管理地址转换过程,将逻辑地址转换成物理地址。 2、此基础上实现请求分页的地址转换;实现请求页式地址转换出现的缺页现象,用到的先进先出、最近最久未使用、最佳置换算法。掌握内存的分配...
  • 操作系统第五章虚拟存储器练习题 一、选择题 1.段和页存储管理的地址结构很类似,但是它们有实质上的不同,以下错误的是(D) ...2、以下的存储管理方案,能扩充主存容量的是(D)  A.固定分区分配 ...
  • CPU的重要部件内存管理单元(MMU),负责虚拟地址到物理地址的转换。MMU将虚拟地址翻译为物理地址的主要机制有两种:分段机制和分页机制。 2. 段存储管理 段管理时,虚拟地址由两部分组成,第一个部分表示段号...
  • linux虚拟内存和物理内存 虚拟地址空间Linux整体架构图Linux虚拟内存系统内存管理分页式内存管理分段式内存管理段页式内存管理 虚拟地址空间 参考: ... 地址空间:非负整数地址的有序集合,如{0,1,2,...}\{0,1,2,...\...
  • 请求调页+页面置换 ...当进程运行需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。 2. 页...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 177
精华内容 70
关键字:

在分页式虚拟内存管理中