1、内存连续分配方式采用的几种算法及各自优劣?
连续分配方式,是指为一个用户程序分配一个连续的内存空间,该连续内存空间指的的是物理内存。
1)单一连续分配
我们把内存(此时指的是内存条)分为系统内存区和用户区两部分,系统区供OS使用,用户区供用户使用,单一连续分配,就是把用户区当成了一个整体用,所以,该内存管理方式只适用于单用户单任务的操作系统。
2)固定分区分配
把用户区提前分成固定大小的几个整体,每个整体都可以用来装入一个作业。我们在划分用户区时,可以采用分区大小相等和分区大小不相等的方式划分,为了方便操作系统把相应的内存分给某个程序,因此,我们通常将分区按大小进行排队,并为之建立一张分区使用表,表中内容为:每个分区的起始位置、大小及状态(是否分配)。此分区方式可以实现多道程序的同时运行,但是,由于每个分区的大小是固定,必然会造成存储空间的浪费。
3)动态分区分配
程序在装入内存中时,需要多少内存,我就给他多少内存。要实现这个问题,我们要解决三个难题。
一、怎么记录物理上不相连的内存?
采用这种分区方式,刚开始的时候,用户内存是一整块,但是,不断打开程序和关闭程序后,就会出现一块一块的内存,那么我们应该怎样管理这种情况呢?
我们采用某种数据类型来记录这些空闲的内存块,常用的数据结构类型有空闲分区表和空闲分区链。闲分区和固定分区的表的原理是一样的,只不过这种表的灵活更强;空闲分区链是在物理上不相邻的空闲空间的始尾写上了他的前一个块的地址和后一个块的地址,它还存储了其他的用于控制分区分配的信息。
二、如何分配空闲内存?
采用了一些分区算法,这些算法主要是针对的是存在了不连续的分区块的。
--首次适应算法:在空闲内存中找到适合程序所需内存的第一块内存时,就给它分配所需内存大小,每次都是从空闲内存的开始查找;
--循环首次适应算法:从上次找到的空闲分区的下一个空闲分区开始找;
--最佳适应算法:把空闲内存中能够满足程序所需,又是最小的内存物理块时,就给它分配;
--最坏适应算法:从内存空闲中跳一个最大的空闲区分配给程序;
--快速适应算法:设置多个空闲分区链表,记录出每个独立内存块的信息,其中把内存大小相同的记录在一个表中。
三、如何回收?
回收的主要思想是把连续的空闲内存合在一起。
4)动态重定位分区分配
把不同程序,且在内存中地址不连续的想法让他们连续。
举例:程序A、B,在内存中的位置不连续,即:A和B中间有空闲内存,我就把B和那部分的空闲区对换,为了实现改过程序我们增加了一个硬件——重定位寄存器。(虽然这种分区非常的好,但是,要真正的实现起来需要为此付出很大的开销,为了解决这个问题,人们有发明了一种分配方式——分页)
2、windows内存管理的方式?
1)有三种方法:虚拟内存,内存映射文件,内存堆栈。
--虚拟内存是将页文件加载到内存,适用于比较大的对象或结构;
--内存映射文件是将磁盘上文件加载到内存,适用于大文件和单机的进程间内存共享;
--堆栈就是动态的分配内存,适用于小对象的创建。
2)当程序运行时需要从内存中读出程序的代码。
代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。
3)内存管理有块式管理,页式管理,锻式和锻页式管理。
--页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,这种方法的空间利用率要比块式管理高很多。
--段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
--锻页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。
3、动态链接及静态链接?
1)Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。
--Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;
--User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;
--GDI32.dll,它包含用于画图和显示文本的各个函数。
2)静态库:
函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。
3)导入库(Import Library):
在使用动态链接库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。
4)静态链接方法:
#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。
静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库。
5)动态链接方法:
LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。
6)特点:
动态库:
1.共享:多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;
2.开发模块好:要求设计者对功能划分的比较好。
静态库:
代码的装载速度快,执行速度也比较快,因为编译时它只会把你需要的那部分链接进去,应用程序相对比较大。但是如果多个应用程序使用的话,会被装载多次,浪费内存。
4、分段分页方式的比较及各自缺点?
页和分段系统有许多相似之处,但在概念上两者完全不同,主要表现在:
1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
2)页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。
段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
3)分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。
分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
5、几种页面置换算法?
地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。
1、常见的置换算法有:
1)最佳置换算法(OPT)(理想置换算法)
发生缺页时,有些页面在内存中,其中有一页将很快被访问(也包含紧接着的下一条指令的那页),而其他页面则可能要到10、100或者1000条指令后才会被访问,每个页面都可以用在该页面首次被访问前所要执行的指令数进行标记。最佳页面置换算法只是简单地规定:标记最大的页应该被置换。
2)先进先出置换算法(FIFO)
总是选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上。
3)最近最久未使用(LRU)算法
FIFO算法利用页面进入内存后的时间长短作为置换依据,而OPT算法的依据是将来使用页面的时间。如果以最近的过去作为不久将来的近似,那么就可以把过去最长一段时间里不曾被使用的页面置换掉。
它的实质是,当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以置换。
2、LRU算法需要实际硬件的支持。其问题是怎么确定最后使用时间的顺序,对此有两种可行的办法:
(1)计数器。
最简单的情况是使每个页表项对应一个使用时间字段,并给CPU增加一个逻辑时钟或计数器。每次存储访问,该时钟都加1。每当访问一个页面时,时钟寄存器的内容就被复制到相应页表项的使用时间字段中。这样我们就可以始终保留着每个页面最后访问的“时间”。在置换页面时,选择该时间值最小的页面。
(2)栈。
用一个栈保留页号。每当访问一个页面时,就把它从栈中取出放在栈顶上。这样一来,栈顶总是放有目前使用最多的页,而栈底放着目前最少使用的页。由于要从栈的中间移走一项,所以要用具有头尾指针的双向链连起来。
4)Clock置换算法(LRU算法的近似实现)
5)最少使用(LFU)置换算法:
在采用最少使用置换算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在最近时期使用最少的页面作为淘汰页。LFU置换算法的页面访问图与LRU置换算法的访问图完全相同。
6)第二次机会算法
当选择置换页面时,检查它的访问位。如果是0,就淘汰这页;如果访问位是1,就给它第二次机会,并选择下一个FIFO页面。当一个页面得到第二次机会时,它的访问位就清为0,它的到达时间就置为当前时间。如果该页在此期间被访问过,则访问位置1。这样给了第二次机会的页面将不被淘汰,直至所有其他页面被淘汰过(或者也给了第二次机会)。因此,如果一个页面经常使用,它的访问位总保持为1,它就从来不会被淘汰出去。
6、虚拟内存的定义及实现方式?
1)虚拟存是把一个程序所需要的存储空间分成若干页或段,程序运行用到页和段就放在内存里,暂时不用就放在外存中。当用到外存中的页和段时,就把它们调到内存,反之就把它们送到外存中。装入内存中的页或段可以分散存放。
2)调度方式有分页式、段式、段页式3种。
---页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。
页式调度的优点是页内零头小,页表对程序员来说是透明的,地址变换快,调入操作简单;缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。
---段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,并且允许伸长,它的优点是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操作复杂。将这两种方法结合起来便构成段页式调度。
---在段页式调度中把物理空间分成页,程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。大型通用计算机系统多数采用段页式调度。
3)虚存机制要解决的关键问题
--调度问题:决定哪些程序和数据应被调入主存。
--地址映射问题:在访问主存时把虚地址变为主存物理地址(这一过程称为内地址变换);在访问辅存时把虚地址变成辅存的物理地址(这一过程称为外地址变换),以便换页。此外还要解决主存分配、存储保护与程序再定位等问题。
--替换问题:决定哪些程序和数据应被调出主存。
--更新问题:确保主存与辅存的一致性。
7、操作系统的四个特性?
1)并发性
并行性是指两个或多个事件在同一时刻发生;而并发性是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。
2)共享
在操作系统环境下,所谓共享是指系统中的资源可供内存中多个并发执行的进程(线程)共同使用。由于资源属性的不同,进程对资源共享的方式也不同。
3)虚拟
是指通过某种技术把一个物理实体变为若干个逻辑上的对应物。物理实体(前者)是实的,即实际存在的,而后者是虚的,是用户感觉上的东西。相应地,用于实现虚拟的技术,称为虚拟技术。在OS中利用了多种虚拟技术,分别用来实现虚拟处理机、虚拟内存、虚拟外部设备和虚拟信道等。
4)异步性
在多道程序环境下,允许多个进程并发执行, 但只有进程在获得所需的资源后方能执行。在单处理机环境下,由于系统中只有一个处理机,因而每次只允许一个进程执行,其余进程只能等待。当正在执行的进程提出某种资源要求时,如打印请求,而此时打印机正在为其它某进程打印,由于打印机属于临界资源,因此正在执行的进程必须等待,且放弃处理机,直到打印机空闲,并再次把处理机分配给该进程时,该进程方能继续执行。可见,由于资源等因素的限制,使进程的执行通常都不是“一气呵成”,而是以“停停走走”的方式运行。
8、外存分配的几种方式?
连续分配、链接分配、索引分配三种。
1)连续分配:
(不现实)就是为每个文件申请一个连续的存储空间。
优点:查找迅速,因为不需要跳跃寻址。
缺点:须知道文件的大小,不能对动态文件做正确的处理,对系统而言,需要足够大的连续存储空间
2)链接分配:
(windows的外存分配策略)本质就是离散存储。又分为隐式链接和显式链接:
--隐式链接
对每个文件分配的空间,都须含有一个指向链接文件的第一个盘块和最后一个盘块的指针。隐式分配的问题在于对某一记录的访问需要O(n)的复杂度,效率太低。
--显式链接
本质就是在内存中保存一个全磁盘空间的文件分配表(File Allocation Table)。
优点:解决了系统没有足够连续空间的问题。
缺点:文件查找还是顺序查找,效率提高不多。需要将FAT存入内存,代价太大。
3)索引分配:
事实上,需要某个文件时,我们只需要将该文件占据的盘块号调入内存即可,所以,我们用一个索引块存储该文件的所有盘块号。然后在建立文件时,只需要在文件目录中加入一个指向该索引块的指针即可。
优点:解决了FAT太大无法调入内存的问题。加快了访问文件某个记录的速度(索引块中存储了该文件的所有盘块)。
缺点:需要额外的外存空间(索引块)。每当建立一个文件时,就需要为之分配一个索引块。但是实际应用中,总是中小型文件居多,他们通常只占据1-2个盘块,那么,索引块的作用几乎为0。
又分为单级索引分配、多级索引分配、混合索引分配三种,本质相同,只是后两种是对中型、大型文件而言的。