OS-4 存储管理程序员
本章介绍了操做系统对内存的管理方法 es6
本章所讨论的是在内存也叫主存层面的存储管理,以下图。 算法
1、了解重要概念-地址重定位 编程
逻辑地址:逻辑地址是用户编程所用的地址,老是从0单元开始编址。逻辑地址是在编译之后造成的。逻辑地址是指可执行文件中的相对地址。将可执行代码装入内存时,必须经过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。 缓存
一、程序通过编译后,每一个目标模块都是从0号单元开始编址,称为该目标模块的相对地址(或逻辑地址)。 数据结构
二、当连接程序将各个模块连接成一个完整的可执行目标程序时,连接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。 函数
重点!!!!!!!!!!! 操作系统
关于逻辑地址的理解,逻辑地址在计算机中不是实际存在的一个地址,而是一个程序段连接之后造成的逻辑地址空间,一个指令相对于0单元位置的偏移,CPU执行程序时首先会获得该程序的首地址,剩下的指令都是顺序执行,因此要取的指令地址都是经过逻辑地址相对于0单元的偏移,而后通过MMU(或其余硬件结构)的计算,计算出物理地址,关于这个偏移 CPU内部有专门的计数器进行计数。 设计
三、用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是彻底透明的,它们只有系统编程人员才会涉及。 3d
四、不一样进程能够有相同的逻辑地址,由于这些相同的逻辑地址能够映射到主存的不一样位置。
五、物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据都要经过物理地址从主存中存取。当装入程序(Loader)将可执行代码装入内存时,必须经过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。
2、程序的连接
C语言(高级语言)源文件.c,目标文件.o和可执行文件:
源代码编译之后生成的叫目标代码(机器代码).O文件,但此时还不能运行,缺乏的第一个元素是一种叫作启动代码(Start-up code)的东西,此代码至关于您的程序和操做系统之间的接口。
缺乏的第二个元素叫作库函数,几乎全部C程序都利用标准库中所包含的例程(称为函数)。例如,前面的concrete.c使用了函数printf()。目标代码文件不包含这一函数的指令。实际代码存储在另外一个称为“库”的文件中,库文件中包含许多函数的目标代码。
动态连接是相对于静态连接而言的。
所谓静态连接是指把要调用的函数或者过程连接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的所有代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态连接所调用的函数代码并无被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(每每是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间创建连接关系。当要执行所调用DLL中的函数时,根据连接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。通常状况下,若是一个应用程序使用了动态连接库,Win32系统保证内存中只有DLL的一份复制品
动态连接库的两种连接方法:
(1) 装载时动态连接(Load-time Dynamic Linking):这种用法的前提是在编译以前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的连接信息,而不含DLL函数的代码;当程序执行时,调用函数的时候利用连接信息加载DLL函数代码并在内存中将其连接入调用程序的执行空间中(所有函数加载进内存),其主要目的是便于代码共享。(动态加载程序,处在加载阶段,主要为了共享代码,共享代码内存)
(2) 运行时动态连接(Run-time Dynamic Linking):这种方式是指在编译以前并不知道将会调用哪些DLL函数,彻底是在运行过程当中根据须要决定应调用哪一个函数,将其加载到内存中(只加载调用的函数进内存),并标识内存地址,其余程序也可使用该程序,并用LoadLibrary和GetProcAddress动态得到DLL函数的入口地址。(dll在内存中只存在一份,处在运行阶段)
上述的区别主要在于阶段不一样,编译器是否知道进程要调用的dll函数。动态加载在编译时知道所调用的函数,而在运行态时则必须不知道。
关于三种连接方式的差异以下:
三者之间的关系就像是机枪,冲锋枪和手枪
机枪在一开始就把全部子弹装好,开枪的时候很快,但也很笨重。
冲锋枪则是将子弹分弹夹存好,轻便了许多,可是会有一段装填时间。
手枪就更加轻便了,可是弹夹容量更小,装填的频率又变高了。
使用运行时动态连接即便DLL不可用的话,进程也能继续运行,而后进程能够经过一个变动方法达到最终目的。例如,若是进程不能找到一个DLL,它能够尝试另一个或者向用户提示错误。若是用户能够提供丢失的DLL的全路径,进程就能够不论是否在正常的搜索路径中而使用该路径信息。然而若是是载入时连接的话,系统就会终止。
3、存储管理方式
第一部分:分区存储管理
1)单一连续分配
2)固定分区
3)可变分区分配
须要检查相邻区域是否有空闲区,若是有空闲则须要合并。
4)可重定位分区
第二部分:页式、段式、段页式存储管理
1)分页管理技术
分页管理技术是将程序分页,而后将内存分为和程序页面大小同样的页框,将程序以页为单位装入内存。
2)分段管理技术
3)段页式管理
段页式的缺点是:
在通常使用段页式存储管理方式的计算机系统中,都在内存中辟出一块固定的区域存放进程的段表和页表。所以,在段页式管理系统中,要对内存中指令或数据进行一次存取的话,至少须要访问三次以上的内存:
第一次是由段表地址寄存器得段表始址后访问段表,由此取出对应段的页表在内存中的地址。
第二次则是访问页表获得所要访问的物理地址。
第三次才能访问真正须要访问的物理单元。
显然,这将使CPU的执行指令速度大大下降。
下面介绍一下为了加快系统速度引入的一个数据结构:快表(TLB)也叫作 联想寄存器。其本质是速度极快的 cache。
此时分页存储管理的CPU的地址转换过程变为,先查快表(并行),若是查到相关页表项(HIT),则直接获得物理块号,
若是没有查到,则须要查页表,并将相关页表项写入TLB。
4、页表项的设计
对于每个页表项,须要设置相关位来表示该页的状态。
5、内存管理单元MMU
MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时称做分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤为是在8位的系统上)。
OS5-虚拟存储技术
1、虚拟存储技术的概念
虚拟页式存储管理:
在该类管理方式中,可能会出现页错误。
下面介绍存储保护和页错误的概念:
访问地址越界越权都会产生页错误,此时系统会产生中断,根据操做系统相关处理程序进行处理;发生缺页异常时,也会产生页错误,此时会产生缺页中断,操做系统的缺页中断处理程序会将缺乏的页面从虚拟内存调入内存,并根据页框分配状况进行分配(空闲页框或置换)。
2、页面置换
1)驻留集概念:系统分配给一个进程的页框的集合就是驻留集。
清除策略:为了保证内存中有必定的空闲页框,系统会按期收回一些进程中驻留集的页框,具体收回哪些,取决于系统的清除策略。
若是但愿一些页面不被置换,能够进行页框锁定。
2)页面置换算法:
一、 OPT算法:
二、 FIFO算法
三、 时钟算法
四、LRU算法:
LRU能够用栈实现(或时间戳)。
3、关于其余存储技术
一、交换技术
二、内存映射文件
三、写时复制
本章内容重点: