zoukankan      html  css  js  c++  java
  • coursera 《现代操作系统》 -- 第七周 存储模型(1)

    虚拟地址

    隔离进程,便于管理。

    问:为什么不直接划分物理地址为一块一块,直接管理,而要做一层虚拟地址的映射呢?

    栈和堆

    Differences between Stack and Heap

    Stack is used for static memory allocation and Heap for dynamic memory allocation, both stored in the computer's RAM .

    Variables allocated on the stack are stored directly to the memory and access to this memory is very fast, and it's allocation is dealt with when the program is compiled. When a function or a method calls another function which in turns calls another function etc., the execution of all those functions remains suspended until the very last function returns its value. The stack is always reserved in a LIFO order, the most recently reserved block is always the next block to be freed. This makes it really simple to keep track of the stack, freeing a block from the stack is nothing more than adjusting one pointer.

    Variables allocated on the heap have their memory allocated at run time and accessing this memory is a bit slower, but the heap size is only limited by the size of virtual memory . Element of the heap have no dependencies with each other and can always be accessed randomly at any time. You can allocate a block at any time and free it at any time. This makes it much more complex to keep track of which parts of the heap are allocated or free at any given time.

    stack-heap

    You can use the stack if you know exactly how much data you need to allocate before compile time and it is not too big.You can use heap if you don't know exactly how much data you will need at runtime or if you need to allocate a lot of data.

    In a multi-threaded situation each thread will have its own completely independent stack but they will share the heap. Stack is thread specific and Heap is application specific. The stack is important to consider in exception handling and thread executions.

    伙伴系统

     

    设计思路:

    每次分配的时候,我们不要把一个大的空闲块拿来给它分割 拿一个比较合适的空闲块,这样的话系统中可以始终保持一些大的空闲块。

    合适的空闲块:

    内存管理方案

    目的/最佳

    内存利用率最大

    页式 

    设计思想

    逻辑地址

    由页号、页内地址组成

    通过页表进行地址转换

      页号、页内地址的用法

    页表起始地址保存

    在系统中只设置一个页表寄存器PTR(Page-Table Register),在其中存放页表在内存的始址和页表的长度。平时,进程未执行时,页表的始址和页表长度存放在本进程PCB中。当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。

          

         段式

          设计思想

          

    段式的逻辑地址    

    不是自动划分,必须显式给出

    段式的逻辑地址准换

    与页式的计算方式一样

     

    总结段式与页式

    最小单位不同。一个是段,一个是页

    段与页

    不同:页的大小固定,而段的大小根据程序来划分,不是固定的;逻辑地址都是相邻的;

    相同:段与页在内存中都是连续的;不同段或不同页之间在物理内存中可以是不相邻的

     

    段页式管理

    转换

    先拿到了一个逻辑地址 然后呢,这个逻辑地址是由两部分组成,段号和段内地址 那么它用段号去查段表,得到了所对应的页表的起始地址和长度 然后再把段内地址自动划分成两部分 页号页内地址,用页号去查对应的页表,得到 页框号,然后再和页内地址拼接成最后的物理地址

    小结

    上述方案中是否存在最佳的内存管理方案?或者说各个内存管理方案适用于什么情况?

    那么Linux, windows使用哪种内存管理方案?

    错题:

    9。

    [多选题]下列关于地址重定位的叙述中,哪些是正确的?

    地址重定位又称为地址转换或地址映射

    动态地址重定位是在进程执行过程中完成的

    用户进程中使用的是逻辑地址,且从0开始编址

    内存的地址是按照物理地址编址的

    静态地址重定位的完成过程必须有硬件支持

    问:内存的地址是按照物理地址编址的

    这个表述的什么意思?虚拟地址按照物理地址编址的?

    [多选题]下列关于紧缩技术的叙述中,哪些是正确的?

    紧缩技术可用于可变分区存储管理方案

    紧缩技术不能解决内碎片问题

    内存中任意一个进程都可以随时移动

    完成紧缩会增加处理器的开销

    紧缩技术可以合并分散的小空闲区,以形成大的空闲区

    在可变分区管理方式下,在回收内存时,若已判断出“空闲区表中某一表项的起始地址恰好等于被回收分区的起始地址与长度之和”,则表示

    被回收分区既有上邻空闲区,又有下邻空闲区

    被回收分区有上邻空闲区

    被回收分区无相邻空闲区

    被回收分区有下邻空闲区

    这个答案是错的,不知道为什么?


    系统为某进程分配了4个页框,该进程已经完成了下列页号序列的访问:

    3,1,3,10,4,5,3,8,3,4,9,5,6

    假设该进程要访问的下一个页号是8,根据最近最少(LRU)页面置换算法,应该被淘汰的页的页号是

    9

    5

    3

    4

    解析:
    只有4个页框,但需要访问的页号大于4个,那么是怎么做到的呢?
    原文见书 P107
     
    页面:虚拟地址空间按照固定大小划分为页面
    页框:在物理内存中对应的单元称为页框。
    页号:页号是虚拟的。虚拟页号可以用作页表的索引,以找到该虚拟页面对应的页表项。由页表项可以找到页框号。然后把页框好拼接到偏移量的高位端,替换掉虚拟页号,
    形成物理地址。(具体如何工作见书 P108)。
     
    了解了概念之后,回到问题本身。当发生缺页中断,并且没有剩余的可用页框时,需要进行置换。
     
    LRU算法
    书P116
    置换未使用时间最长的页面。
    完全实现方式:内存中维护一个链表,每次访问就更新链表,将访问的移动到链表头部。
     
    19 有一台32位的计算机,每个页面的大小是4KB,如果一个进程在它的虚拟内存中实际使用了1024个页面。(可以认为每个页表项占据4个字节)

    假设使用一级页表,那么该进程的页表大小是多少?

    4KB

    4MB

    32KB

    32MB

    解析:

    P108 3.3.2 页表

    页面大小、页面数

    地址分为两部分,表示虚拟页号的高位部分以及表示对应虚拟页号的偏移量(低位部分)。比如,对于16位的地址,假设页面大小为4K。那么低位部分就为4K,也就是12位,剩余的16-12=4位

    就是高位部分,表示虚拟页号。

    一级页表

    一个虚拟页面号对应一个页框。虚拟页面号通过页表项找到页框的地址。所以一个虚拟页面号也就对应一个页表项。

    页表大小

    页表项大小 * 页表项个数

    对于本题来说,1024 * 4 = 4 MB

    20 

    题干同19题。如果采用二级页表,且一级页表的大小和二级页表的大小相同(假设一级页表大小是1KB,则一个二级页表的大小也是1KB;假设一级页表大小是2KB,则一个二级页表的大小也是2KB),

    那么该进程的两级页表加起来,至少占据____KB?

    二级页表

    书P111

    看书上的概念糊涂了,这里总结一下。

    一级页表是,由(页表号,偏移量)组成,页表号对应页框号;

    二级页表是,由(一级页表号,二级页表号,偏移量)。由一级页表号找到二级页表号和页框号。

    假如需要表达 10^30 个地址,一级需要 10^30 个页表项,二级需要 10^15 个,因为 10^15 * 10^15 = 10^30,三级需要 10^10个。

    本题中就需要 2^10/2 = 2^5 个页表项,就是 2^5 * 4 = 128 KB

    21 题干同19题。如果采用二级页表,且一级页表的大小是二级页表大小的四倍(假设一级页表大小是4KB,则一个二级页表的大小是1KB;假设一级页表大小是8KB,则一个二级页表的大小是2KB),

    那么该进程的两级页表加起来,至少占据____KB?

    上面提到,表示 1024个地址,二级页表需要 2^5 个页表项。那么这么多页表项这么分配到一级与二级页表呢?

    列出方程: x + y = 5; 求 4x + 2y 的最小值,当 x = 0 时最小,为 10 KB

    22 如果需要置换其中一个页面,若采用最近未使用(NRU)页面置换算法,将会置换哪一个页面?

    NRU 

    使用 R位和M位来构建的算法:当启动一个进程时,所有页面的两个位被置为0,R位被定期地清零,来区别最近没有访问的页面。当发生缺页中断时,开始检查所有页面并分类

    0:没有被访问,没有被修改

    1:没有被访问,已被修改(由3的R位置为0而来)

    2:已被访问,没有被修改

    3:已被访问,已被修改

    然后淘汰数字最小的页面。

    可以看出,算法偏向于最近被访问的页面,所以 2>1。

    思考:是如何检查所有页面的?如果是遍历,那么当发现 0 分类的时候,直接替换然后就可以终止检查了啊。

  • 相关阅读:
    Python学习笔记 for windows 二
    Socket.io:有点意思
    MEAN Stack:创建RESTful web service
    在EC2上安装MEAN环境
    NodeJS:树的序列化
    NodeJS:树的反序列化
    NodeJS学习:爬虫小探补完计划
    NodeJS学习:爬虫小探
    依赖包bcrypt安装Issues
    Mongoose:Schema之路
  • 原文地址:https://www.cnblogs.com/jay54520/p/6596400.html
Copyright © 2011-2022 走看看