修改物理页面内存属性_操作系统(二)—内存管理

c52bb7068963a11b6137f7f4f4d74e49.png

引言

文章很长,慎入⊙﹏⊙,可以收藏了慢慢看~

文章导读

  • 内存管理简介
  • 连续内存分配(首次适配,最佳适配,最差适配)
  • 非连续内存分配(分段,分页)
  • 虚拟内存技术
  • 页面置换算法(OPT,FIFO,LRU,Clock,LFU,工作集页置换算法,缺页率置换算法)

一、内存管理简介

1.1 管理内存的方法

  • 程序重定位
  • 分段
  • 分页
  • 虚拟内存
  • 按需分页虚拟内存

实现依赖于硬件
MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求。

1.2 地址空间&地址的生成

物理地址空间
硬件支持的地址空间(主存和磁盘)。

逻辑地址空间
一个运行的程序所拥有的内存范围。

1.3 逻辑地址与物理地址的转换

1.ALU需要某个逻辑地址的内存的内容。
2.内存管理单元(MMU)寻找在逻辑地址和物理地址之间的映射;如果没有就从内存中找。
3.控制器从总线发送在物理的内存内容的请求。
4.内存发送物理地址内存给CPU 。

具体步骤2是怎么建立逻辑地址和物理地址的映射,是如何查找的就是靠操作系统完成的。

二、连续内存分配

内存分配分为连续内存分配和非连续内存分配。首先看下连续内存分配,在内存分配的过程中会产生一些内存碎片,先了解一下内存碎片的概念。

  • 外部碎片:在分配单元间的未使用内存。
  • 内部碎片:在分配单元中的未使用内存。

连续内存分配算法有首次适配最佳适配最差适配

首次适配思路
1.按地址排序的空闲块列表。
2.分配需要找到一个合适的分区。
3.重分配时需要检查,看是否自由分区能合并于相邻的空闲分区。

优点:简单;易于产生更大空闲块。
缺点:外部碎片;不确定性。

最佳适配思路
为了分配n字节,使用最小的比n大的可用空闲块。
1.按尺寸排列的空闲块列表。
2.分配需要寻找一个适合的分区。
3.重分配需要搜索及合并于相邻的空闲分区。

优点:当大部分分配是小尺寸时非常有效;比较简单。缺点:外部碎片;重分配慢;易产生很多没用的微小碎片。

最差适配
和最佳适配思路相反。为了分配n字节,使用最大可用空闲块,尽可能保证空闲块是最大的。1.按查村排列的空闲块列表。
2.分配很快。
3.重分配需要合并于相邻的空闲分区,调整空闲块列表。

优点:每次分配是中等尺寸效果最好。
缺点:重分配慢;外部碎片;易于破碎大的空闲块以至大分区无法被分配。

可以看出,在连续的分配算法下难免会产生一下碎片,只要这些进程存在,这些碎片真的就无法利用吗?针对于这个问题,有两种解决内存碎片的思路:

  • 压缩式碎片整理
    将等待中的程序进行内存的挪动,减少外部碎片的出现。
  • 交互式碎片整理
    当运行程序需要更多的内存时,可以回收等待的程序的内存,将其挪到磁盘中(虚拟内存)。

注:上述所说的内存都是物理内存。

三、 非连续内存分配

对于内存的连续分配,总是会有碎片的产生,内存利用率低,而且执行碎片整理的方法也都是有开销的。因此,非连续内存分配就能很好的解决碎片问题,也是操作系统中用的最多的内存分配方法。

非连续内存分配基本算法有分段分页

虽然非连续分配的好处挺多,但在实现上也有一些问题,比如如何建立虚拟地址和物理地址之间的转换?

这就是后序要磕的分段和分页及映射表的设计。

3.1 分段

逻辑地址=s(段号),o(段内偏移)
段表=s(段号),限制(段长),基址

分段有两种实现方案:

  • 段寄存器+地址寄存器实现方案。
  • 单地址实现方案。

简单看一下段寄存器+地址寄存器是如何找到逻辑地址对应的物理地址的。

01e3c9be62acc24aa4a80f9db9e25751.png

过程:
1.首先判断逻辑地址的段号s是否超过段表寄存器中的段表长度,如果超过则会产生越界异常。
2.如果不超过则去段表中找到对应的段号(段表始值+段号)。
3.判断偏移o是否超过段长,不超过则找到对应的基址+偏移得到物理地址。
4.这个物理地址就是要访问的主存地址了。

在分段管理的过程中,段长不是固定的。如果是单地址实现方案则更加简单,没有段表寄存器。直接拿逻辑地址中的段号去段表中查,其他步骤和上述一样。

3.2 分页

绝大部分CPU采用分页机制。首先需要划分物理内存至固定大小的帧,划分逻辑地址空间至相同大小的页,然后需要借助页表和MMU/TLB。
先看一下几个关键的概念~

物理地址的寻址方式:
物理地址是通过逻辑地址和页表换算出来的。
f(帧号,F位,共2^F个帧),o(帧内偏移,S位,每帧2^S字节)
物理地址=

逻辑地址的寻址方式:
页内偏移的大小=帧内偏移的大小。
p(页号,P位,2^P个页),o(页内偏移,S位,每页有2^S字节)
逻辑地址=

页表
每个运行的程序都有一个页表。属于程序运行状态,会动态变化。
PTBR是页表基址寄存器。
页表是页号和一些标志位及帧号的映射。

下面这个思路是最容易想到的,也是有点小bug的路子。

63cdf64c2150864f1ff9f84b5950f2dc.png

其实大体上和分段是一样的,区别在于页号上可能会有标志位,比如判断权限,是否在内存中。因为逻辑地址可能大于物理地址,这些标志位将在后序的虚拟页式内存管理中讲解。

如果按上述思路来实现,对于一个地址的转换,至少需要访问两次内存。一次是访问页表寻找帧号,一次是访问帧号对应的物理内存。如果计算机64位,一页为1024字节,就需要

字节大小的页表。而且一个进程建立一个页表,内存是一定不够用的。对于空间的代价也是很大的,但是最理想的状态是让
空间代价,时间开销最小

为了解决这个问题,操作系统可以利用CPU的cache对页表做一个缓存,但是cache非常小,所以可以存一些经常访问的页表映射。

页表的缓存
MMU(内存管理单元)中有一个TLB对于页表的缓存,一般存一页数据,是近期访问的页帧转换表项的缓存(这也是后序页面置换算法的参考点)。key->p;value->f。
注:p是页号,f是帧号,后序都用这两个字母表示。

a899b24bf751fc85c3fdc8e21e791029.png

如果TLB命中,物理页号可以很快被获取;如果TLB未命中,对应的表项被更新到TLB中。

多级页表
解决了时间的开销,再看看空间的代价。由于逻辑地址空间很大,所以需要很大的页表,为了使页表所占的空间变小,所以可以使用多级页表。

可以将页表中的页号细化,分为p1,p2。每级页表都存储下一级页表的索引,n级页表一次类推。下面是二级页表的寻址过程:

b1aba12250b371d3289c56ef86574553.png

3.3 分页和分段的区别

(1)页是信息的物理单位,分页是为了减少内存碎片,提高内存利用率。分页仅仅是由于系统管理的需要,而不是用户的需要。段是信息的逻辑单位,它包含一组意义相对完整的信息。分段的目的是为了能更好地满足用户的需要

(2)页的大小固定且由系统确定,逻辑地址的划分是由寄存器实现的,因而一个系统只能有一种大小的页面。段的长度不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分

(3)分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需要利用一个记忆符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名又需给出段内地址

此处引用操作系统第六篇【存储器管理】

四、 虚拟内存

当前内存不够进程分配时,操作系统会怎么解决。此时,虚存技术就很关键,在虚存技术出来前,用得最多的是覆盖技术和交换技术。覆盖技术
在较小的内存中运行较大的内存,将没有调用关系的程序放在一个分区。

48632c12deeb60c33d4d9579e1e98be6.png

B,D,E没有调用关系,也就是说,在调用B时,不可能同时调用D或E,所以共享一个覆盖区。早期用这个技术来节约内存。
缺点:有程序员来把一个大程序划分位若干个功能莫尽快,确定模块之间的覆盖关系,增加编程复杂度;覆盖模块从外存装入内存,是以时间换空间。

交换技术
将暂时不能运行的程序送到外存,从而获得空闲内存空间。粒度是一个程序,需要操作系统支持,对程序员透明。

缺点:以进程作为交换单位,需要把进程整个地址空间都换进换出,增加的处理器的开销。

覆盖与交换的比较

(1)覆盖只能发生在那些相互之间没有调用关系的程序模块之间。
(2)交换技术是在以内存中的程序大小为单位来进行的,一般一页以上。不需要程序员给出各个模块之间的逻辑覆盖结构。

覆盖和交换都有它的局限性,覆盖过于麻烦,而交换的粒度太大,以程序为单位。可以不可以把暂时不用的程序模块放到硬盘,把这一切都交给操作系统赋予特定的算法去完成呢?这就需要下面的虚存技术。

虚拟内存技术

把程序中的一部分放入到内存中,对程序员透明。可以根据内存的使用情况,动态的对程序部分内容在内存与外存中进行交换。

首先了解一下CPU的特性,程序的局部性原理:在程序执行过程中的一个较短时期,所有执行的指令地址和指令的操作地址分别局限于一定区域。

虚存技术的特征
1.大的用户空间,通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际内存空间,实现二者分离。
2.部分交换,调入调出都是对部分虚拟地址空间进行。
3.不连续性,物理内存分配的不连续,虚拟地址空间是哦那个的不连续

虚存技术的实现-虚拟页式内存管理

虚拟页式内存管理技术=页式内存管理+请求调页+页面置换功能。基本思路
1.当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可以启动程序。
2.在运行的过程中,如果发现要运行的程序或要访问的数据不再内存,则向系统发出缺页中断请求,系统在处理这个中断请求时,将外存中响应的页面调入内存,是程序能够继续运行。

页表=逻辑页号+访问位+修改位+保护位+驻留位+物理页帧号

下面挨个看看每个特征位:

驻留位
表示该页在内存还是外存。

保护位
允许对该页做何种类型的访问(只读,可读写,可执行等)。

修改位
表明此页是否被修改过。如果被修改过就会导致内存中和硬盘中的数据不一致,所以换入换出时需要保证数据的一致性。当系统回收物理页面时,根据此位来决定是否把它的内容写回外存。

访问位
该页面是否被访问过,用于页面置换算法。

有了这些,当页表中某个页号没有对应帧号时,会引发缺页中断,我们大概可以推测出缺页中断的流程

69c3f1d2a7e8941648b1737af2f7a3ac.png
图片来源于网络

1)如果在内存中有空闲的物理页面,则分配一物理页帧f,然后转4);否则转2)。
2)采用某种页面置换算法,选择一个将被替换的物理页帧f,如果对应的逻辑页位q,若在该页在内存中修改过,则需将其写回外存。
3)对q所对应的页表向进行修改,驻留位=0
4)将需要访问的页p转入到物理页面f中。
5)修改p所对应的页表项的内容,驻留位=1,把物理页帧置f。
6)重新运行被中断的指令。

那么,没有被映射的页是怎么被存储在硬盘的呢?
一般放在交换空间,以特殊的格式保存。代码段->映射到可执行的二进制文件。动态加载的共享库程序段->映射到动态调用的库文件。
其他段->可能被映射到交换文件。

还有一个问题,如果频繁发生缺页异常,进行页面置换,就会增加操作系统的开销。这里需要引入一个指标来描述虚存技术的性能-EAT(Effective Memory Access Time)。

EAT(使用有效存储器访问时间)=访存时间*页表命中率+缺页中断处理时间*缺页概率
从公式可以看出,缺页率越大,EAT越小,性能越差。基于程序的局部性特点,其实缺页率还是比较小的,这个其实跟程序代码的书写也有关系......

五、页面置换算法

采用什么样的置换算法对于缺页率的控制还是很关键的~

置换算法分为局部全局页面置换算法。

局部页面置换算法:

  • 最优页面置换算法(OPT)
  • 先进先出算法(FIFO)
  • 最近最久未使用(LRU)
  • 时钟页面置换算法(Clock)
  • 最不常用算法(LFU)

全局页面置换算法:

  • 工作集页置换算法
  • 缺页率置换算法

5.1 局部页面置换算法

最优页面置换算法(OPT)

思路:把将来最长时间不需要的页面置换。
该算法无法实现,但是会利用该算法作为参考,评价其他算法。

bbd023d42c03f58207569b170833d61d.png

如上图所示,当时间=4时,需要置换一页,此时看a,b,c,d在将来什么时候会被访问。a=6,b=5,c=7,d=8,因此置换d。

先进先出算法(FIFO)

思路:将内存中驻留时间最长的页面置换。其实就是维护一个队列,每次置换队头那页。
性能较差,调初的页面可能是经常要访问的页面,并且有Belady现象(类似于逆向优化的现,增加内存的大小,很难降低缺页率)。FIFO很少单独使。

Belady的产生原因
算法置换特征与程序访问内存的动态特征是矛盾的,所以置换出去的页面不一定是进程会访问的。

最近最久未使用(LRU)

思路:选择最久未使用的那个页面置换。是对最优页面置换算法的近似,根据过去推测未来。

操作系统具体可以用以下方法实现:

  • 维护一个链表,刚使用的放表头,最久未使用的作为尾节点。每次访问内存时,找到相应的页面,把它移到表头。发生缺页中断后,淘汰链表末尾的页面。
  • 设置一个活动栈,访问页面时,将次页号压入栈顶,将栈内相同的页号都删掉。每次总是置换栈底元素。

虽然这样会让缺页的次数比较少,但实现效率不高。

时钟置换算法(Clock)

利用页表中的访问位(Access Bit),初始化为0,每次访问后都会置为1,操作系统又定期将其变为0。

思路:当发生缺页中断时,若当前访问位==1则置0,指针向下走,直到遇到访问位==0的页面就进行置换;若当前访问位==0则置换该页,然后指针指向下一个地址。在这个过程中,指针类似于时钟往一个方向走。
下图就是对于时钟置换完整的复现过程。

96e3020d9b441ad8e11e73d3318ed22b.png

一开始,a,b,c,d在内存中,访问位初始化为0。每次访问,更新访问位,直到时间=5,第一次引发缺页中断,将当前访问位置0并向下走,遍历完回来,发现页面a访问位==0则替换a。后面的情况以此类推~
只有在发生缺页中断时,指针才会向下走。

二次机会法

二次机会法是对时钟置换算法的改进。
在置换的过程中,每次置换都需要先将当前页写回到磁盘。如果在内存中只是读操作,是不是可以减少这个写回的代价呢?

利用Dirty Bit(修改位),表示该页在内存中是否被修改过来指导置换。当内存中某个页被修改后,dirty bit会被置1。

思路:每次指针经过时,会将访问位置0,如果访问位已经为0,则将Dirty Bit置0。如果dirty bit已经为0,则直接置换该页。尽可能的让脏页在一次时钟中保留,也就是尽可能置换只读的页。

最不常用法(LFU)

思路:当缺页中断发生时,将访问次数最少的那个页面置换。

缺点:一个页面在一开始频繁访问,后续就不访问了。会导致内存利用率不高。

LRU,FIFO,Clock总结

  • LRU和FIFO本质上都是先进先出的思路,但LRU是针对页面最近访问时间来排序,每次对内存的访问都要排序而FIFO不需要。
  • 当内存中所有的页面都没被访问过时,LRU就退化为FIFO。
  • LRU算法性能好,但系统开销较大;FIFO系统开销小,但可能会发生Belady。而Clock算法就是他们的折衷,每次页面访问时不用调整页面在链表的顺序,而是用寄存器中原生的标记,等发生缺页中断时再维护链表。Clock性能和LRU差不多,但对于曾经访问过的页面不能记住他们准确的位置。

5.2 全局页面置换算法

局部页面置换算法的问题

操作系统给每个进程分配物理页帧时应该是有所顾虑的。物理页帧的大小会对最终的页面置换算法的缺页率有较大的影响。程序在运行的过程中,对内存的读取一定是动态的,对物理页帧的需求也是变化的,如果按固定的页帧来算,势必会影响程序的灵活性。如何按照程序的需求动态的分配物理页帧呢?下面需要先引入几个概念。

工作集模型

如果程序对内存的访问不满足局部性原理,则不管用什么置换算法,一定会导致缺页中断;如果局部性成立,对它进行定量的分析就可以用工作集模型。个人理解工作集模型就是根据窗口大小,确定工作集,描述内存访问规律的模型

工作集

单位时间内,访问的所有页面的集合。体现程序执行过程中,对页面访问的属性。

常驻集

在当前时刻,进程实际驻留在内存当中的页面集合。

工作集页置换算法

思路:随着时间和程序的运行,将不在工作集的窗口范围内的页面丢弃。

缺页率页面置换算法

工作集的窗口是固定的,能不能让它灵活的变化呢?

思路:若缺页率过高,则增加工作集,来分配更多的物理页面;若缺页率过低,则减少工作集。

设置一个时间段,当前缺页时间-上次缺页时间>时间段,则认为缺页频率低,可以减少给当前进程分配的页帧,从工作集中移除未在这个区间内访问的页面;当前缺页时间-上次缺页时间<时间段,则认为缺页率高,增加缺失的页面。

5.3 总结

影响缺页率的因素

  • 页面置换算法
  • 分配给进程的物理页面数目
  • 页面本身的大小
  • 程序的编写方法

局部和全局置换算法比较
(1)使用场景:如果程序对内存的需求是有规律的,则全局页面置换算法更有优势。
(2)执行时机:全局页面置换算法根据工作集,中断间隔来动态调整页面并且只有的中断时才会置换;局部页面置换算法是在当前内存满了才会执行。

5.4 抖动问题

当进程造成很多缺页中断时,需要频繁地在内存与外存之间替换页面,从而使进程的运行速度变慢,这种状态就是抖动。

当驻留内存的进程数增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。所以OS要选一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率之间达到一个平衡,提高CPU的利用率。

X轴表示当前有N个程序,Y轴表示CPU的利用率。

957c057bfd33a2122ab59a2d05f05fa2.png
图片来源于网络

深色(紫色)的曲线说明当程序越来越多,对CPU的利用率先增大;超过峰值后,则会频繁出现抖动的现象,以至于利用率不高。 浅色(蓝色)曲线表示平均缺页时间/缺页服务时间比值随程序的增加而减少。这个比值越大则说明操作系统进行页面置换,换入换出的时间越少,程序运行的时间越多。当其约为1时,就是比较好的平衡点,并发量比较不错,CPU利用率也比较高。

参考文章:操作系统第六篇【存储器管理】

如果看得不过瘾,可以戳:操作系统(三)—进程管理最后,如果喜欢我的文章,欢迎关注我的专栏~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入解析WINDOWS操作系统(第4版) ISBN:9787121039690 本书是著名的操作系统内核专家Mark Russinovich和David Solomon撰写的Windows操作系统原理的最新版著作,全面和深入地阐述了Windows操作系统的整体结构以及内部工作细节。本书针对Windows Server 2003、Windows XP和Windows 2000做了全面更新,通过许多练习实验让你直接感受到Windows的内部行为。另外,本书还介绍了一些高级诊断技术,以便使你的系统运行得更加平稳和高效。无论你是开发人员还是系统管理员,你都可以在本书找到一些关键的、有关体系结构方面的知识,通过这些知识你可以更好地做系统设计、调试,以及性能优化。 全书内容丰富、信息全面,主要包括的Windows操作系统深度知识有:理解Windows的关键机制,包括系统服务分发和调度机制、启动和停机,以及注册表;挖掘Windows的安全模型,包括访问控制、特权和审计;利用内核调试器和其他的工具来检查内部系统结构;检查与进程、线程和作业相关的数据结构和算法;观察Windows如何管理虚拟内存物理内存;理解NTFS的操作和格,诊断文件系统访问问题;从上往下查看Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断引导问题,执行崩溃分析。 本书适合广大Windows平台开发人员、IT专业从业人员等参考使用。 编辑推荐 ■ 国内知名译者潘爱民先生译作 ■ Windows系统之父Jim Allchin亲自撰文推荐! ■ Windows NT首席设计师David N. Cutler亲自撰文推荐! ■ 深入解析Windows操作系统!彻底揭开Windows技术内幕! ■ Csdn、博客堂、博客园、《程序员》杂志鼎力推荐! 目录第1章 概念和工具 1 1.1 Windows操作系统的版本 1 1.2 基础概念和术语 3 Windows API 3 服务、函数和例程 5 进程、线程和作业 6 虚拟内存 14 内核模和用户模 16 终端服务及多个会话 21 对象和句柄 22 安全性 23 注册表 24 Unicode 25 1.3 挖掘Windows内部机理 25 性能工具 27 Windows支持工具箱 27 Windows资源工具箱 27 内核调试 28 Platform SDK 33 DDK(设备驱动程序开发工具) 34 Sysinternals工具 34 1.4 本章总结 34 第2章 系统结构 35 2.1 需求和设计目标 35 2.2 操作系统模型 36 2.3 总体结构 37 可移植性 40 对称多处理 41 可伸缩性 46 客户和服务器版本之间的差异 47 检查版本 49 2.4 关键的系统组件 51 环境子系统和子系统DLL 53 硬件抽象层(HAL) 67 设备驱动程序 69 系统进程 75 2.5 本章总结 84 第3章 系统机制 85 3.1 陷阱分发 85 断分发 87 异常分发 109 系统服务分发 119 3.2 对象管理器 124 执行体对象 126 对象结构 128 3.3 同步 149 高IRQL的同步 151 低IRQL的同步 155 3.4 系统辅助线程 166 3.5 Windows全局标志 168 3.6 本地过程调用(LPC) 171 3.7 内核事件追踪 175 3.8 Wow64 178 Wow64进程地址空间布局结构 179 系统调用 179 异常分发 179 用户回调 179 文件系统重定向 180 注册表的重定向和反射 180 I/O控制请求 181 16位安装器应用程序 182 打印 182 一些限制 182 3.9 本章总结 182 第4章 管理机制 183 4.1 注册表 183 查看和修改注册表 183 注册表用法 184 注册表数据类型 185 注册表逻辑结构 186 注册表问题的诊断 192 注册表的内部机理 197 4.2 服务 211 服务应用 212 服务账户 217 服务控制管理器 223 服务启动 225 启动错误 229 接受当前引导和“最后已知的好控制集” 230 服务失败 231 服务停机 232 共享的服务进程 233 服务控制程序 236 4.3 Windows管理规范 237 WMI体系结构 237 提供者 239 公共信息模型(CIM)和可管理对象的格语言 240 WMI名字空间 243 类关联 244 WMI实现 247 WMI安全性 248 4.4 本章总结 249 第5章 启动和停机 251 5.1 引导过程 251 x86和x64引导准备 251 x86/x64引导扇区和Ntldr 255 IA64引导过程 264 初始化内核和执行体子系统 266 Smss、Csrss和Winlogon 269 自动启动的映像文件 273 5.2 引导和启动问题的故障检查 274 最后已知的好配置 274 安全模 274 安全模下的驱动程序加载 275 恢复控制台(Recovery Console) 279 解决常见的引导问题 281 5.3 停机 286 5.4 本章总结 288 第6章 进程、线程和作业 289 6.1 进程的内部机理 289 数据结构 289 内核变量 297 性能计数器 297 有关的函数 298 6.2 CreateProcess的流程 300 阶段1:打开将要被执行的映像 302 阶段2:创建Windows执行体进程对象 304 阶段3:创建初始线程,以及它的栈和执行环境 308 阶段4:将新进程通知Windows子系统 309 阶段5:启动初始线程的执行 310 阶段6:在新进程环境下执行进程初始化 310 6.3 线程的内部机理 313 数据结构 313 内核变量 320 性能计数器 321 有关的函数 322 一个线程的产生 322 6.4 检查线程活动 323 6.5 线程调度 325 Windows调度的概述 326 优先级别 327 Windows调度API 330 有关的工具 331 实优先级 333 线程状态 334 分发器数据库 338 限 340 调度情形 345 环境切换 347 空闲(Idle)线程 348 优先级提升 348 多处理器系统 357 多处理器的线程调度算法 366 6.6 作业对象 369 6.7 本章总结 374 第7章 内存管理 375 7.1 内存管理器简介 375 内存管理器组件 376 内部同步 377 配置内存管理器 378 检查内存的使用情况 378 7.2 内存管理器提供的服务 382 大页面和小页面 382 保留的和提交的页面 384 锁住内存 385 分配粒度 385 共享内存和映射文件 386 保护内存 388 “不可执行”页面保护 390 写复制 392 堆管理器 394 地址窗口扩展 399 7.3 系统内存池 401 配置内存池的大小 401 监视内存池的使用 404 预读列表(Look-Aside List) 408 驱动程序检验器(Driver Verifier) 409 7.4 虚拟地址空间的布局结构 413 x86用户地址空间的布局结构 415 x86系统地址空间的布局结构 417 x86会话空间 418 系统表项(PTE,Page Table Entry) 421 64位地址空间布局结构 422 7.5 地址转译 425 x86虚拟地址转译 425 地址转译快查缓冲区 434 物理地址扩展(PAE) 435 IA-64虚拟地址转译 437 x64虚拟地址转译 438 7.6 页面错误处理 439 无效PTE 440 原型PTE 441 页面换入I/O 443 冲突的页面错误 444 页面文件 444 7.7 虚拟地址描述符 448 7.8 内存区对象 450 7.9 工作集 457 按需换 458 7.10 逻辑预取器 458 放置策略 462 工作集管理 463 平衡集管理器和交换器 466 系统工作集 467 7.11 页面帧编号数据库 469 页面列表的动态变化 472 已修改页面写出器 475 PFN数据结构 476 低内存通知和高内存通知 479 7.12 本章总结 483 第8章 安全性 485 8.1 安全系统组件 488 8.2 保护对象 492 访问检查 493 安全描述符和访问控制 506 8.3 账户权限和特权 516 账户权限 517 特权 518 超级特权 523 8.4 安全审计 524 8.5 登录(Logon) 526 Winlogon初始化 528 用户登录步骤 529 8.6 软件限制策略 533 8.7 本章总结 535 第9章 I/O系统 537 9.1 I/O系统组件 537 I/O管理器 539 典型的I/O处理过程 540 9.2 设备驱动程序 541 设备驱动程序的类型 541 驱动程序的结构 548 驱动程序对象和设备对象 550 打开设备 555 9.3 I/O处理 561 I/O类型 561 映射文件I/O和文件缓存 564 I/O请求包 564 针对单层驱动程序的I/O请求 569 针对分层的驱动程序的I/O请求 577 I/O完成端口 585 驱动程序检验器(Driver Verifier) 589 9.4 即插即用(PnP)管理器 590 即插即用支持的级别 591 驱动程序对于即插即用的支持 592 驱动程序加载、初始化和安装 594 驱动程序安装 603 9.5 电源管理器 607 电源管理器的操作 609 驱动程序的电源操作 610 驱动程序对于设备电源的控制 613 9.6 本章总结 613 第10章 存储管理 615 10.1 有关存储的术语 615 10.2 磁盘驱动程序 616 Ntldr 616 磁盘类、端口和小端口驱动程序 617 磁盘设备对象 620 分区管理器 622 10.3 卷的管理 622 基本磁盘 624 动态磁盘 626 多分区卷的管理 632 卷名字空间 638 卷的I/O操作 646 虚拟磁盘服务 648 卷影像(shadow)拷贝服务 649 10.4 本章总结 654 第11章 缓存管理器 655 11.1 缓存管理器的关键特性 655 单个心化的系统缓存 656 内存管理器 656 缓存一致性 656 虚拟块缓存 658 流缓存机制 658 对可恢复文件系统的支持 658 11.2 缓存的虚拟内存管理 660 11.3 缓存的大小 662 LargeSystemCache 662 缓存的虚拟大小 663 缓存的工作集大小 665 缓存的物理大小 667 11.4 缓存的数据结构 668 系统范围的缓存数据结构 669 针对每个文件的缓存数据结构 670 11.5 文件系统接口 674 从缓存来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读(Read Ahead)和滞后写(Write Behind) 682 智能预读 682 回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 683 写节流(Write Throttling) 686 系统线程 687 11.8 本章总结 688 第12章 文件系统 689 12.1 Windows文件系统格 690 CDFS 690 UDF 691 FAT12、FAT16和FAT32 691 NTFS 694 12.2 文件系统驱动程序总体结构 694 本地FSD 695 远程FSD 696 文件系统操作 700 文件系统过滤型驱动程序 705 12.3 诊断文件系统的问题 711 Filemon的基本和高级模 711 Filemon诊断技巧 712 12.4 NTFS设计目标和特性 717 高端(High-End)文件系统的需求 717 NTFS的高级特性 719 12.5 NTFS文件系统驱动程序 729 12.6 NTFS在磁盘上的结构 732 卷(volume) 732 簇(cluster) 732 主文件表(MFT) 733 文件引用号 739 文件纪录 740 文件名 742 驻留的和非驻留的属性 744 数据压缩和稀疏文件 747 变化日志文件 752 索引 753 对象ID 754 配额跟踪 755 统一的安全性 756 重解析点 758 12.7 NTFS的恢复支持 758 文件系统设计的演变 759 日志记录 761 恢复 767 NTFS的坏簇恢复 771 12.8 加密文件系统(EFS)安全性 775 第一次加密一个文件 778 解密过程 783 加密文件的备份 784 12.9 本章总结 785 第13章 网络 787 13.1 Windows的网络总体结构 787 OSI参考模型 787 Windows网络组件 789 13.2 网络API 791 Windows套接字(Windows Sockets) 791 远过程调用 798 Web访问API 803 命名管道和邮件槽 804 NetBIOS 811 NetBIOS的操作 812 其他的网络API 813 13.3 多重定向器支持 815 多提供者转发器 816 多UNC提供者 818 13.4 名称解析 820 域名系统 820 Windows Internet名称服务 820 13.5 协议驱动程序 821 TCP/IP的扩展 824 13.6 NDIS驱动程序 828 NDIS小端口的变化形 832 面向连接的NDIS 832 外接NDIS(Remote NDIS) 835 QOS 836 13.7 绑定 838 13.8 分层的网络服务 839 远程访问(Remote Access) 839 活动目录 840 网络负载平衡 841 文件复制服务 843 分布文件系统 843 13.9 本章总结 844 第14章 崩溃转储分析 845 14.1 Windows为什么会崩溃 845 14.2 蓝屏 846 14.3 崩溃转储文件 849 崩溃转储的生成 852 14.4 Windows错误报告 853 14.5 在线崩溃分析 854 14.6 基本的崩溃转储分析 855 Notmyfault 855 基本的崩溃转储分析 856 详细的分析 858 14.7 使用崩溃诊断工具 860 缓冲区溢出和特殊内存池 861 代码改写和系统代码写保护 863 14.8 高级的崩溃转储分析 864 栈破坏 865 挂起的系统或无响应的系统 866 当没有崩溃转储 869 术语表 871 术语对照表 895 索引 901
内存盘软件 Qsoft Ramdisk Enterprise 的简单使用说明 这个……好像有些朋友需要,就写一下吧,其实,我觉得直接看英文的帮助文档就好了,里面写得比较详细的。 首先安装就比较麻烦:控制面板——添加硬件——手动安装,找到RAMDriv.inf所在的目录就行了。 下面就以官方帮助的截图为例子说明: [1]和[2]这个应该不用说明了,就是设定虚拟盘的盘符和容量大小,所有虚拟盘软件的基本功能。 [3]处是让软件来自动进行分配虚拟盘的大小,与[2]不同就是此处是按总内存的百分比来设置虚拟盘的容量,如果选取这个后,[2]处就无法设定了。其实两处的设定是一致的,区别只在于一个是按容量设置,而另一个是按总容量的百分比大小来设置罢了。若想手动调节其百分比的大小,可以拉动[6]处的滑动条。它是以32M为单位递进的,同理这个软件的所有滑动条都以32M为单位递进。 [4]和[5]应该合并到一处来说明。[4]按字面意思来讲是指“使用锁定内存”,其作用为当你选择后,系统将会把一部分内存容量保留出来,由虚拟软件进行管理,系统不再使用这部分内存,此,你在任务管理器的"性能选项卡"看到的内存总容量会小于实际容量,少的那部分就是你设置为锁定内存的容量,其大小可由后面的滑动条来设置,能设置的最大容量将由软件依据你的物理内存实际大小而定。帮助文档提到:在Win2000系统由于稳定性问题不建议选择此设置。[5]是"使用常驻内存",选择后,系统将与软件共用这部分内存。此,任务管理器的"性能选项卡"看到的内存容量不会有变化。同样,可以由滑动条来设置大小,上限也是由软件根据物理内存实际大小来定。以上两者都以32M为步进单位。 [7]和[8]的作用是相同的,既对应[4]和[5],当选择了[4]和[5](两者之一或全部),并且又遇到系统主内存容量不足的情况,允许系统从虚拟回收多少内存来“救急”。 [6]和[9]:[6]前面提到过,使用来设置软件允许用来设置虚拟盘的内存大小,这个可以比你设置的虚拟盘容量大,但不能比其小,小了会提示可用内存不够而无法设置虚拟盘。无论在何种情况下[9]都是必选的,表示你要使用系统内存来做虚拟盘,如果不选,虚拟盘就不会生效。 [12]是一个比较有趣的地方,就是它将内存划分为32M为一个单位,图黄色的部分就是指允许虚拟盘使用这一位址(没写错,不是位置,从左到右分别表示每条内存的最高位到最低位),红色表示已经被虚拟盘占用的位址,黑色表示不允许虚拟盘占用的位址。(至于主板有6根插槽或者内存组成为2x2G这种情况没条件测试就不清楚它怎么分配了。)默认如图,它将每根内存的最低位64Mb设置为排除,是因为有些驱动程序和常驻系统的软件会占用这部分内存,为了避免引起冲突采取的措施。如果大家有兴趣的话,还可以把虚拟盘设置到任意一根内存条上,比如第一或是最后一根,你只要在那些单位上点一下就行了, 它的状态会在允许/排除之间切换。 [13]表示生成虚拟盘的磁盘格 FAT fAT32 或 NTFS [14]表示是否压缩驱动器来节省空间,选有效 [15]表示是否使用索引服务来加快搜索虚拟盘上文件的速度 其实,对于[14]和[15],一般我们都是在模拟盘上放临缓存和页面文件,就没必要压缩和索引了。 [16]生成模拟盘的ID号,这是硬件的标示ID,一般不用去管它,你也可以自己设置,修改后可以在设备管理器ramdrive属性里的详细信息里看到它 [17]就是模拟盘的卷标了 [18]是加载映像文件的位置选项,类似superspeed ramdisk plus 的功能 [19]点击后,就可以对映像文件进行详细的调节,这个比较简单,看帮助的例子 [21]是对[19]的文字说明 [20]显示映像文件的详细信息 [22]表示当你设置完成后点OK模拟盘会重新生成,同你刚才所做的设置修改也会生效,这有会清空模拟盘上的文件,需要注意一下 [23]是对模拟盘上的文件复制操作是否使用 MMX指令集,一般都能选,是对模拟盘上的文件复制操作进行MMX加速的,也只对文件复制操作有效。 基本上就介绍完了,由于我是凭自己记忆写的(公司的机器内存不大,当然不能来装这些东西测试)所以某些地方可能有记错的地方,欢迎大家实践后指正。最近要做封闭开发,感觉我的间太少了,呵呵。不过我会经常来看看并修改错误的。
 操作系统原理 课程试卷(一)答案共4 学院   专业        成绩      年级   学号      姓名     日期     考试形: 闭卷 间: 120分钟 一、 填空题(20分,每空1分) 1、进程通信的常用方有 直接通信 和 间接通信 等。 2、如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起同步 P操作在互斥 P操作前。而两个V操作的次序无关紧要 。 3、P(S):表示申请一个资源 ; V(S)表示释放一个资源 。信号量的初值应该大于等于0 。 4、在请求系统框的分配有一种方称为固定分配。固定分配有两种不同的方,分别是平均分配 和按比率分配 。 5、在请求存储管理系统,不能在计算机实现页面淘汰算法是最佳算法 ,选择淘汰不再使用或最远的将来才使用的算法是先进先出算法 ,选择淘汰在主存驻留间最长的算法是最近最少使用 。 6、将作业地址空间的逻辑地址转换主存物理地址的过程称为 地址转换。 7、访问磁盘间由三部分组成 寻道间 、 旋转延迟间 和 传输间 。 8、I/O设备的控制方有 轮询 、 断 和 DMA 等。 、 判断题(20分,每题4分,请说明正确与否的理由) 1、分布系统就是紧偶合系统。 错。 分布系统是松散偶合系统。 2、在一个只有单个CPU的计算机,进程不能并行操作。 错。 一个进程在利用CPU运行,另一个进程可以同进行I/O操作,它们是并行的。 3、线程可以分为内核级(Kernel Thread)和用户级(User Thread)两种,操作系统不可以直接调度用户级的线程。 对。 4、有m个进程的操作系统出现死锁, 死锁进程的个数为1α>0算法是什么算法? 2) 请问当α<β<0算法是什么算法? 答: 1) 先来先服务 2) 先来后服务 六、 一个程序P的用户空间为16K,存储管理采用请求系统,每个页面大小为2K,存在以下的表: 框号 有效位 12 1 3 1 0 1 0 0 2 1 15 1 0 0 8 1 其,有效位=1表示页面内存;0表示页面不在内存。 请将虚地址0x060C,0x1502,0x1d71,0x2c27,0x4000转换为物理地址。 答: 0x060C:1548+12*2048=0x660C 0x1502:0x502 0x1d71:缺 0x2c27:0x1427 0x4000:越界 七、 1目录文件采用链接,每个磁盘块存放10个下级文件的描述,最多存放40个下级文件,若下级文件为目录文件,上级目录指向该目录文件的第一块,否则指向普通文件的文件控制块。普通文件采用级索引形,文件控制块给出12个磁盘块地址,前10个磁盘块地址指出前10物理地址,第11个磁盘块地址指向一级索引表,一级索引表给出256个磁盘块地址,即指出该文件第10至第265的地址,第12个磁盘块地址指向级索引表,级索引表指出256个一级索引表的地址。 (1) 该文件系统的普通文件最大可有多少? (2) 若要读文件/A/D/K/Q的某一, 最少要启动磁盘几次? 最多要启动磁盘几次? 答: (1)该文件系统的普通文件最大可有:10+256+256*256=65802 (2)若要读文件/A/D/K/Q的某一, 最少要启动磁盘1+1+1+1+1=5次,最多要启动磁盘4+4+4+4+2+1=19次

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值