操作系统内存管理实验(通用10篇)
操作系统内存管理实验 篇1
实验三 可变分区存储管理方式的内存分配回收
一.实验目的
(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验内容
编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理
在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。
四.实验部分源程序
#include
int start,end;// 起始,结束
int length;// 长度大小
struct SNode *next;// 指向下一结点的指针 }* SP;SP Head=(SP)malloc(sizeof(SNode));// 全局变量,内存空间头结 void DispSpace(){ // 显示内存空间分配情况
SP p=Head->next;
cout<<“n 空闲区说明表 n”
<<“---地址--长度---n”;
while(p)
{
cout<<“
”<
start
<<“
”<
length< p=p->next; } cout<<“----------------n”;} void Initial(){ // 初始化说明表 SP p,q; p=(SP)malloc(sizeof(SNode)); q=(SP)malloc(sizeof(SNode)); p->start=14;p->length=12;p->end=26; q->start=32;q->length=96;q->end=128;// 指导书上的作业分配 Head->next=p;// 与头结点连接 p->next=q; q->next=NULL; DispSpace();} void Allocation(int len){ // 分配内存给新作业 SP p=Head->next,q; while(p){ if(p->length < len) p=p->next; else if(p->length > len) { p->start=p->start+len; p->length=p->length-len; cout<<“分配成功!n”; DispSpace();return; } else {//当两者长度相等 q=p->next; p->next=q->next; cout<<“分配成功!n”; DispSpace();return; } } cout<<“分配失败!n”; DispSpace();return;} void CallBack(int sta,int len){ // 回收内存 SP p=Head,q=p->next,r;// 开始地址和长度 p->end=0; int en=sta+len; while(q){ if(sta == 0){ // 初始地址为0 if(en == q->start){ // 正好回收 q->start=0; q->length=q->end; return; } else { r=(SP)malloc(sizeof(SNode)); r->start=sta;r->length=len;r->end=en; p->next=r; r->next=q; return; } } else if((p->end < sta)&&(q->start > en)){ // 上邻区 r=(SP)malloc(sizeof(SNode)); r->start=sta;r->length=len;r->end=en; p->next=r; r->next=q; return; } else if((p->end < sta)&&(q->start == en)){ // 邻区相接 q->start=sta; q->length=q->end-sta; return; } else if((p->end == sta)&&(q->start < en)){ // 下邻区 p->end=en; p->length=en-p->start; return; } else if(p->end==sta && q->start==en){ // 邻区相接 p->end=q->end; p->length=p->end-p->start; p->next=q->next; return; } else { p=p->next; q=q->next; } } } void main(){ Initial(); cout<<“现在分配大小为 6K 的作业 4 申请装入主存: ”; Allocation(6);// 分配时参数只有长度 //--------指导书测试数据演示---------- cout<<“现回收作业 3(起址10,长度4)n”; CallBack(10,4); DispSpace(); cout<<“现回收作业 2(起址26,长度6)n”; CallBack(26,6); DispSpace(); //---------------演示结束------------- system(“pause”);} 五.实验结果与体会 我的体会: GNU/Hurd操作系统是GNU设计用来替代Unix内核的新一代操作系统内核[1]。Hurd系统是基于CMU的Mach3.0微内核架构,由GNU小组对其进一步开发完成,并由Debian公司进行发布。 Hurd采用Mach微内核作为其内核,Mach微内核完成最基本的操作系统功能,例如进程通信、内存管理、硬件管理等。Hurd是架设在Mach上的一组服务,这一组服务贯彻了传统操作系统概念,实现了文件系统,网络协议,文件的访问控制,以及其它的操作系统功能。 Hurd与Mach系统在特点上各有千秋,例如Hurd的模块化以及微内核架构特点、Mach独有的IPC通信和内存管理特点等。本文将简单介绍Hurd与Mach系统特点,并分析Mach微内核的内存管理与接口实现。最后,讨论在Mach微内核下内存共享的实现。 1 Hurd操作系统与Mach微内核 1.1 Hurd操作系统及其特点 Hurd操作系统是GNU项目组设计用来取代Unix的新一代操作系统。虽然目前不是最流行的操作系统,但因其拥有很多独特的特性,从而与其它的操作系统相比,表现着更为出众的使用优势。Hurd的优点如下[2]: (1)Hurd是开源的操作系统。任何人都可以使用并且修改,由GNU小组进行维护。 (2)兼容性。Hurd提供了一个通用的编程环境和用户环境,是一个类Unix的内核。Hurd使用GNU C库,并且兼容ANSI/ISO,POSIX,X/Open等标准。 (3)易于设计与扩展。Hurd不同于其他流行的操作系统内核,而是面向对象的结构。这种结构使得Hurd在进行扩展和修改时,无需重写内核,只需要修改相应的模块。 (4)多服务。Hurd实现了多线程,可高效地运行在单处理器和多处理机上。Hurd的运行性能非常稳定,还是一个很好的学习平台,各种想法实现起来也非常便捷。 GNU Hurd设计成多服务的面向对象的操作系统。可将其视为一组对象的集合,对象扩展了底层微内核Mach的功能,可以实现标准的操作系统功能以及实践系统设定的各项策略。系统的服务是通过专门的对象来实现的,这些对象在用户态下被称为server。一个服务也可以分解为一些对象,比如文件系统服务可以分解为后备存储、文件属性以及目录等。Hurd可以视为基于微内核Mach的服务的集合,包括文件系统、网络协议以及其他一些系统功能。GNU Hurd多服务操作系统的时新评论均详细介绍了Hurd的系统架构以及Hurd实现的详细细节,同时也给出了Hurd系统的优点和缺点[3]。 1.2 Mach微内核及其特点 Hurd作为GNU的操作系统,架设在微内核Mach之上,实现了传统意义上的操作系统功能。Mach是第一代的微内核结构,是由CMU大学设计并实现的微内核。GNU对其进行了修改和扩充,因而形成了GNU Mach微内核,GNU Mach兼容CMU的Mach 3.0系统。 GNU Mach是GNU项目的微内核。Mach并不显现操作系统的特点,而是借助一个简单的可扩展通信内核、用户模式的任务来实现传统操作系统功能。Mach所提供的基本功能包括控制流的管理(threads)、资源分配(tasks)、支持虚拟地址空间、管理硬件资源(如处理器、物理内存)等[4]。另外,Mach还具有强大的内存管理和进程间通信的功能,这是操作系统的基础功能,也为Hurd的server、GNU C库和用户程序提供了底层基础功能。微内核Mach本身虽不提供操作系统的功能,却也使得Hurd的服务和C库在Mach上实现了一个满足POSIX标准的操作系统。文献[5]给出了Mach微内核的设计创意和详细实现细节。 2 Mach微内核的虚拟内存管理 通常,操作系统的内存管理部分主要完成空间分配、虚拟地址映射和地址保护等功能,从而使得系统安全高效地使用有限的存储空间。Mach微内核的内存管理机制设计目标是: (1)支持较大的、松散的虚拟地址空间。 (2)灵活的内存保护机制。 (3)copy-on-write操作。 (4)任务间内存共享,包括copy-on-write和read/write内存共享。 (5)内存映射文件。 (6)用户模式提供页和对象的后备存储[6,7]。 Mach的内存管理在设计上尽可能地独立于硬件,对硬件的唯一要求是提供页式管理机制支持,并且对于页的大小也不作限制,所有这些化简了在移植时的操作,使得Mach能够支持许多不同的体系结构。 2.1 Mach内核的5个基本抽象 Mach是一个支持并行分布多体系结构的操作系统微内核,有5个最基本的抽象概念,这些抽象概念对于理解Mach以及Mach的虚拟内存管理机制是必不缺少的。这五个概念分别是任务(Task)、线程(Thread)、端口(Port)、消息(Message)、内存对象(Memory object)[8],对其分析如下: (1)任务(Task)。每个task是一个线程运行的执行环境,是最基本的资源分配单位。通常,task包括虚拟地址空间和系统资源(处理器、虚拟内存等),与UNIX进程的概念相类似。 (2)线程(Thread)。Thread是CPU使用的基本单位,是程序执行的实体。同一个任务内的所有thread共享全部资源。 (3)端口(Port)。port是一个信息通道。通过信道,Mach可以安全地进行消息传递。 (4)消息(Message)。message是线程之间通信使用的数据对象的类型集合。message大小不限,并可能包含指针和类型。 (5)内存对象(Memory Object)。Memory object是由server管理和提供的可以映射到一个任务的地址空间的数据备份。这是一种对存储的抽象,可以用来表示例如文件等存储实体。 2.2 Mach虚拟内存管理 Mach最著名的设计之一是其中的虚拟内存的设计,Mach将虚拟内存系统分为机器独立和机器依赖两部分。机器依赖提供一个简单的接口,负责管理硬件地址映射表;机器独立除了提供逻辑页表的管理,还提供映射表所组成的内存区域概念,同时也提供内存对象的支持和接口实现。Mach虚拟内存系统除支持单处理器外,还支持共享内存的多处理器系统,同时也具有很好的移植性,可以在各种不同的系统架构下加载运行。高性能也是Mach重要特点之一。Mach提供很大的、宽泛的虚拟地址空间、共享内存以及虚拟内存拷贝优化等等。Mach的每个任务(task)均拥有较大的地址空间范围,包括内存区域以及内存区域所映射的内存对象。Mach内规定任务的地址空间只由底层硬件的寻址限制所决定。 2.2.1 虚拟地址空间(Virtual Address Spaces) 虚拟地址空间定义了一组地址,这组地址指示线程thread在任务task执行的虚拟地址。虚拟地址空间由其对应的task命名。Mach的任务都拥有很大的虚拟地址空间,其线程的执行就是在此虚拟地址空间中。 虚拟地址空间由松散的已经索引的内存页面集合组成。Mach内核按照页面的属性值将这些内存页面分成不同的组,将其称为内存区域(memory regions)。页面的属性包括继承属性、保护属性、后备的抽象内存对象等等。系统的各项操作和运行机制均是基于内存区域的,但是用户对于内存区域的使用却无需限制,用户可以尽其所需地扩张内存区域。同时,Mach内核也可以按照适合的方式自由地合并和分割内存区域,从client的视角看,虚拟内存空间就是一个页面的集合。调用vm_region可以获得内存区域的属性。尽管内存区域是存在于内核的概念,调用vm_map也可以修改内存区域的继承和保护属性。 任务的虚拟地址空间是在任务创建时分配完成的,并于任务结束时一并销毁。当任务刚刚创建时,其虚拟内存空间是空的,必须通过执行一定操作申请地址内存空间。通过task_create调用,子任务可以继承其父任务的内存区域。而vm_inherit调用则可以修改内存区域的继承属性值,这些属性值包括: (1)VM_INHERIT_NONE—该内存区域在新任务中不会被定义。 (2)VM_INHERIT_COPY—该内存区域将会以copy优化的方式在新任务中进行创建。 (3)VM_INHERIT_SHARE—新旧任务将完全共享同一内存区域。在此,可以看出Mach提供了父子任务的内存共享。 内存区域的语义识别是通过a memory manager的行为实现的。当一个内存区域在虚拟空间中创立时,一个虚拟内存对象(memory object)便和该内存区域联系在一起了。内存对象将负责内存区域的后备数据存储,其语义实现是通过一个称为memory manager的任务实现的。内核中不存在直接操作内存区域的系统调用,任务是通过memory manager的函数或者向memory manager发送消息来完成操作的。 vm_map调用是确定任务内存区域的唯一方法,借此可以设定该内存区域的基本信息(例如内存中位置、大小、保护属性、继承属性等)。需要指出的是,最重要的参数是对其抽象内存对象的指定,因其提供了内存区域的后备存储。 图1是以client的角度呈现的虚拟内存结构图。图中显示了三个内存区域,其中的两个共有一个相同的后备对象存储memory object,但是两者的继承属性或者保护属性可以不相同。 2.2.2 内存对象(Memory Objects) 内存对象代表了非常驻内存的内存区域,内存对象是内存区域的后备存储。而实现内存对象概念的任务则称为memory manager。memory manager实现了内存对象的完整语义,并且提供了若干接口,以方便用户使用。 用户态的任务操作内存的通用过程是:一个任务确定其内存区域,并指定该内存区域的内存对象;任务访问该内存区域的某部分,假如该内存区域不在内存中,则发生缺页中断,将其换入后继续访问;假如数据已修改,则将数据存入内存对象中,再将其换出内存;销毁内存区域以及内存对象。 内核使用内存可以将内存作为内存对象内容的缓存(cache)。该cache的一部分是常驻内存的,将此部分内存对象称之为memory cache object。内核维护cache,并对其适时、合理地进行管理、填充和刷新。 2.3 Mach虚拟内存管理接口的实现 GNU Mach很大程度上兼容了CMU的Mach 3.0,这一点在接口的层面上已经清晰地显现出来。文献[8,9]分别是Mach 3.0和GNU Mach的接口使用手册,经过分析,两者大部分相同,只是GNU Mach的接口实现简化了CMU Mach的接口,还对其进行了一定的封装处理。 在虚拟内存管理上,两者均提供了较为丰富的接口,同时,一个任务也可以修改其地址空间,例如:在页边界上分配虚拟内存区域、删除虚拟内存区域、设置虚拟内存区域的保护属性、指定虚拟内存区域的继承属性、创建和管理内存对象,内存对象可以映射另一个任务的虚拟地址空间。 Mach亦设有各类功能接口以实现其虚拟内存管理,可将这些接口分为两大类:虚拟内存接口和外部存储管理接口。 对于虚拟内存接口,主要有内存分配和回收、数据传输(读、写和拷贝数据)、内存区域属性设置(继承、保护属性)、映射内存对象。其中,映射内存对象可以将一个任务的地址映射到另外一个任务的地址空间中去,可以实现不同任务的内存共享。这一接口设置屏蔽了内存对象的操作,用户使用起来就像直接操作内存一样。其好处是大大降低了用户管理存储空间的难度,但是也有相应的不足,就是不可以使用高级的内存共享操作。 外部内存接口主要是针对于内存对象的接口,主要有设置内存对象服务、删除内存对象、内存对象的数据传输、内存对象锁定和设置内存对象属性等几类接口。使用外部内存管理接口可以实现较为复杂的内存管理,也包括内存共享操作。 3 Hurd的内存共享 通过对Mach微内核的内存管理的研究,本文提出在Hurd下的几种内存共享方案。 (1)考虑Hurd下POSIX标准的内存共享方案。为了便于实验和对比,同时在Linux和Hurd下进行了实验。 (2)使用Mach的内存对象的概念完成内存共享。这是重点阐述的部分,使用Mach内存对象的概念,并同时使用其IPC通信功能,实现内存共享与映射。 (3)考虑添加系统调用的方法完成内存共享。 3.1 内存共享 首先,介绍一下内存共享的概念。内存共享是指共享内存,从字面意义解释,就是多个进程可以将同一段内存映射到各自的进程空间,以此来实现数据的共享以及传输,这也是进程间最快的一种通信方式,图2是内存共享的示意图。 3.2 使用POSIX标准实现内存共享 Hurd系统支持POSIX标准,而POSIX标准对于内存共享是有规定含义的,所以可在Hurd系统下尝试使用POSIX的内存共享。POSIX标准对于内存共享的实现有两种方法。 (1)内存映射文件(memory-mapped file)。由open函数打开此类文件,并由mmap函数将得到的描述字映射到当前地址空间。 (2)共享内存区对象(shared-memory object)。由shm_open函数打开POSIX标准的一个IPC对象,并且使用mmap函数将其映射到进程地址空间中。 为了验证Hurd系统对于POSIX标准的内存共享,下面分别在Linux系统和Hurd系统下作了实验。 Linux系统下的POSIX内存共享有两种方法。一种是mmap系统调用映射普通文件完成内存共享;另一种是,shm_open函数打开对象,并且使用mmap函数完成内存共享。对于第二种方法,在Linux目录中存在共享内存区对象的目录dev/shm/,在此目录下可以发现打开的共享对象,符合POSIX标准。 Hurd系统是支持POSIX标准的,所以可假设Hurd系统也应该支持POSIX标准的内存共享。现将Linux下的程序移植到Hurd系统下进行对比。实验后发现,在Hurd目录中不存在共享内存区对象的目录/dev/shm,也不存在目标文件。同时,在程序执行的目录下发现了一个文件,该文件内容为共享内存对象的内容。这种情况说明了该文件是存储在本地磁盘上的,不是内存中的共享对象,因而不符合POSIX标准。 由此,得出结论:对于POSIX标准的支持,Hurd系统并没有完全实现,只是使用了文件进行模拟而已。所以,Hurd系统下,使用POSIX标准的内存共享是不可行的。 3.3 使用Mach自身接口实现内存共享 使用微内核Mach自身的接口和机制完成内存共享,可分为这样几种情况,即同一任务的不同线程之间、有父子关系的任务之间、无关系任务之间完成内存共享。对于前两种情况都比较简单,而对于第三种情况,稍微有些复杂。对其叙述如下: (1)对于同一任务的不同线程之间的内存共享。这是共享任务全部资源的,所以,两个不同的线程可以直接完成最大限度的内存共享。这是内存共享中最为简单的情况。 (2)对于父子关系的任务之间的内存共享。可以通过设置内存区域(memory region)的继承属性来实现。 (3)对于无关系任务之间的内存共享。可以通过内存对象(memory object)和内存映射文件完成内存共享。本文将使用Mach微内核的内存管理以及内存对象(memory object)概念,完成内存共享。在Mach微内核中,结合Mach的IPC、Mach对于内存基本操作以及Mach对于内存对象的支持这三个方面的内容,即可完成内存共享的要求。整体思路是:首先建立共享的内存对象,设置内存对象属性,将内存对象映射到相应任务的地址空间,然后完成相应的访问,最后销毁内存对象。需要注意的是,在这一过程中,关键问题是实现任务间的交互、内存对象的保护和共享。 3.4 添加新的系统调用完成内存共享 虽然Hurd支持POSIX标准,但是对于内存共享并没有完全支持,在以后的版本中也可能会对其给予相应的支持。鉴于POSIX的内存共享标准,也可以在Hurd上实现符合POSIX标准或者其他形式的内存共享。这种实现则需要参考Linux和Mac OS的系统调用方式。 添加新的系统调用来实现内存共享的方法,需要添加至少两个系统调用,一个是内存区域的分配,另一个是内存区域的回收。详情请参考Mac OS的系统调用添加方式,这里就不再赘述了。 4 结束语 本文介绍了Hurd操作系统与Mach微内核,并解释了两者之间的关系,分别讲述了两者的特点和优点。着重阐述了微内核Mach的虚拟内存管理机制,并且分析其实现虚拟内存管理功能的接口实现。最后,给出了在GNU Hurd系统下的几种内存共享方法。经过实验分析,Hurd系统下POSIX标准的内存共享方法是不可行的,Hurd对于POSIX的标准没有达到完全兼容。而使用Mach内核自身的内存对象的概念可以实现内存共享,可以完成多种形式的内存共享,效果也十分理想,因而是一种很好的方法。另外,也可以考虑在Hurd下添加系统调用来完成内存共享。 参考文献 [1]GNU/Hurd[OL].http://www.gnu.org/software/hurd/hurd/doc-umentation.html [2]BUSHNELL,THOMAS.The GNU Hurd Reference Manual[M].2007-11. [3]WALFIELD N H,BRINKMANN M.A critique of the GNU H-urd multi-Server operating system[J].ACM SIGOPS Operatin-g Systems Review,2007. [4]BRINKMANN,MARCUS.The GNU Mach reference manual[M].Free Software Foundation,2008-11. [5]ACCETTA M,BARON R,BOLOSKY W.Mach:a new kernelfoundation for UNIX[J].Carnegie Mellon University.Citeseer,39(4864):1-16. [6]RASHID,TEVANIAN R.Machine-independent virtual memo-ry management for paged uniprocessor and multiprocessor archi-tectures[J].IEEE Transactions on Computers,1988,37:896-908. [7]王永杰,战超.MACH操作系统内存管理[J].计算机研究与发展,1992(10):27-30. [8]BRINKMANN,MARCUS.Mach 3 Kernel Principles[M].Free S-oftware Foundation,2008:37-54. 关键词:Windows操作系统;内存;优化管理 中图分类号:TP316.7文献标识码:B文章编号:1673-8454(2008)24-0060-02 一、引言 内存是计算机的数据存储设备之一,它与CPU、高速缓存器等共同决定计算机的运行速度。因此,如何优化内存的管理,提高内存的使用效率,是提高计算机运行速度的重要手段。下面就Windows操作系统,谈谈优化内存管理、提高内存的使用效率的八种方法。 二、提高内存使用效率的八种方法 1.改变页面文件的位置 改变页面文件的位置目的主要是为了保持虚拟内存的连续性。因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率。而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上。 改变页面文件位置的方法是:用鼠标右键点击“我的电脑”,选择“属性→高级→性能设置→高级→更改虚拟内存”,在驱动器栏里选择想要改变到的位置即可。值得注意的是,当移动好页面文件后,要将原来的文件删除(系统不会自动删除)。 2.改变页面文件的大小 改变了页面文件的位置后,我们还可以对它的大小进行一些调整。调整时需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正“塞满”,它会在内存储量到达一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就越低,执行的速度也就越慢。最大页面文件是极限值,有时打开很多程序,内存和最小页面文件都已“塞满”,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,以免出现“满员”的情况。 3.调整高速缓存区域的大小 可以在“计算机的主要用途”选项卡中设置系统利用高速缓存的比例。如果系统的内存较多,可选择“网络服务器”,这样系统将用较多的内存作为高速缓存。在CD-ROM标签中,可以直接调节系统用多少内存作为CD-ROM光盘读写的高速缓存。 4.监视内存 系统的内存不管有多大,总是会用完的。虽然有虚拟内存,但由于硬盘的读写速度无法与内存的速度相比,所以在使用内存时,就要时刻监视内存的使用情况。Windows操作系统中提供了一个系统监视器,可以监视内存的使用情况。一般如果只有60%的内存资源可用,这时就要注意调整内存了,不然就会严重影响电脑的运行速度和系统性能。 5.及时释放内存空间 如果发现系统的内存不多了,就要注意释放内存。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。释放内存最简单有效的方法,就是重新启动计算机。另外,就是关闭暂时不用的程序。还有要注意剪贴板中如果存储了图像资料,是要占用大量内存空间的。这时只要剪贴几个字,就可以把内存中剪贴板上原有的图片冲掉,从而将它所占用的大量的内存释放出来。 6.优化内存中的数据 在Windows操作系统中,驻留内存中的数据越多,就越要占用内存资源。所以,桌面上和任务栏中的快捷图标不要设置得太多。如果内存资源较为紧张,可以考虑尽量少用各种后台驻留的程序。平时在操作电脑时,不要打开太多的文件或窗口。长时间地使用计算机后,如果没有重新启动计算机,内存中的数据排列就有可能因为比较混乱,从而导致系统性能的下降。这时可以重新启动计算机。 7.扩大虚拟内存容量 如果计算机的硬盘够大,可以打开“控制面板”中的“系统”,在“性能”选项中打开“虚拟内存”,选择第二项,用户自己设定虚拟内存设置,指向一个较少用的硬盘,并把最大值和最小值都设定为一个固定值,大小为物理内存的2倍左右。这样,虚拟存储器在使用硬盘时,就不用迁就其忽大忽小的差别,而将固定的空间作为虚拟内存,加快存取速度。虚拟内存的设置最好在“磁盘碎片整理”之后进行,这样虚拟内存就分布在一个连续的、无碎片文件的空间上,可以更好地发挥作用。 8.提高系统其他部件的性能 计算机其他部件的性能对内存的使用也有较大的影响,如总线类型、CPU、硬盘和显存等。如果显存太小,而显示的数据量很大,再多的内存也是不可能提高其运行速度和系统效率的。如果硬盘的速度太慢,则会严重影响整个系统的工作。 三、结束语 当然, 优化内存管理,提高内存的使用效率的方法并不仅限于这八种,还有诸如优化BIOS的设置、整理优化注册表等等。只有根据计算机工作的具体状态,采取恰当的方式、方法,才能取得令人满意的优化效果。 参考文献: [1]李笑梅,王新川.谈微机的优化内存管理[J].河北省科学院学报,2000(4). [2]朱文鸣.加强Windows系统的内存管理[J].科学时代,2007(3). 4。1族谱信息系统结构 在族谱信息系统的业务逻辑中,系统的运营商负责分配录入任务给各个代理商,各代理商再将任务分割为多个子任务,并组织多位录入人员进行录入。 为了增加子系统的可靠性和灵活性,族谱信息系统采用分布式结构[16](如图2所示)。 系统中包括了一个中心数据节点和多个分布数据节点。 中心数据节点储存了所有的族谱数据;而每个代理商拥有一个分布数据节点,存储了本代理商代理录入完成的族谱数据。 每个分布数据节点都是由一个磁盘数据库和一个内存管理单元组成。 其中内存管理单元包括内存数据库、用户请求处理模块、接收队列、发送队列、节点状态管理模块、资源管理模块和数据同步模块,内存数据库采用列存储模型来实现存储。 用户请求处理模块主要是接收用户请求,并根据用户请求进入不同的处理分支。 接收队列用于接收用户提交的新增的数据或者是修改的数据。 发送队列用于发送给用户所要求的查询结果数据。 数据同步模块用来维持分布数据节点和中心数据节点的数据同步。 资源管理模块主要是对内存资源进行分配和回收。 4。2数据录入功能的内存管理策略 在数据录入功能中,每个录入用户登录之后首先会选择自己要录入的族谱,系统自动连接该族谱隶属的代理商的分布数据节点。 分布数据节点中的用户请求处理模块会识别用户数据录入请求,把用户选择的族谱数据作为热点数据存入到内存数据库当中。 由于数据录入功能的主要操作是插入新元组,所以元组集合在内存数据库中采用堆组织以便高效地插入新元组;同时按照键值建立哈希索引,其中重名的会依次放在指针数组中。 图2族谱信息系统架构 Fig。2The structure of the genealogy information system 当用户插入新元组时,新元组会加入到系统的接收队列,分布数据节点会把新增元组加入到内存中存储; 当用户需要请求检索数据时,对应分布数据节点会根据索引快速定位数据位置并返回给用户;当用户修改数据时会把修改后的数据加入到系统的接收队列,分布数据节点会把接收队列中的数据依次更新;当用户删除数据的时候,分布数据节点会通过索引定位到该数据并执行删除,同时内存资源管理模块进行内存资源回收。 4。3数据服务功能的内存管理策略 由于在数据服务功能中主要是对世系数据的大量结构化查询,分布数据节点采用T树索引结构来存储元组信息。 其中每个节点的数据中都含有人物对象的详细信息和分别指向父亲、母亲、过继或兼祧父亲、过继或兼祧母亲的四个指针。 同时建立哈希索引(同第4。2节)。 当数据录入导致本族谱世系数据发生改变的时候,会对内存T树索引和哈希索引进行更新,分为以下几种情况。 (1) 如果需要增加新的元组,系统会对T树索引做插入操作并更新哈希索引; (2) 如果需要更新某个元组,系统会通过T树索引找到旧元组直接进行更新如需要则同时更新哈希索引; (3) 如果需要删除某个元组,系统会先通过T树索引找到该元组然后删除该元组,更新T树索引和哈希索引,同时资源管理模块进行内存资源回收。 在数据服务功能中,当用户请求一键寻祖的时候输入要寻祖的人物谱名和祖先的世代数(可以不输入,默认为族谱中最小的世代数),分布数据节点会首先通过哈希索引找到T树索引中对应的人物对象元组节点。 如果存在多个重名的人物对象则会返回几个人物对象的具体信息供用户选择;如果该谱名只对应一个人物对象或者用户从重名人物中选择了一个人物对象,则分布数据节点会从世系树中该人物对象节点开始循环地通过父亲或兼祧父亲指针寻找祖先节点;当该祖先的世代数等于用户输入的值,则停止循环并返回该祖先节点元组给用户。 4。4数据输出功能的内存管理策略 在数据输出功能中,每个用户需要首先选择族谱,分布数据节点把对应的族谱数据作为热点数据载入到内存数据库中,在后续的族谱编排和族谱生成中可以直接访问分布数据节点的内存,并建立T树索引(同第4。2节)。 当用户对世系数据进行分组(可以按照个人或者是世代分组)时,分布数据节点会通过T树索引检索对应人物更新其分组号;当用户按照需求对世系和文档进行分卷时,会对世系分组和文档数据进行排序用于生成对应的电子族谱,同时分布数据节点会按照用户的编排顺序对内存中的数据进行排序;当用户选择相应的模板请求族谱生成的时候,分布数据节点会根据模板的格式生成族谱并返回给用户。 4。5数据同步策略 在族谱信息系统中,每个分布数据节点的内存数据库保存着实时数据,但是内存属易失性存储,为了提高数据的可靠性,必须和外存数据库进行数据同步。 同时中心数据节点作为所有分布数据节点族谱数据的副本也需要和分布数据节点进行数据同步。 4。5。1分布数据节点内外存数据同步 分布数据节点内外存数据同步属于单向同步,除了内存数据初始化外,数据都是从内存数据库传输到外存数据库当中。 在族谱信息系统中,分布数据节点的内外存数据同步是由常驻后台进程MMSyn来实现的。 分布数据节点启动后,MMSyn进程就会自动启动。 MMSyn进程启动时需要初始化系统设置的同步周期时间和进程数阀值。 MMSyn进程在上次同步操作完成和下次同步操作开始之间会休眠一个同步周期。 每次MMSyn进程被唤醒之后,会通过事务日志来检测是否存在数据更新,如果有而且当前的进程数低于阀值就进行数据更新,否则MMSyn进程继续休眠。 MMSyn进程在数据更新过程前会读取存储的上次完成同步的事务日志序列号,从下一事务日志开始在外存里重做事务操作从而完成同步。 4。5。2分布数据节点与中心数据节点的数据同步 分布数据节点分散存储着各个代理商代理录入的族谱信息,而中心数据节点作为稳定的中心数据备份必须和分布数据节点进行数据同步。 分布数据节点与中心数据节点的数据同步属于单向同步,除了分布数据节点崩溃从中心数据节点恢复以外,数据都是从分布数据节点传输到中心数据节点当中。 在族谱信息系统中,分布数据节点与中心数据节点的数据同步是由分布数据节点常驻后台进程DSyn和中心数据节点常驻后台进程CSyn来实现的。 在族谱信息系统启动后,CSyn和DSyn进程会自动启动。 和MMsyn进程相似,DSyn进程在启动时需要初始化系统设置的同步周期时间和进程数阀值。 每次DSyn进程被唤醒之后,会读取存储的上次完成同步的事务日志序列号n,如果当前最大的日志序列号m>n(日志序列号是递增的),则将n<日志序列号>m的日志发送给中心数据节点。 中心数据节点一旦启动,就会开启CSyn进程。 当分布数据节点发送过来日志序列时,CSyn重做事务操作从而完成同步。 5结论 本文设计并实现的族谱信息系统采用了B/S架构,能更好地支持族谱数据的分散录入以及集中共享的现实需求。 在族谱数据管理方面采用了分布式结构,其中包括中心数据节点和分布数据节点。 中心数据节点存储全部族谱的数据,分布数据节点存储对应代理商录入的族谱数据,通过同步策略实现中心数据节点和各个分布数据节点的数据同步,大大加强了系统的可靠性和灵活性。 分布数据节点引入了内存数据管理技术,采用列存储模型存储结构,并根据用户具体的请求初始化热点数据,建立索引。 用户的操作在分布数据节点内存中进行,加快了系统的响应速度。 同时,系统利用事务日志进行分布数据节点的内外存同步和内存数据库恢复,增强了系统的可靠性。 一、应用程序没有检查内存分配失败 程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的指针,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。 若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用指针,继续在之后的运行中使用这块内存。真正的0地址内存区保存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即死机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大, 这时候,就会出现上述的“写内存”错误,并指出被引用的内存地址为“0x00000000”。 内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统文件之后。 二、应用程序由于自身BUG引用了不正常的内存指针 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的指针已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是 作终止运行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊! 像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效指针不一定总是0,因此错误提示中的内存地址也不一定为“0x00000000”,而是其他随机数字。 如果系统经常有所提到的错误提示,下面的建议可能会有帮助: 1.查看系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2.更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统文件、修正系统参数。有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。 2000是一个基于性能的操作系统,所以充分挖掘内存子系统的潜力是非常必要的。在本文中,我们要给大家介绍如何给操作系统消肿和优化注册表,以达到改进系统性能的目的。不同的方面有不同的优化方法,我们首先从BIOS的优化开始(BIOS的优化对所有操作系统有效);然后是其它一些优化。要注意在进行优化的时候,要以Administrator注册,否则修改无效。 BIOS优化 在BIOS中有若干个与内存有关的选项,下面我们就给大家介绍几个最常用的: CASLatency-CAS延迟是一个决定系统内存列存取时间的参数。CAS延迟越小,系统在读取RAM中不同数据时的速度就越快。现在大多数SDRAM CAS延迟标称值为3,但基本上都可以达到2。在市场上也有标称值为2的SDRAM。至于RDRAM,它的CAS延迟要比SDRAM大得多,如果把CAS延迟设小一点效果非常显著。不过要注意的是改变CAS延迟实际上是一种超频,要注意它的稳定性(可以运行如timedemo loop之类的稳定性测试软件), RASToCAS Delay-这项设置指的是行激活命令到读/写命令之间的时间。这个值越小表示越快,在修改它时,也要注意系统的稳定性。 RASPrechargeTime -这项设置指的是DRAM预充电需要多少个周期的时间,越小越好。在修改它的时候,同样要注意稳定性。 SDRAMPrechargeControl-这项设置指的是系统如何管理SDRAM的预充电时间,它有两个值Enabled和Disabled,在不同的系统上有不同的结果,建议在你自己的系统上两者都试一下。 ShadowSystem BIOS-如果它为Enabled的话,在系统启动时会把BIOS中的内容拷贝到主内存中,对大多数机器来说,启动速度和运行速度都会加快。 SystemBIOS Cacheable-当设为Enabled时,在必要时系统会把BIOS中的内容备份到L2缓存中,加快BIOS的运行速度,效果比Shadow SystemBIOS还要好。当ShadowSystemBIOS也设为Enabled时,效果最佳。 注册表修改 几乎所有的SQL Server内存分配都是使用虚拟内存,大部分的内存分配的代码分解到最后都是调用Win32的VirtualAllo和VirtualFree API函数。SQL Server通过调用VirtualAllo函数来预留和提交虚拟内存,通过VirtualFree函数来释放内存。 因此通过合理优化内存配置、扩充虚拟内存提高计算机运算速度也就成了一项很重要的应用技术手段。 1 优化Windows系统内存配置 以Windows2000 Server为例,Windows2000 Server系统建议最少256MB RAM。如果再添加一些服务和应用程序,则其对于内存的需求就会增大。如: (1)添加网络服务需要4MB内存空间。 (2)容错功能和系统保护功能需要8MB内存(如磁盘镜像和分条功能)。 (3)进行图形图像处理需要增加16MB内存空间。 (4)安装VC、VB开发系统需要增加16MB内存空间。 另外,如在Windows NT上构建大型数据库如SYBASE、Microsoft SQL Server等,对内存的需求就更多了。 为了使Windows NT不过分占用较多的内存或者浪费处理器的时间用于换页,可以采用关闭不需要的服务程序或驱动程序、尽量不要在服务器上使用其他应用程序等方法优化内存性能。 设置合适的虚拟内存也将提高系统的性能。在设置Windows NT虚拟内存时需要合理确定各个驱动器分页文件的“起始大小”和“最大值”两个参数,它们用于指定分页文件的起始空间和最大空间。分页文件起始大小应保留缺省设置,一般情况下不要改动;分页文件理想的最大尺寸为系统物理内存尺寸的2.5倍至4倍。需要说明的是:如果系统工作时不需要大量内存,请选择靠近下限的值,即用系统物理内存的2.5倍作为这个尺寸的起始值;如果系统工作时需要大量内存,请选择靠近上限的值。 此外,尽可能设立专用硬盘配置内存交换区,或将交换空间放到主硬盘的另一个分区,同时应降低主硬盘的交换文件大小,这样主硬盘(分区)仅用来放置操作系统和应用程序,就可以减少交换次数,防止频繁交换耗费大量CPU时间。 虚拟内存技术的确改善了Windows NT系统的性能,但也受到机器硬盘空间大小、硬盘速度、处理器速度的影响,从理想角度出发,要提高计算机的性能就必须减少交换操作的次数,但是没有一个Windows NT计算机不发生交换,这就要求计算机要有足够的物理内存,以保持最少的交换操作。 2 优化数据库内存配置 Microsoft SQL Server 2000的内存管理组件消除了对SQL Server可用的内存进行手工管理的需要。SQL Server在启动时根据操作系统和其他应用程序当前正在使用的内存量,动态确定应分配的内存量。当计算机和SQL Server上的负荷更改时,分配的内存也随之更改。 (1)min server memory:服务器配置选项可用于确保SQL Server至少以最小的分配内存量启动,并且内存低于该值时不会释放内存。可以基于SQL Server的大小及活动将该配置选项设置为特定的值。 (2)max server memory:服务器配置选项可用于:在SQL Server启动及运行时,指定SQL Server可以分配的最大内存量。 不要将min server memory和max server memory服务器配置选项设置为相同的值,这样做会使分配给SQL Server的内存量固定。也就是说一旦分配给数据库引擎的内存达到该值,数据库引擎将停止动态释放和获取内存。动态内存分配可以随时间提供最佳的总体性能。 (3)max worker threads:服务器配置选项可用于指定为用户连接到SQL Server提供支持的线程数。255这一默认设置对一些配置可能稍微偏高,这要具体取决于并发用户数。一般情况下,应将该配置值设置为并发连接数,但不能超过1,024。当SQL Server运行在Microsoft Windows 95或Microsoft Windows 98上时,最大工作线程服务器配置选项不起作用。 (4)index create memory:服务器配置选项控制创建索引时排序操作所使用的内存量。增加该值可提高索引创建的性能。 (5)min memory per query:服务器配置选项可用于指定分配给查询执行的最小内存量。当系统内有许多查询并发执行时,增大min memory per query的值有助于提高消耗大量内存的查询的性能。 参考文献 [1](美)Jenney Lynne Fields著,袁勤勇,等译.Microsoft SQL Server2000优化指南.清华大学出版社. [2]张璞.大型数据库应用系统中的数据库性能优化方法[期刊论文].现代计算机(专业版),2004(11). A:你所说的这个问题通常被称为“内存泄漏”,也就是说Android应用关闭后系统依然不释放相应的内存。这样剩余的内存就会越来越少,最后导致后台进程频频重新启动。既然已经知道重新启动是最好的解决方法,那么就可以安装一个名为Phoenix的应用,这样就可以根据需要设置系统自动重启的条件,当条件符合以后就会自动重启。 ◆ 重新找回支付宝的手势密码 Q:我最近将支付宝应用升级到最新版本,结果发现常用的手势密码没有了,取而代之的是系统的Touch ID功能。那么有没有什么方法,可以重新使用手势密码呢? A:支付宝并没有完全取消手势密码,所以要想使用的话,首先打开支付宝,通过“服务窗”找到“支付宝客户中心”,接着点击左下角“遇到问题”中的“服务大厅”这项。然后在输入框里面输入“如何开启手势密码”,找到答案以后根据提示点击“设置手势密码”,最后即可设置对应的手势密码了。 ◆ 利用空格键快速选择词组 Q:我最近买了一个iPhone 6的手机,用着感觉还不错,就是屏幕大了单手操作不方便,尤其是在文字输入的时候,选词非常麻烦。那么有没有什么方法可以解决这个问题? A:其实要解决这个问题还是很简单的,通过键盘中的空格键就可以完成操作。比如要选择第一个词组就按一下空格键,这时光标就会自动移动到这个词组上,再点击“确认”按钮进行提交即可。如果要选择第二个词组,连续按两下空格键即可选择,其他的操作以此类推(前提是不能开启“句号快捷键”功能)。 ◆ 通过手机扫描图片中的文本 Q:走到街上经常会看到一些推广资料,有的内容可能觉得以后会有些用,所以就会通过手机将其拍摄下来。那么有没有什么方法,可以将图片中的文字转换出来? A:其实利用拥有OCR技术的软件,就可以解决你所遇到的问题。比如微软最新发布的“Office Lens”应用,通过它就可以轻松地识别出图片中的中文以及其他文字信息。识别完成以后会将其转换为Word文件,这样通过编辑器就可以进行编辑操作了。 ◆ 微信朋友圈缓存图片的存放位置 Q:以前我曾经浏览过一个朋友圈好友的图片,但是今天发现好友把朋友圈那张图片删了。请问一下我手机里还缓存有这张图片吗?这张图片应该放在Android系统的哪个文件夹中? Vista对内存的要求就好像人的胃一样,总是有一个承受的最大值。对Vista来说,其各个版本所支持的最大物理内存都有一个固定的值。 而Vista各个版本中,Windows Vista Starter版是对内存容量要求最低的一个版本,其32位版本仅仅支持最多1GB的内存。 32位版本的Windows Vista Home Basic、Home Premium、Business、Enterprise和Ultimate支持的内容容量最大值都为4GB,需要注意的是,这里所谓的“4GB”并非等同于真正的物理内存,而是指可用的内存寻址空间。 而64位Vista最大支持内存容量要比32位高许多, 在一台运行x64 Vista Home Basic的系统中,你至多可以添加8GB的内存,而x64 Vista Home Premium则至多支持16GB的内存。 但是对于x64 Vista Business、Enterprise和Ultimate来说,其最多可以支持到128GB内存。 因此,可以这么说,128GB是Vista所支持的内存容量的最大值。 分 析 系统感染尼姆达病毒后,该病毒会覆盖操作系统中WindowsSystem文件夹内的Riched20.Dll文件,而Word在启动时必须调用此文件,所以导致系统提示“内存不足”的现象。虽然用杀病毒软件清除了尼姆达病毒,但仍然不能恢复该文件,因此清除病毒后仍然提示“内存不足”, 排除过程 可以使用下面任意方法解决。 (1)从使用相同操作系统的其他电脑中复制一个正常的Riched20.dll文件,覆盖本机中被破坏的文件。 (2)通过Windows安装光盘,利用Extract命令将Riched20.dll文件从压缩包中释放出来,复制到相应目录。在Windows 98第l版中,Riched20.dU文件位于Win98_5.CAB中,在Windows 98第2版中该文件夹位于Win98_41.CAB中。 启 示 【操作系统内存管理实验】推荐阅读: 内存管理系统06-12 山大操作系统实验一05-16 操作系统实验教学研究06-24 上海大学操作系统实验08-03 操作系统形考任务实验08-22 内存系统10-28 基于linux的操作系统实验教学改革研究08-12 山东大学操作系统实验五理发师问题报告06-13 基于内存的文件系统07-21 系统内存使用率05-27操作系统内存管理实验 篇2
操作系统内存管理实验 篇3
操作系统内存管理实验 篇4
操作系统内存管理实验 篇5
Win系统内存优化全攻略 篇6
操作系统内存管理实验 篇7
解决内存泄漏自动重启系统 篇8
操作系统内存管理实验 篇9
杀除病毒后系统仍然提示内存不足 篇10