实验4 内存管理资料讲解

实验4 内存管理资料讲解
实验4 内存管理资料讲解

实验4内存管理

实验4 内存管理

学校:FJUT 学号:3131903229 班级:计算机1302 姓名:姜峰

注:其中LFU和NRU算法运行结果可能与其他人不同,只是实现方式不同,基本思路符合就可以。

一. 实验学时与类型

学时:2,课外学时:自定

实验类型:设计性实验

二. 实验目的

模拟实现请求页式存储管理中常用页面置换算法,理会操作系统对内存的调度管理。

三. 实验内容

要求:各算法要给出详细流程图以及执行结果截图。

假设有一程序某次运行访问的页面依次是:

0,1,2,4,3,4,5,1,2,5,1,2,3,4,5,6,请给出采用下列各页面置换算法时页面的换进换出情况,并计算各调度算法的命中率(命中率=非缺页次数/总访问次数),初始物理内存为空,物理内存可在4~20页中选择。

(1) FIFO:最先进入的页被淘汰;

(2) LRU:最近最少使用的页被淘汰;

(3) OPT:最不常用的页被淘汰;(选做)

(4) LFU:访问次数最少的页被淘汰(LFU)。(选做)

源代码:

#include

#include

#include

#include

#define MAXNUM 100

struct Phy_Memory{ //定义一个物理内存结构体

char Page;

int time;

};

char *OutPut;

struct Phy_Memory *Phy_Page;

void Print(char *PageStr,int Phy_PageNum,int absence){ //打印图解函数

int i,j;

for(i=0;i

for(i=0;i

for(i=0;i

for(j=0;j

printf("%c ",*(OutPut+i*strlen(PageStr)+j));

}

printf("\n");

}

printf("缺页数为:%d\n",absence);

printf("总访问次数为:%d\n",strlen(PageStr));

printf("缺页率为%.2f\n",(double)absence/strlen(PageStr));

}

int IsExist(char *Temp,int Phy_PageNum){ //判断某页面是否存在于物理内存中

int i;

for(i=0;iPage!=*Temp;i++);

if(i

return 0;

}

void FIFO(char *PageStr,int Phy_PageNum){ //利用时间计数器方式,还可以用栈来实现

char *Temp=PageStr; //定义Temp指针指向PageStr首地址

int i,num,location,absence=0;

int Flag=0; //定义一个标记变量,标记插入位置

while(*Temp!='\0'){ //页面未访问完

num=0;

if(Flag

if(!IsExist(Temp,Flag)){ //若此页面未被访问

(Phy_Page+Flag)->Page=*Temp;

Flag++;absence++;

}

}

else{ //若物理内存已满

if(!IsExist(Temp,Phy_PageNum)){ //若此页面未被访问

for(i=0;i

if(num<(Phy_Page+i)->time){

location=i;num=(Phy_Page+i)->time;

}

}

(Phy_Page+location)->Page=*Temp;

(Phy_Page+location)->time=0;

absence++;

}

}

for(i=0;i

(Phy_Page+i)->time++;

*(OutPut+i*strlen(PageStr)+(Temp-PageStr))=(Phy_Page+i)->Page;

}

Temp++;

}

Print(PageStr,Phy_PageNum,absence);

}

void LRU(char *PageStr,int Phy_PageNum){ //依旧利用计数器方式,也可用栈来实现

char *Temp=PageStr; //定义Temp指针指向PageStr首地址

int i,num,location,absence=0;

int Flag=0; //定义一个标记变量,标记插入位置

while(*Temp!='\0'){ //页面未访问完

num=0;

if(Flag

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问 (Phy_Page+location-1)->time=0;

}

else{ //若此页面未被访问

(Phy_Page+Flag)->Page=*Temp;

Flag++;absence++;

}

}

else{ //若物理内存已满

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问 (Phy_Page+location-1)->time=0;

}

else{ //若此页面未被访问

for(i=0;i

if(num<(Phy_Page+i)->time){

location=i;num=(Phy_Page+i)->time;

}

}

(Phy_Page+location)->Page=*Temp;

(Phy_Page+location)->time=0;

absence++;

}

}

for(i=0;itime++;

*(OutPut+i*strlen(PageStr)+(Temp-PageStr))=(Phy_Page+i)->Page; }

Temp++;

}

Print(PageStr,Phy_PageNum,absence );

}

int Distance(char *PageStr,char *Temp,char Now){ //计算距离函数(OPT算法中使用)

int i;

for(i=1;*(Temp+i)!='\0'&&*(Temp+i)!=Now;i++);

if(*(Temp+i)!='\0')return i;

return INT_MAX;

}

void OPT(char *PageStr,int Phy_PageNum){ //实际中无法实现,知道访问串后顺序遍历

char *Temp=PageStr; //定义Temp指针指向PageStr首地址

int i,num,Size,location,absence=0;

int Flag=0; //定义一个标记变量,标记插入位置

while(*Temp!='\0'){ //页面未访问完

num=0;

if(Flag

if(!IsExist(Temp,Flag)){ //若此页面未被访问

(Phy_Page+Flag)->Page=*Temp;

Flag++;absence++;

}

}

else{ //若物理内存已满

if(!IsExist(Temp,Phy_PageNum)){ //若此页面未被访问

for(i=0;i

Size=Distance(PageStr,Temp,(Phy_Page+i)->Page); //调用distance 函数返回值为与当前位置物理页面相同页号的距离

if(num

location=i;num=Size;

}

}

(Phy_Page+location)->Page=*Temp;absence++;

}

}

for(i=0;i

*(OutPut+i*strlen(PageStr)+(Temp-PageStr))=(Phy_Page+i)->Page;

Temp++;

}

Print(PageStr,Phy_PageNum,absence);

}

char *Create(char *PageStr){ //根据访问串建立计数字符数组(LFU算法使用)

int i,j,Size,Num=0;

char *Temp1,*Temp2;

int length=strlen(PageStr);

char *NowPage=(char *)malloc(length);

for(i=0;i

Temp1 = Temp2 = NowPage;

while((Temp1-NowPage)<=length+1){ //去除访问串中重复串

if(*Temp1!='\0'){

for(Temp2=Temp1+1;(Temp2-NowPage)<=length+1;Temp2++){

if(*Temp1==*Temp2){

*Temp2='\0';Num++;

}

}

}

Temp1++;

}

Size=length-Num;

char *Count=(char *)malloc(Size*2);

for(i=0;i

if(*(NowPage+i)!='\0'){

*(Count+Size-1)=*(NowPage+i);

Size--;

}

}

Size=length-Num;

for(i=Size;i<2*Size;i++){ //计数位置零

*(Count+i)='0';

}

return Count;

}

void Add(char *Ptr,char Str,int Size){ //相应计数器加一(LFU算法使用)

int i;

for(i=0;*(Ptr+i)!=Str;i++);

*(Ptr+i+Size)+=1;

}

int Find(char *Ptr,char Str,int Size){ //在计数器中找到相应页面并返回其计数值(LFU算法使用)

int i;

for(i=0;*(Ptr+i)!=Str;i++);

return (*(Ptr+i+Size)-'0');

}

void Zero( char *Ptr, int Size ){ //将所有计数器清零(LFU算法使用)

int i;

for(i=Size;i<2*Size;i++) *(Ptr+i)='0';

}

void LFU(char *PageStr,int Phy_PageNum){ //对每一页面设置一个计数器,每次选出最小的淘汰

char *Temp=PageStr; //定义Temp指针指向PageStr首地址

char *Count=Create(PageStr);

int i,Size,time,num,location,absence=0;

int Flag=0; //定义一个标记变量,标记插入位置

Size=strlen(Count)/2;

while(*Temp!='\0'){ //页面未访问完

num=INT_MAX;

if(Flag

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问

Add(Count,(Phy_Page+location-1)->Page,Size);

}

else{ //若此页面未被访问

(Phy_Page+Flag)->Page=*Temp;

Flag++;absence++;

}

}

else{ //若物理内存已满

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问 Add(Count,(Phy_Page+location-1)->Page,Size);

}

else{ //若此页面未被访问

for(i=0;i

time=Find(Count,(Phy_Page+i)->Page,Size);

if(num>time){

location=i;num=time;

}

}

(Phy_Page+location)->Page=*Temp;

Zero(Count,Size);

absence++;

}

}

for(i=0;i

*(OutPut+i*strlen(PageStr)+(Temp-PageStr))=(Phy_Page+i)->Page; Temp++;

int j; //打印每次访问后的计数器值

for(i=0;i<2;i++){

for(j=0;j

printf("%c ",*(Count+i*Size+j));

printf("\n");

}

printf("\n");

}

Print(PageStr,Phy_PageNum,absence);

}

void NRU(char *PageStr,int Phy_PageNum){ //对每个物理页设置一个标识(0/1),用指针循环访问淘汰标识为零的页面

char *Temp=PageStr; //定义Temp指针指向PageStr首地址

int i,location,absence=0;

int Flag=0; //定义一个标记变量,标记插入位置

struct Phy_Memory *Clock = Phy_Page; //定义一个结构体指针指向物理内存首地址

while(*Temp!='\0'){ //页面未访问完

if(Flag

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问

(Phy_Page+location-1)->time=1;

}

else{ //若此页面未被访问

(Phy_Page+Flag)->Page=*Temp;

(Phy_Page+Flag)->time=1;

Flag++;absence++;Clock++;

if((Clock-Phy_Page)>=Phy_PageNum) Clock=Phy_Page;

}

}

else{ //若物理内存已满

if(location=IsExist(Temp,Phy_PageNum)){ //若此页面已被访问

(Phy_Page+location-1)->time=1;

}

else{ //若此页面未被访问

while(Clock->time){

Clock->time=0;Clock++;

if((Clock-Phy_Page)>=Phy_PageNum) Clock=Phy_Page;

}

Clock->Page=*Temp;

Clock->time=1;Clock++;

if((Clock-Phy_Page)>=Phy_PageNum) Clock=Phy_Page;

absence++;

}

}

for(i=0;i

*(OutPut+i*strlen(PageStr)+(Temp-PageStr))=(Phy_Page+i)->Page;

}

Temp++;

}

Print(PageStr,Phy_PageNum,absence );

}

int main(){

char *Str;int i,n,Num;

Str=(char*)malloc(MAXNUM);

printf("输入程序运行时访问的页面次序以及物理内存的分页数:\n");

scanf("%s%d",Str,&Num);

Phy_Page=(struct Phy_Memory*)malloc(Num*sizeof(struct Phy_Memory)); //初始化物理内存结构体

OutPut=(char*)malloc(Num*strlen(Str));

for(i=0;itime=0;

printf("选择置换算法:\n1.FIFO 2.LRU 3.OPT 4.LFU 5.NRU\n");

scanf("%d",&n);

switch (n){

case 1:printf("\n以下为FIFO算法图解:\n");FIFO(Str,Num);break;

case 2:printf("\n以下为LRU算法图解:\n");LRU(Str,Num);break;

case 3:printf("\n以下为OPT算法图解:\n");OPT(Str,Num);break;

case 4:printf("\n以下为LFU算法图解:\n各时期计数器如

下:\n");LFU(Str,Num);break;

case 5:printf("\n以下为NRU算法图解:\n");NRU(Str,Num);break;

}

free(Phy_Page);free(OutPut);

return 0;

}

注:这里只对分页数为4进行运行截图

硬盘分区格式化实验报告

实验报告 课程: 计算机组装与维护 学号: 姓名: 某某某 专业: 软件工程 班级: 软件工程班

实验时间: 2012 年 _月__ _日星期_ 实验地点:逸夫楼A701 实验名称:硬盘的分区格式化 实验目的: 1.掌握分区的原因,了解FAT16、FAT32、NTFS格式。2.掌握硬盘参数的设置。 3.掌握用FDISK命令将硬盘分为多个逻辑盘的方法。4.熟练掌握逻辑盘的格式化。 5、掌握利用第三方工具去分区操作 6、掌握硬盘分区表格式 实验准备: 装有WINDOWS操作系统和VPC的一台计算机。 WINxp、Windows7映象文件。 刻录机一台(利用U盘启动盘制作工具,制作U盘)回忆有关概念 实验环境: 7号微机室

实验理论: 在虚拟机上利用fidisk命令对硬盘进行分区 format命令对硬盘进行高级格式化

实验步骤: 1.硬盘分区 ①用VPC工具虚拟一台PC机,载入WIN98映像文件,启动VPC,引导到光盘。 ②机器启动后进入DOS工作状态,在DOS提示符>后键入硬盘分区命令: A:\>Fdisk↙ 出现如图13-2所示的界面。 ③键入“Y”,进入Fdisk分区主界面。主界面以菜单形式显示,共有的四个菜单项,如图所示。 其中,第一项为建立DOS分区DOS逻辑驱动器;第二项为设置活动分区;第三项为删除分区或逻辑驱动器;第四项为显示有关分区信息。 ④建立分区,选择第一项出现如下菜单,用来建立DOS分区,或DOS逻辑驱动器。 其中,第一项为建立基本分区;第二项为建立扩展分区;第三项为建立扩展分区中的逻辑驱动器。第四项为显示分区信息。 选择"1"后回车,建立主分区(Primary Partition)。这时系统会询问你是否使用最大的可用空间作为主分区,如果回答“Y”,那么软件就会将所有的磁盘空间划分成一个分区,回答"N"则可以划分多个分区,对于现在的硬盘来说,一般都比较大,如果划分成一个分区就不太好管理,因此可以选择输入"N"来分成多个分区。例如,将硬盘创 建三个逻辑盘C:、D:和E:,要求C盘占整个硬盘容量的一半,D盘和E盘各占整个硬盘容量的四分之一。软件会提示你输入主分区C盘的大小(或百分比),输入后回车。 ⑤按键退回上一步,机器重新扫描剩余空间,输入D盘容量大小或百分比,过一会儿,再按照上述方法输入E盘容量大小或百分比即可。 ⑥激活分区。设置完分区后,按键回到Fdisk主界面,选择“2”进入另一个菜单界面,再输入“1”设置活动分区(即把C盘设置为活动分区)。 ⑦删除分区和查看分区信息。在Fdisk主界面中分别选择第3项和第4项,分别用来删除和查看有关分区信息。 2、格式化硬盘 ①分区完成后,系统自动重新启动机器,。在DOS提示符“>”下,使用Format 命令,对各逻辑盘进行格式化:

北理工操作系统内存管理实验报告

实验三:内存管理 班级: 学号:

姓名: 一、实验目的 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2.熟悉虚存管理的页面淘汰算法; 3.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二、实验要求 1.设计一个请求页式存储管理方案(自己指定页面大小),并予以程序实现。 并产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。 2.页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页 表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 3.系统运行既可以在Windows,也可以在Linux。 三、实验流程图

图1 页式存储管理程序参考流程 四、实验环境 硬件设备:个人计算机。 系统软件:windows操作系统,Visual C++6.0编译环境。 五、实验结果

说明:模拟产生35个指令地址,随机产生20个指令地址进行排队,假设主存中共有10个工作集页帧。将前9个指令调入内存,因为前9个指令中,页号为13的指令有两个,所以调入内存中共有8页。此时主存中还有两个空闲帧。此时按刚才随机顺序进行访问指令工作。前9页因都在主存中可直接调用。第10个随机地址为页号为5的指令,也在主存中,也可直接调用。页号为24,3因不在主存中,需要调用进主存。此时主存已满。然后主存需要进行调用页号为27号的指令,因主存已满,需要执行FIFO算法,将最先进入主存的页号为30的指令调出,将27号放入第1000000帧。以后需要调用的页面按照存在就无需调用,否则按FIFO原则进行调页工作。 六、实验感想 七、实验代码 #include

存储管理实验报告

实验三、存储管理 一、实验目的: ? 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验理解在分页式存储管理中怎样实现虚拟存储器。 在本实验中,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二、实验题目: 设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:(任选一种算法实现) 首次适应算法 循环首次适应算法 最佳适应算法 三.实验源程序文件名:cunchuguanli.c

执行文件名:cunchuguanli.exe 四、实验分析: 1)本实验采用可变分区管理,使用首次适应算法实现主存的分配和回收 1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并 且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 为了说明那些分区是空闲的,可以用来装入新作业,必须有一张空闲说明表 ? 空闲区说明表格式如下:? 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址,长度指出空闲区的大小。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业完成后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。 2、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。 有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分

磁盘和文件系统管理(二)实验报告

制作LVM卷的步骤: 裸设备---分区---PV---VG---LV---格式化---挂载使用 [root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 建立pv物理卷 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdc1" successfully created [root@localhost ~]# vgcreate hehe /dev/sdb1 /dev/sdc1 建立vg卷组 Volume group "hehe" successfully created [root@localhost ~]# lvcreate -L 30G -n xixi hehe 建立lv逻辑卷 Logical volume "xixi" created [root@localhost ~]# mkfs.ext3 /dev/hehe/xixi 格式化为ext3的文件系统mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) [root@localhost ~]# mkdir /lvm 创建lvm文件夹 [root@localhost ~]# mount /dev/hehe/xixi /lvm 挂载lvm逻辑卷到lvm文件夹下使用[root@localhost ~]# cd /lvm 切换 [root@localhost lvm]# ls 查看 lost+found [root@localhost lvm]# df -hT 查看磁盘使用情况 文件系统类型容量已用可用已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 ext3 38G 3.1G 33G 9% / /dev/sda1 ext3 99M 11M 83M 12% /boot tmpfs tmpfs 177M 0 177M 0% /dev/shm /dev/mapper/hehe-xixi ext3 30G 173M 28G 1% /lvm [root@localhost lvm]# lvextend -L +3G /dev/hehe/xixi 扩展lvm卷的空间Extending logical volume xixi to 33.00 GB Logical volume xixi successfully resized [root@localhost lvm]# resize2fs /dev/hehe/xixi 重新识别文件系统的大小

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

计算机操作系统内存分配实验报告记录

计算机操作系统内存分配实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。 设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。 设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明

磁盘管理组织的实验报告

实验报告 课程名称:网络操作系统 实验项目名称:Windows Server 2003的磁盘管理 学生姓名:邓学文专业:计算机网络技术学号:1000005517 同组学生姓名:无 实验地点:个人电脑实验日期:2012 年04 月08 日 实训12:Windows Server 2003的磁盘管理 一、实验目的 1、熟悉Windows Server 2003基本磁盘管理的相关操作; 2、掌握Windows Server 2003在动态磁盘上创建各种类型的卷; 3、掌握Windows Server 2003的磁盘限额以及磁盘整理等操作。 二、实验内容 在安装了Windows Server 2003的虚拟机上完成如下操作: 1、在安装了Windows Server 2003的虚拟机上添加五块虚拟硬盘,类型为SCSI,大小为1G,并初始化新添加的硬盘;添加一块IDE 类型的磁盘,大小为1.2GB。 2、选择添加的第一块硬盘,在磁盘上创建主分区“D:”,然后创建扩展分区,在扩展分区中创建逻辑盘“E:”和“F:”,最后将这块磁盘升级为动态磁盘。 3、利用添加五块虚拟硬盘,创建简单卷、扩展简单卷、跨区卷、带区卷、镜像卷、RAID-5卷,对具有容错能力的卷,用虚拟机删除虚拟硬盘来模拟硬盘损坏,并尝试数据恢复操作。 4、对磁盘“D:”做磁盘配额操作,设置用户User1的磁盘配额空间为100MB,随后分别将Windows Server 2003安装源程序和VMWARE Workstation 安装源程序复制到D盘,看是否成功。 5、对磁盘“E:”做磁盘清理和碎片整理。 三、实验步骤 1、启动VMWARE,打开预装的Windows Server 2003虚拟机,为虚拟机添加五块

可变分区存储管理方式的内存分配和回收实验报告

一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方 案的理解,熟悉可变分区存储管理的内存分配和回收。 二.实验内容 1.确定内存空间分配表; 2.采用最优适应算法完成内存空间的分配和回收; 3.编写主函数对所做工作进行测试。 三.实验背景材料 实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。 首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。 由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。分配内存时查找空闲区进行分配,然后填写己分

配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,内存的分配和回收主要是对空闲区的操作。这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数。 “已分分区表”的结构定义 #definen10//假定系统允许的最大作业数量为n struct {floataddress;//已分分区起始地址 floatlength;//已分分区长度、单位为字节 intflag;//已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名 }used_table[n];//已分分区表 “空闲区表”的结构定义 #definem10//假定系统允许的空闲区最大为m struct {floataddress;//空闲区起始地址

计算机操作系统内存分配实验报告

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下.如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配.就是解决多道作业或多进程如何共享主存空间的问题。所谓回收.就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区.使分区大小正好适合作业的需求.并且分区个数是可以调整的。当要装入一个作业时.根据作业需要的主存量查看是否有足够的空闲空间.若有.则按需要量分割一个分区分配给该作业;若无.则作业不能装入.作业等待。随着作业的装入、完成.主存空间被分成许多大大小小的分区.有的分区被作业占用.而有的分区是空闲的。 实验要求使用可变分区存储管理方式.分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行.分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时.要求设计一个实用友好的用户界面.并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理.在系统运行当然开始.假设初始状态下.可用的内存空间为640KB.存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后.分给作业1(130KB).随着作业1、2、3的进入.分别分配60KB、100KB.经过一段时间的运行后.作业2运行完毕.释放所占内存。此时.作业4进入系统.要求分配200KB内存。作业3、1运行完毕.释放所占内存。此时又有作业5申请140KB.作业6申请60KB.作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理.使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链.为了实现对空闲分区的分配和链接.在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针.由状态位指示该分区是否分配出去了;同时.在分区尾部还设置有一后向指针.用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间.当该分区分配出去后.状态位就由“0”置为“1”。 设置一个内存空闲分区链.内存空间分区通过空闲分区链来管理.在进行内存分配时.系统优先使用空闲低端的空间。 设计一个空闲分区说明链.设计一个某时刻主存空间占用情况表.作为主存当前使用基础。初始化空间区和已分配区说明链的值.设计作业申请队列以及作业完成后释放顺序.实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。

网络配置实验报告

实验一:磁盘管理和文件系统管理 一、实验目的:掌握Windows Server 2008系统中的磁盘管理和文件系统管理,包括基本磁盘中分区的创建,动态磁盘中各种动态卷的创建。 二、实验属性:验证型 三、实验环境 Pentium 550Hz以上的CPU;建议至少512MB的内存; 建议硬盘至少2GB,并有1GB空闲空间。 四、实验内容 磁盘的管理 文件系统的管理五、实验步骤 (一)、磁盘管理 1、在虚拟机中再添加两块磁盘(问题1:在虚拟机中如何添加新的磁盘?)。 答:在虚拟机界面打开VM中点击Settings然后点击ADD,选择Hard Disk,然后继续按next到完成为止。

1、使用磁盘管理控制台,在基本磁盘中新建主磁盘分区、扩展磁盘分区和逻辑驱动器,并对已经创建好的分区做格式化、更改磁盘驱动器号及路径等几个操作。(问题2:在一台基本磁盘中,最多可以创建几个主磁盘分区?问题3:将FAT32格式的分区转换为NTFS格式的完整命令是什么?) 答:最多可有四个主磁盘分区; 将FAT32格式的分区转换为NTFS格式的完整命令是 Convert F:/FS:NTFS 对已经创建好的分区格式化 更改磁盘驱动器号及路径

3、将三块基本磁盘转换为动态磁盘。(问题4:如何将基本磁盘转换为动态磁盘?问题5:什么样的磁盘由基本磁盘转换为动态磁盘后系统需要重新启动?) 答:若升级的基本磁盘中包含有系统磁盘分区或引导磁盘分区,则转换为动态磁盘后需要重新启动计算机。 4、在动态磁盘中创建简单卷、扩展简单卷、创建跨区卷、扩展跨区卷、创建带区卷、镜像卷和RAID5卷,并对具有容错能力的卷尝试数据恢复操作,掌握各个卷的特点和工作原理。(问题6:哪些卷可以扩展?问题7:哪些卷具有容错功能?问题8:哪个卷可以包含系统卷?问题9:哪些卷需要跨越多个磁盘?问题10:哪个卷至少需要3块磁盘?) 答:简单卷、跨区卷可以扩展,镜像卷和RAID5卷具有容错功能,镜像卷可以包含系统卷。跨区卷、带区卷、镜像卷和RAID5卷都需要跨越多个磁盘。AID5卷至少需要3块磁盘。 对于卷的扩展,对于NTFS格式的简单卷,其容量可以扩展,可以将其他未指派的空间合并到简单卷中,但这些未指派空间局限于本磁盘上,若选用了其他磁盘上的空间,则扩展之后就变成了跨区卷。

实验操作系统存储管理实验报告

实验四操作系统存储管理实验报告 一、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二、实验内容 (1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。 页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。 在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。 (2)produce_addstream通过随机数产生一个指令序列,共320条指令。 A、指令的地址按下述原则生成: 1)50%的指令是顺序执行的 2)25%的指令是均匀分布在前地址部分 3)25%的指令是均匀分布在后地址部分 B、具体的实施方法是: 1)在[0,319]的指令地址之间随机选取一起点m; 2)顺序执行一条指令,即执行地址为m+1的指令; 3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’; 4)顺序执行一条指令,地址为m’+1的指令 5)在后地址[m’+2,319]中随机选取一条指令并执行; 6)重复上述步骤1)~5),直到执行320次指令 C、将指令序列变换称为页地址流

在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中 的存放方式为: 第0条~第9条指令为第0页<对应虚存地址为[0,9]); 第10条~第19条指令为第1页<对应虚存地址为[10,19]); 。。。。。。 第310条~第319条指令为第31页<对应虚存地址为[310,319]); 按以上方式,用户指令可组成32页。 (3)计算并输出下属算法在不同内存容量下的命中率。 1)先进先出的算法

存储器管理实验报告.docx

操作系统实验报告 存储器管理 学院电信学院 专业计算机科学与技术 班级 14级计科一班 实验题目动态分区分配 实验组别第三组 指导老师曹华

一、实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 二、实验内容 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过分区链来管理,在进行内存分配时,系统优先使用空闲区低端的空间。 请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 三、实验主要仪器设备 软件环境:VC++6编程环境 四、实验原理及设计方案 1.实验原理: 可变分区调度算法有:最先适应分配算法,循环首次适应算法,最佳适应算法,最坏适应算法。 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要求的空闲块就停止查找,并把它分配出去; 如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改区分大小和分区始址。 用户提出内存空间的申请:系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。 最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。 内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空,并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。 每当一个进程被创建时,内存分配程序首先要查找空闲内存分区链,从中寻找一个合适的空闲块进行划分,并修改空闲内存分区链,系统根据回收区的首址,从空闲区链中找到相应的插入点,此时出现如下四种情况: (1)回收区与插入点的前一个空闲区F1相邻接,此时可将回收区直接与F1合并,并修改F1的大小; (2)回收区与插入点的后一个空闲分区F2相邻接,此时可将回收区直接与F2合并,并用回收区的首址作为新空闲区的首址,大小为二者之和; (3)回收区同时与插入点的前后两个空闲分区邻接,此时需将三者合并; (4)回收区不与任何一个空闲区邻接,此时应建一新的表项 2.主要数据结构的说明 定义一个空闲区说明表结构

磁盘调度实验报告

操作系统实验报告 磁 盘 调 度

实验六:磁盘调度算法 一.实验目的 复习模拟实现一种磁盘调度算法,进一步加深对磁盘调度效率的理解。 二.实验属性 该实验为设计性实验。 三.实验仪器设备及器材 普通PC386以上微机 四.实验要求 本实验要求2学时完成。 本实验要求完成如下任务: (1)建立相关的数据结构,作业控制块、已分配分区及未分配分区 (2)实现一个分区分配算法,如最先适应分配算法、最优或最坏适应分配算法(3)实现一个分区回收算法 (4)给定一批作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理

实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。 五 .主要算法分析 各个算法分析 1.先来先服务算法(FCFS) 先来先服务(FCFS)调度:按先来后到次序服务,未作优化。 最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 2.最短寻道时间优先算法(SSTF) 最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论,现在当50号柱面的操作结束后,应该先处理61号柱面的请求,然后到达32号柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、159、199。 采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有

操作系统 内存管理实验报告

同组同学学号: 同组同学姓名: 实验日期:交报告日期: 实验(No. 4 )题目:编程与调试:内存管理 实验目的及要求: 实验目的: 操作系统的发展使得系统完成了大部分的内存管理工作,对于程序员而言,这些内存管理的过程是完全透明不可见的。因此,程序员开发时从不关心系统如何为自己分配内存,而且永远认为系统可以分配给程序所需的内存。在程序开发时,程序员真正需要做的就是:申请内存、使用内存、释放内存。其它一概无需过问。本章的3个实验程序帮助同学们更好地理解从程序员的角度应如何使用内存。 实验要求: 练习一:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果,分析遇到的问题和解决方法。 练习二:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 练习三:用vim编辑创建下列文件,用GCC编译工具,生成可调试的可执行文件,记录并分析执行结果。 改编实验中的程序,并运行出结果。 实验设备:多媒体电脑 实验内容以及步骤: 在虚拟机中编写好以下程序: #include #include #include int main(void) { char *str; /* 为字符串申请分配一块内存*/ if ((str = (char *) malloc(10)) == NULL) { printf("Not enough memory to allocate buffer\n"); return(1); /* 若失败则结束程序*/ } /* 拷贝字符串“Hello”到已分配的内存空间*/ strcpy(str, "Hello"); /* 显示该字符串*/ printf("String is %s\n", str); /* 内存使用完毕,释放它*/ free(str); return 0; } 调试过后得出的结果截图如下:(由图可看出我将此程序以aa.c为文件名保存,调试后出现aa1文件,调试结果出现语句“String is Hello”)

内存管理实验报告

内存管理实验报告

信息科学与技术学院实验报告 课程名称: 实验项目: 实验地点:指导教师: 日期: 实验类型:(验证性实验综合性实验设计性实验) 专业: 计算机外包班级: 14外三姓名: 周鹏飞学号: 1414104033 一、实验目的及要求 通过此次实验,加深对内存管理的认识,进一步掌握内存的分配,回收算法的思想。 二、实验仪器、设备或软件 Windows操作系统PC一台;VC++6.0 三、实验内容及原理 原理:设计程序模拟内存的动态分区内存管理方法。内存空闲区使用空闲分区表进行管理,采用最先适应算法从空闲分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲分区的合并。 假定系统的内存共640k,初始状态为操作系统本身占用40k.t1时刻,为作业A,B,C分配80k,60k,100k的内存空间;t2时刻作业B完成;t3时刻为作业D分配50k的内存空间;t4时刻作业C,A完成;t5时刻作业D完成。要求编程序分别输出t1,t2,t3,t4,t5时刻内存的空闲区的状态。 实验内容: #include #include #define maxPCB 6 //最大进程数 #define maxPart 6 //最大空闲分区数

#define size 10 //不再切割剩余分区的大小 typedef struct PCB_type { char name;//进程名 int address;//进程所占分区首地址 int len;//进程所占分区的长度 int valid;//PCB标识符(有效,无效) }PCB; Typedef struct seqlist //进程信息队列 { PCB PCBelem[maxPCB];// maxPCB为为系统中允许的最多进程数 int total; //系统中实际的进程数 }PCBseql;//分区类型的描述 typedef struct Partition { int address;//分区起址 int len;//分区的长度 int valid;//有标识符(有效,无效) }Part;//内存空闲分区表(顺序表)描述 typedef struct Partlist //空白分区链 { Part Partelem[maxPart];//maxPart为系统中可能的最多空闲分区数 int sum;//系统中世纪的分区数 }Partseql;//全局变量 PCBseql *pcbl;//进程队列指针 Partseql *part1;//空闲队列指针 #intclude “MainManager.h” void initpcb() //初始化进程表vpcb1 { int i; pcb1->PCBelem[0].address=0; pcb1->PCBelem[0].len=0; pcb1->PCBelem[0].name=’s’; pcb1->PCBelem[0].valid=1; pcb1->total=0; for(i=1;i

内存最佳分配实验报告

一.实验名称 模拟实现动态分区存储管理 二.实验要求 编写程序实现动态分区存储管理方式的主存分配与回收。具体内容包括:先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试。 三.解决方案 实现动态分区的分配与回收,主要考虑两个问题:第一,设计记录主存使用情况的数据结构,用来记录空闲区和作业占用的区域;第二,在该数据结构基础上设计主存分配算法和主存回收算法。 由于动态分区的大小是由作业需求量决定的,故分区的长度预先不能固定,且分区的个数也随主存分配和回收变动。总之,所有分区的情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时,空闲区有时会变成两个分区(空闲区和已分配区),回收主存分区时,可能会合并空闲区,这样如果整个主存采用一张表格记录已分配区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区。由此可见,主存的分配与回收主要是对空闲区的操作。这样为了便于对主存空间的分配与回收,可建立两张分区表记录主存使用情况:“已分配区表”记录作业占用分区,“空闲区表”记录空闲区。 然后在数据结构上进行主存的分配,其主存分配算法采用最优适应算法,即按祖业要求挑选一个能满足作业要求的最小空闲区分配。具体实现时,把空闲区按长度以某种方式(递增方式)登记在“空闲区表”中,分配时顺序查找“空闲区表”,查到的第一个空闲区就是满足作业要求的最小分区。在实现回收时,先在“已分配区表”中找到将作业归还的区域,且变为空,检查“空闲区”表中未分配区域,查找是否有相邻空闲区,最后合并空闲区,修改“空闲区表”。设计程序时可选择进行主存分配或主存回收,所需参数为:若是主存分配。输入作业名和所需主存空间大小;若是回收,输入回收作业的作业名,以循环进行主存分配和回收。 四.实验代码 #include #include #define n 10 /*定义系统允许的最大作业数*/ #define m 10 /*定义系统允许的空闲区表最大值*/ #define minisize 100 struct /*已分配区表的定义*/ { float address; float length; int flag; }used_table[n]; struct {float address; float length; int flag; }free_table[m];

网络存储实验报告

湖北文理学院《网络存储》 实验报告 专业班级:计科1211 姓名:*** 学号:*** 任课教师:李学峰 2014年11月16日

实验01 Windows 2003的磁盘阵列技术 一、实验目的 1.掌握在Windows 2003环境下做磁盘阵列的条件和方法。 2.掌握在Windows 2003环境下实现RAID0的方法。 3. 掌握在Windows 2003环境下实现RAID1的方法。 4. 掌握在Windows 2003环境下实现RAID5的方法。 5. 掌握在Windows 2003环境下实现恢复磁盘阵列数据的方法。 二、实验要求 1.在Windows 2003环境下实现RAID0 2.在Windows 2003环境下实现RAID1 3.在Windows 2003环境下实现RAID5 4.在Windows 2003环境下实现恢复磁盘阵列数据 三、实验原理 (一)磁盘阵列RAID技术的概述 RAID是一种磁盘容错技术,由两块以上的硬盘构成冗余,当某一块硬盘出现物理损坏时,换一块同型号的硬盘即可自行恢复数据。RAID有RAID0、RAID1、RAID5等。RAID 技术是要有硬件来支持的,即常说的RAID卡,如果没RAID卡或RAID芯片,还想做RAID,那就要使用软件RAID技术,微软Windows系统只有服务器版本才支持软件RAID技术,如Windows Server 2003等。 (二)带区卷(RAID0) 带区卷是将多个(2-32个)物理磁盘上的容量相同的空余空间组合成一个卷。需要注意的是,带区卷中的所有成员,其容量必须相同,而且是来自不同的物理磁盘。带区卷是Windows 2003所有磁盘管理功能中,运行速度最快的卷,但带区卷不具有扩展容量的功能。它在保存数据时将所有的数据按照64KB分成一块,这些大小为64KB的数据块被分散存放于组成带区卷的各个硬盘中。 (三)镜像卷(RAID1) 镜像卷是单一卷的两份相同的拷贝,每一份在一个硬盘上。它提供容错能力,又称为RAID1技术。 RAID1的原理是在两个硬盘之间建立完全的镜像,即所有数据会被同时存放到两个物理硬盘上,当一个磁盘出现故障时,系统仍然可以使用另一个磁盘内的数据,因此,它具备容错的功能。但它的磁盘利用率不高,只有50%。 四、实验设备 1.一台装有Windows Server 2003系统的虚拟机。 2.虚拟网卡一块,类型为“网桥模式”。 3.虚拟硬盘五块。 五、实验步骤 (一)组建RAID实验的环境 (二)初始化新添加的硬盘 (三)带区卷(RAID0的实现)

相关文档
最新文档