文档库 最新最全的文档下载
当前位置:文档库 › 实验三 存储管理实验

实验三 存储管理实验

实验三 存储管理实验
实验三 存储管理实验

实验三存储管理实验

一.? 目的要求:?

1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。?

2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二.实验内容:

1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。

可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。

算法描述:

本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。

算法原程序

#include "stdio.h"

#include "windows.h"

#include

#include

#define PCB_NUM 5 //模拟进程数量

#define INT 800//内存分区数量

struct MemInf

{

int addr;//分区起始地址

int size;//分区大小

int state;//0表示空闲,>0时表示已分配,存储的是进程ID

};

struct PCB

{

int pcbID;//进程ID

int size;//进程大小

int RunState;//运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存int TolTime;//总需要运行时间

int RunTime;//已运行时间

} pcbList[PCB_NUM];

void menu()//菜单

{

int m;

system("cls");

printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t固定分区存储程序演示\n");

printf("\t\t*********************************************\t\t\n");

printf("\n\t\t\t1.执行程序.");

printf("\n\t\t\t0.退出程序.");

scanf("%d",&m);

switch(m)

{

case1:

break;

case0:

system("cls");

menu();

break;

default:

system("cls");

break;

}

}

void paixu(struct MemInf* ComMem,int n)

{

int i,j,t;

for(j=0; j

for(i=0; i

if(ComMem[i].size>ComMem[i+1].size)

{

t=ComMem[i].size;

ComMem[i].size=ComMem[i+1].size;

ComMem[i+1].size=t;

}

}

void paixu2()

{

int i,j,t;

for(j=0; j<4; j++)

for(i=0; i<4-j; i++)

if(pcbList[i].size>pcbList[i+1].size)

{

t=pcbList[i].size;

pcbList[i].size=pcbList[i+1].size;

pcbList[i+1].size=t;

}

}

void main()

{

DD:

menu();

char ch;

int i,j,n,a=0;

struct MemInf* ComMem;

system("cls");

printf("你要分多少个分区呢,请输入数值吧:");

scanf("%d",&n);

ComMem=(struct MemInf*)malloc(n*sizeof(struct MemInf));

printf("请划分内存固定大小分区:\n");//划分内存固定大小分区

for(i=0; i

printf("输入固定分区%d分区的长度:",i);//输入固定分区每个的长度

scanf("%d",&ComMem[i].size);

if(i==0) ComMem[i].addr=40;//定义第一个分区的起始地址为40

else ComMem[i].addr=ComMem[i-1].addr+ComMem[i-1].size;//表示下一个起始地址的起始状态表示的是分区长度加上起始地址长度

ComMem[i].state=0;//表示状态为未分配

a=ComMem[i].size+a;

if(a>=INT)

{

printf("超出规定内存范围");

ch=getchar();

ch=getchar();

goto DD;

}

}

paixu(ComMem,n);

//初始化就绪进程队列

pcbList[0].pcbID =1;

pcbList[0].RunState =0;//运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存

pcbList[0].size=30;

pcbList[0].RunTime =0;

pcbList[0].TolTime =5;

pcbList[1].pcbID =2;

pcbList[1].RunState =0;

pcbList[1].size=15;

pcbList[1].RunTime =0;

pcbList[1].TolTime =6;

pcbList[2].pcbID =3;

pcbList[2].RunState =0;

pcbList[2].size=50;

pcbList[2].RunTime =0;

pcbList[2].TolTime =3;

pcbList[3].pcbID =4;

pcbList[3].RunState =0;

pcbList[3].size=120;

pcbList[3].RunTime =0;

pcbList[3].TolTime =4;

pcbList[4].pcbID =5;

pcbList[4].RunState =0;

pcbList[4].size=125;

pcbList[4].RunTime =0;

pcbList[4].TolTime =9;

ch=getchar();

ch=getchar();

while(pcbList[PCB_NUM-1].RunTime < pcbList[PCB_NUM-1].TolTime)

{

{

for(j=0; j

{//内存分配

for(i=0; i

{

if(ComMem[i].state ==0&& pcbList[j].RunState==0)//内存分区为0空闲,且进程状态为就绪,即可以考虑分配该内存分区

if(ComMem[i].size >=pcbList[j].size)//如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程

{

ComMem[i].state =pcbList[j].pcbID ;

pcbList[j].RunState=1;

}

}//内存回收

if(pcbList[j].RunTime >=pcbList[j].TolTime)//如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存

for(i=0; i

if(ComMem[i].state == pcbList[j].pcbID)

{

ComMem[i].state =0;//内存状态变为 "未分配"

pcbList[j].RunState=2;//进程状态变为 "运行完毕"

}

//运行时间加1

for(i=0; i

if(pcbList[i].RunState==1&& pcbList[i].RunTime <

pcbList[i].TolTime)//处于运行状态且运行时间小于总需时间的进程,运行时间加1

pcbList[i].RunTime++;

//显示模块

printf("进程ID\t 进程大小\t 状态\t 需要时间\t 运行时间\n");

for(i=0; i

printf("%d\t %d\t\t %d\t %d\t\t %d\n",pcbList[i].pcbID,pcbList[i].size, pcbList[i].RunState, pcbList[i].TolTime ,pcbList[i].RunTime);

printf("分区ID\t 分区大小\t 状态\n");

for(i=0; i

printf("%d\t %d\t\t %d\n",i,ComMem[i].size ,ComMem[i].state ); printf("按回车键继续...\n");

getchar();//按任意键继续(分步执行,以便观察内存分配回收

}

}

}

}

运行结果截图:

2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。

对分区的管理法可以是下面三种算法之一:

首次适应算法

循环首次适应算法

最佳适应算法

代码实现部分:

#include

#include

#include

#define max 100

typedef struct node

{

int start;

int length;

char tag[20];

}job;

job frees[max];

job occupys[max];

int free_quantity,occupy_quantity;

int SIZE;

void initial()//初始化函数

{

int i;

for(i=0;i

{

frees[i].start=-1;

frees[i].length=0;

strcpy(frees[i].tag,"free");

occupys[i].start=-1;

occupys[i].length=0;

strcpy(occupys[i].tag,"");

}

free_quantity=0;

occupy_quantity=0;

}

void writedata()//把分区函数写入磁盘文件

{

FILE *fp;

char fname[20];

int i,j;

printf("请输入初始空闲表文件名:\n");

scanf("%s",&fname);

printf("现在进行初始化空闲分区!\n");

printf("请输入您要建立的空闲分区数:\n");

scanf("%d",&SIZE);

for(i=0;i

{

j=i+1;

printf("输入第%d个分区的起始地址:\n",j);

scanf("%d",&frees[i].start);

printf("输入第%d个分区的长度:\n",j);

scanf("%d",&frees[i].length);

}

if((fp=fopen(fname,"wb"))==NULL)

printf("错误,文件打不开,请检查文件名\n");

for(i=0;i

if(fwrite(&frees[i],sizeof(struct node),1,fp)!=1)

printf("文件写入错误!\n");

fclose(fp);

}

void readdata()//从文件读入分区表函数

{

FILE *fp;

char fname[20];

printf("请输入读入空闲表文件名:");//输入空闲表文件的文件名 scanf("%s",&fname);

if((fp=fopen(fname,"rb"))==NULL)

{

printf("错误,文件打不开,请检查文件名\n");

exit(0);

}

else

{int i;

for(i=0;i

{

fread(&frees[i],sizeof(struct node),1,fp);

free_quantity++;

}

}

fclose(fp);

}

void sort()//排序空闲表

{int i;

for(i=0;i

{

int t=i;

int j;

for(j=i+1;j

{

if(frees[j].start<=frees[t].start)

t=j;

}

frees[free_quantity].start=frees[i].start;

frees[free_quantity].length=frees[i].length;

frees[i].start=frees[t].start;

frees[i].length=frees[t].length;

frees[t].start=frees[free_quantity].start;

frees[t].length=frees[free_quantity].length;

}

}

void view()//显示分区信息

{int i,j;

printf("空闲分区表显示如下:\n");

printf("起始地址\t长度\t状态标志\n");

for(i=0;i

printf("%6dk\t%10dk\t%s\t\n",frees[i].start,frees[i].length,frees[i].tag);

printf("\n\n已分配分区表显示如下:\n");

printf("起始地址\t长度\t占用作业名\n");

for(j=0;j

printf("%6dk\t%10dk\t%s\t\n",occupys[j].start,occupys[j].length,occupys[j].t ag);

getchar();

getchar();

}

void earliest()//首次适应算法

{

char jobname[20];

int joblength,f=0;

int i,j;

printf("请输入作业名:\n");

scanf("%s",&jobname);

printf("输入作业的长度:\n");

scanf("%d",&joblength);

for(i=0;i

{

if(frees[i].length>=joblength)

f=1;

}

if(f==0)

{

printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");

getchar();

}

else

{//找到了满足的空间

int t=0;

j=0;

while(t==0)

{

if(frees[j].length>=joblength)

{

t=1;

}

j++;

}

j--;

occupys[occupy_quantity].start=frees[j].start;//分配满足条件的空间

strcpy(occupys[occupy_quantity].tag,jobname);

occupys[occupy_quantity].length=joblength;

occupy_quantity++;

if(frees[j].length>joblength)

{

frees[j].start+=joblength;

frees[j].length-=joblength;

}

else

{

for(i=j;i

{

frees[i].start=frees[i+1].start;

frees[i].length=frees[i+1].length;

}

free_quantity--;

}

printf("作业申请内存空间成功!\n");

getchar();

getchar();

}

}

void excellent()//最佳适应法

{

char jobname[20];

int joblength,f=0;

int i,j;printf("请输入作业名:\n");

scanf("%s",&jobname);

printf("输入作业的长度:\n");

scanf("%d",&joblength);

for(i=0;i

{

if(frees[i].length>=joblength)

f=1;

}

if(f==0)

{

printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n"); getchar();

}

else//找到了满足的空间

{

int t=0;

j=0;

while(t==0)

{

if(frees[j].length>=joblength)

{

t=1;

}

j++;

}

j--;

for(i=0;i

{

if(frees[i].length>=joblength&&frees[i].length

}

occupys[occupy_quantity].start=frees[j].start;//分配空闲空间

strcpy(occupys[occupy_quantity].tag,jobname);

occupys[occupy_quantity].length=joblength;

occupy_quantity++;

if(frees[j].length>joblength)

{

frees[j].start+=joblength;

frees[j].length-=joblength;

}

else

{

for(i=j;i

{

frees[i].start=frees[i+1].start;

frees[i].length=frees[i+1].length;

}

free_quantity--;

}

printf("作业申请内存空间成功!\n");

getchar();

getchar();

}

}

void worst()

{

char jobname[20];

int joblength,f=0;int i,j;

printf("请输入作业名:\n");

scanf("%s",&jobname);

printf("输入作业的长度:\n");

scanf("%d",&joblength);

for(i=0;i

{

if(frees[i].length>=joblength)

f=1;

}

if(f==0)

{

printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");

getchar();

getchar();

}

else//找到了满足的空间

{

int t=0;

j=0;

while(t==0)

{

if(frees[j].length>=joblength)

{

t=1;

}

j++;

}

j--;

for(i=0;i

{

if(frees[i].length>=joblength&&frees[i].length>frees[j].length) j=i;

}

occupys[occupy_quantity].start=frees[j].start;//分配空闲空间

strcpy(occupys[occupy_quantity].tag,jobname);

occupys[occupy_quantity].length=joblength;

occupy_quantity++;

if(frees[j].length>joblength)

{

frees[j].start+=joblength;

frees[j].length-=joblength;

}

else

{

for(i=j;i

{

frees[i].start=frees[i+1].start;

frees[i].length=frees[i+1].length;

}

free_quantity--;

}

printf("作业申请内存空间成功!\n");

getchar();

getchar();

}

}

void main()

{

initial();

int n;

writedata();

system("cls");

readdata();

for(;;)

{

sort();

printf("************************************\n"); printf("************************************\n"); printf("** 欢迎使用可变分区存储管理系统 **\n");

printf("************************************\n"); printf("** 1.显示空闲表和分配表 **\n");

printf("** 2.首次适应算法 **\n");

printf("** 3.最佳适应算法 **\n");

printf("** 4.最坏适应算法 **\n");

printf("** 0.退出系统 **\n");

printf("************************************\n"); printf("************************************\n"); printf("请输入您要选择的项目:\n");

scanf("%d",&n);

for(;;)

{

if(n<0||n>4)

{

printf("没有这个选项,请重新输入!");

scanf("%d",&n);

}

else

break;

}

switch(n)

{

case0:printf("感谢您的使用!再见!\n");exit(0);

case1:view();break;

case2:earliest();break;

case3:excellent();break;

case4:worst();break;

}

system("cls");

}

}

测试结果:

使用首次适应算法的结果:

使用最佳适应算法:

使用最坏适应算法:

内存过满:

3、编写并调试一个段页式存储管理的地址转换的模拟程序。

首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。

要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。

代码实现

#include

#include

using namespace std;

typedef struct Quick

{

int qs;//快表段号

int qp;//快表页号

int qb;//快表段号

} Quick;

typedef struct Data

{

int num;//内存的块数

string str;//对应数据块的作业内容,简化起见说明内容为一串字符。

} Data;

//页表

typedef struct Page

{

int num;//页号

int flag;//页状态,即是否在内存。

int block;//该页对应的块号

} Page;

typedef struct Stack

{

int num;//段号

int flag;//段状态

int plen;//页表长度

int psta;//页表始址

} Stack;

//段表寄存器

typedef struct Stare

{

int ssta;//段表始址

int slen;//段表长度

} Stare;

Stack ss[10];////全局变量

Stare st;///////全局变量

Data work[20];//全局变量

Quick qu;//////全局变量

Page page[5][5];

bool menuflag=0;

int bbs;//内存块大小

int bs;//内存大小

void menu();

void start();

void change();

int main()

{

menu();

return0;

}

void menu()

{

cout<<"请选择:"<

cout<

cout<<" 1、初始化表 "<

cout<<" 2、物理地址转换 "<

int menu1;

cin>>menu1;

if(menu1!=1&&menu1!=2&&menu1!=3)

{

cout<<"请输入正确的选项"<

menu();

}

switch(menu1)

{

case1:

{

menuflag=1;

start();

break;

}

case2:

{

if(menuflag==0)

{

cout<<"请初始化表"<

menu();

}

change();

break;

}

case3:

return;

}//switch

}

void start()

{

cout<<"请输入内存大小(K)"<

cin>>bs;

cout<<"请输入内存块的大小(k)"<

cin>>bbs;

int blocknum;

blocknum=bs/bbs;

cout<<"内存一共被分为"<

cout<<"请输入进程个数"<

int pn;

cin>>pn;

//下面求所有进程的总段数和段表,并为每段创建页表

int sums=0;

for(int pn1=0; pn1

{

cout<<"请输入第"<

int ppn;

cin>>ppn;

sums+=ppn;

}

for(int ss1=0; ss1

{

cout<<"请输入第"<

cin>>ss[ss1].num>>ss[ss1].flag>>ss[ss1].plen>>ss[ss1].psta; cout<<"请初始化第"<

for(int sss1=0; sss1

{

page[ss1][sss1].num=sss1;

cout<<"请输入该段第"<

"<

cin>>page[ss1][sss1].flag>>page[ss1][sss1].block;

}

}

//初始化段表寄存器

cout<<"初始化段表寄存器的段表始址"<

cin>>st.ssta;

st.slen=sums;

//初始化内存中物理地址每一块的数据区

cout<<"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址"<

for(int bn=0; bn

{

work[bn].num=bn;

cout<<"请输入第"<

cin>>work[bn].str;

}

//初始化快表

cout<<"简单起见,我们初始化快表只有一个"<

cout<<"请输入要作为快表的段号和页号"<

cin>>qu.qb>>qu.qp;

while(ss[qu.qb].flag!=1||page[qu.qb][qu.qp].flag!=1)

{

cout<<"该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号"<

cin>>qu.qb>>qu.qp;

}

qu.qs=page[qu.qb][qu.qp].block;

menu();

}

void change()

{

cout<<"请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)"<

int snum,pnum,dnum;

cin>>snum>>pnum>>dnum;

//首先查快表

if(snum==qu.qb&&pnum==qu.qp)

{

cout<<"快表命中"<<"对应块号是"<

cout<<"该块中作业数据是

"<

cout<<"物理地址是"<

menu();

}

//访问段表寄存器

else

{

cout<<"快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址

"<

int ssnum;

ssnum=st.ssta+snum;

if(ssnum>st.slen-1)

{

cout<<"越界中断"<

menu();

}

//访问段表

else

{

if(ssnum>=0&&ssnum<=st.slen-1)

{

//是否缺段

cout<<"段表有效"<

if(ss[ssnum].flag==0)

{

cout<<"缺段中断"<

menu();

}

else

{

//查询页表,根据段号查出页表始址,加上段内偏移页数,即得到页表项。 //缺页中断测试

if(pnum>ss[ssnum].plen-1)

{

cout<<"缺页中断"<

menu();

}

else

{

if(pnum>=0&&pnum<=ss[ssnum].plen-1)

{

if(page[ssnum][pnum].flag==0)

{

cout<<"缺页中断"<

menu();

}

else

{

cout<<"找到该页"<<"查询页表后对应块号"<

cout<<"该块内存的数据是

"<

cout<<"转化得到的物理地址是:

"<

menu();

}

}

}

}

}

}

}

}

实验结果:

四、实验总结

本次实习内容存储管理,通过编写和调试存储管理的模拟程序加深了对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。对算法有了更深刻的理解,就是动手能力太差。

实验三:存储管理

实验三:存储管理 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

一、实验名称 实验三:存储管理 [1]Windows Server 2003内存结构 [2] Windows Server 2003虚拟内存 二、 [1]实验目的 1)通过实验了解windows Server 2003内存的使用,学习如何在应用程序中管理内存、体会Windows应用程序内存的简单性和自我防护能力。 2)了解windows Server 2003的内存结构和虚拟内存的管理,进而了解进程堆和windows为使用内存而提供的一些扩展功能。 三、 [1]实验内容 四、 [1]实验步骤 Windows提供了一个API即GetSystemInfo() ,以便用户能检查系统中虚拟内存的一些特性。程序5-1显示了如何调用该函数以及显示系统中当前内存的参数。 步骤1:登录进入Windows Server 2003 。 步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序。 程序5-1:获取有关系统的内存设置的信息 步骤4:单击“Build”菜单中的“Compile ”命令,并单击“是”按钮确认。系统对进行编译。 步骤5:编译完成后,单击“Build”菜单中的“Build ”命令,建立可执行文件。 操作能否正常进行如果不行,则可能的原因是什么 答:操作能正常进行。 _____________________________________________________ 步骤6:在工具栏单击“Execute Program” (执行程序) 按钮,执行程序。 运行结果 (分行书写。如果运行不成功,则可能的原因是什么?) : 1) 虚拟内存每页容量为: 2) 最小应用地址: 0x00010000 3) 最大应用地址为: 0x7ffeffff 4) 当前可供应用程序使用的内存空间为: 5) 当前计算机的实际内存大小为: 阅读和分析程序5-1,请回答问题:

实验三存储管理实验

实验三存储管理实验 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】

实验三存储管理实验 一. 目的要求: 1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。 2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二.实验内容: 1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。 算法描述: 本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。 算法原程序 #include "" #include "" #include <>

#include <> #define PCB_NUM 5 行程序."); printf("\n\t\t\t0.退出程序."); scanf("%d",&m); switch(m) { case1: break; case0: system("cls"); menu(); break; default: system("cls"); break; } } void paixu(struct MemInf* ComMem,int n) { int i,j,t; for(j=0; jComMem[i+1].size) { t=ComMem[i].size; ComMem[i].size=ComMem[i+1].size; ComMem[i+1].size=t; } } void paixu2() { int i,j,t; for(j=0; j<4; j++) for(i=0; i<4-j; i++) if(pcbList[i].size>pcbList[i+1].size) { t=pcbList[i].size; pcbList[i].size=pcbList[i+1].size; pcbList[i+1].size=t; } } void main() { DD: menu();

运输管理实训报告模板

运输管理实训报告

物流运输学 实训报告 班级 姓名 学号 学期 指导老师 成绩 12月

目录 简介 ......................................................................... 错误!未定义书签。 一、物流滞后凸显配送”瓶颈”............................. 错误!未定义书签。 ( 一) 要树立现代物流管理的新理念................... 错误!未定义书签。 ( 二) 借助现代信息技术增强企业物流管理能力错误!未定义书签。 ( 三) 积极探索适合自身发展的物流新模式....... 错误!未定义书签。 1、新模式的主导思想.................................. 错误!未定义书签。 2、新模式的架构.......................................... 错误!未定义书签。 3、新模式的优势.......................................... 错误!未定义书签。 二、搬运不合理、运输包装破损 ....................... 错误!未定义书签。 ( 一) 搬运 ............................................................... 错误!未定义书签。 ( 二) 包装 ............................................................... 错误!未定义书签。 ( 三) 堆放 ............................................................... 错误!未定义书签。实训总结 ................................................................. 错误!未定义书签。

存储管理实验报告

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

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

虚拟存储器管理 页面置换算法模拟实验

淮海工学院计算机工程学院实验报告书 课程名:《操作系统原理A 》 题目:虚拟存储器管理 页面置换算法模拟实验 班级:软件*** 学号:20**1228** 姓名:****

一、实验目的与要求 1.目的: 请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。 2.要求: 本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。 二、实验说明 1.设计中虚页和实页的表示 本设计利用C语言的结构体来描述虚页和实页的结构。 在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实 页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页 的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。 在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号, 取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。 2.关于缺页次数的统计 为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。 3.LRU算法中“最近最久未用”页面的确定

《物流管理实训》实训报告

《物流管理实训》实训报告 时间:2020年08月02日编稿:作者三 第一篇:《物流治理实训》实训报告 《物流治理实训》实训报告 实习内容:通过对公司总经理、调度中心、仓库中心以及运输中心等公司的不同角色来了解和熟悉实际的当中的物流操作,懂得对物流活动诸要素的治理:运输、储存等环节的治理;对物流诸系统的治理:人、财、物、设备、办法和信息等要素的治理;对物流活动中具体职能的治理:物流计划、质量、技术、经济职能等的治理。并掌握物流的运作的步骤和流程,使我们在操作的过程中能够结合自己所学的物流知识举行规划设计调整所在公司的各项资源从而达到理论与实际的相结合。角色及职责:分别有公司总经理、调度中心、仓库中心、运输中心实习具体操作: 在开始实验前举行分组,老师把我们每小组人数分为三人,分组后小组内部确定个人所担任的角色,角色是三人轮流扮演的。担任总经理的同学先进入浙科物流教学模拟软件首页面注册用户,注册公司详细信息和公司总经理帐号信息,注册是依据教师安排挑选对应班级和对应的实验举行的。注册完成后进入角色分配页面添加其他角色的用户帐号,其他三个角色帐号分配完成后即完成物流公司的注册,注册完成后各角色便可以使用总经理所注册的帐号举行登陆。 公司总经理:主要负责合同治理、订单受理及物流设备治理等。总经理需要合理安排在公司注册时获得的公司初始资金并通过购买

或租借仓库和运输工具和人员的聘请来展开该公司的具体运作,依据市场和公司情况和其他企业签定物流运送合同,还要开通各种运输路线,举行财务治理。总经理用户在注册申请成功进入系统后,首先要为物流公司开始物流做好预备工作: 1、购买或租借一个仓库作为合同报价的基础; 2、开通产生单据两点间城市的线路报价; 3、开通EDI服务(物流信息网/用户注册)并为使用EDI服务申请CA认证。 调度中心:该角色的主要职责是合理安排公司所获得的各项运输任务,对总经理发送过来的货运单举行处理,对货运单举行补货将货源信息公布于仓库中心举行补货,对货运单举行暂存入库或直接生成运输单将信息公布至运输中心,通过制作运输计划,和对运输计划举行起点合并、终点合并、联运、同城运输等各中不同的操作组合来达到运输效果最优。 仓库中心:首先对总经理发送来的仓库信息举行仓库设定、对调度中心发送过来的信息举行入库操作、出库操作、货物存放、拣货装配、货物移库、库存查询……通过仓库的调度缓冲举行处理任务的整合,减少零散任务的运输以节约公司的各项成本。通过为合同企业提供仓储服务,并为企业的储存的产品举行维护和治理增加企业的收入。 运输中心:依据调度中心下达的运输任务举行分配车辆和驾驶员的的调派。利用本公司的车辆举行运输或通过签定其他物流公司公布分得回程车以减少运送成本。依据实际情况向公司总经理提出车辆购

OS实验指导四——虚拟存储器管理

OS实验指导四——虚拟存储器管理

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

《操作系统》实验指导四 开课实验室:A207、A209 2015/11/23 、2015/11/24 实验类型设计 实验项目(四)虚拟存储器管理实验 实验学时 4 一、实验目的 设计一个请求页式存储管理方案,并编写模拟程序实现。 二、设备与环境 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发 环境,如C \C++\Java 等编程语言环境。 三、实验要求 1) 上机前认真复习页面置换算法,熟悉FIFO算法和LRU页面分配和置换算法的过程; 2) 上机时独立编程、调试程序; 3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行 结果截图)。 四、实验内容 1、问题描述: 设计程序模拟FIFO和LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,并计算每种算法缺页次数和缺页率。 2、程序具体要求如下: 编写程序用来模拟虚拟页式存储管理中的页面置换 要求: 1)快表页面固定为4块 2)从键盘输入N个页面号 3)输出每次物理块中的页面号和缺页次数,缺页率 4)实现算法选择

3、程序流程图 3、源程序参考: (1)FIFO 算法部分 #include "stdio.h" #define n 12 #define m 4 void main() { int ym[n],i,j,q,mem[m]={0},table[m][n]; char flag,f[n]; printf("请输入页面访问序列\n "); for(i =0;i

实验三 存储管理指导

实验三存储管理 实验目的 1) 加深对存储管理的理解; 2) 掌握几种页面置换算法; 3) 通过实验比较各种置换算法的优劣。 实验要求 1) 编写程序完成实验内容; 2) 对测试数据进行分析; 3) 撰写实验报告。 实验内容 1) 定义为进程分配的物理块数; 2)定义进程运行所需访问的页面号; 3)定义页的结构; 4)模拟两种页面置换算法; 5)计算页面置换算法的命中率; 6)比较两种算法的优劣。 实验原理 1.虚拟存储 基于局部性原理,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去;但如果程序所要访问的页(段)尚未调入内存(称为缺页或缺段),此时程序应利用OS所提供的请求调页(段)功能,将它们调入内存,以使进程能继续执行下去。如果此时内存已满,无法再装入新的页(段),则还须再利用页(段)

的置换功能,将内存中暂时不用的页(段)调至盘上,腾出足够的内存空间后,再将要访问的页(段)调入内存,使程序继续执行下去。 2.页面置换算法 1)最佳(Optimal)置换算法 最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。 2)最近最久未使用(LRU)置换算法 FIFO置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。 LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。 a)寄存器 为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为R=R n-1R n-2R n-3… R2R1R0当进程访问某物理块时,要将相应寄存器的R n-1位置成1。此时,定时信号将每隔一定时间(例如100 ms)将寄存器右移一位。如果我们把n位寄存器的数看做是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。 b)栈 可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

物流运输管理实验报告

学生实验报告 课程名称物流运输管理实验成绩 实验项目物流配送运输路线规划实验批阅教师郑宁 实验张松学号10511913214 专业物流实验2015-11-17 一、实验预习报告(实验目的、内容,主要设备、仪器,基本原理、实验步骤等)(可加页) 1.实验目的 物流运输与配送管理上机实验是巩固和消化课堂所讲授的理论知识的必要环节。通过实验使学生更深入地理解课堂教学所涉及的配送运输线路规划问题。复习所学的运筹学知识,学习使用Excel、Lingo软件解决物流运输优化问题。培养运用计算机软件解决实际问题的能力以及根据实验研究目的选择恰当的优化方法的能力。 2.实验内容 1)运用Excel规划运输线路 某配送中心要为13个客户提供配送服务,配送中心的位置、客户的坐标及客户的订单规模见表1客户坐标及订单规模。配送中心共有4 辆卡车,每辆车的载重量是200件。由于送货成本与车辆行驶总里程之间密切相关,公司经理希望获得总行驶距离最短的方案。如何分配客户?如何确定车辆行驶路径。 表1客户坐标及订单规模 2)用LINGO软件规划运输线路 (1)学习LINGO软件的使用。 理解LINGO的窗口、LINGO中的集、模型的数据部分和初始部分、LINGO的常用函数、LINGO WINDOWS命令、LINGO的命令行命令。 (2)实例路线规划。 使用Google搜索引擎中的地图搜索功能,在地图上定位武汉中百仓储配送中心及离其最近的7个便利店,标出各个结点之间的距离。假设有一辆货车从该配送中心出发为这个7个便利店送货,用LINGO软件参照旅行售货员问题编写程序,求解最优路径规划。 3. 主要设备、仪器 ⑴计算机。 ⑵ WINDOWS操作系统。 ⑶ Microsoft Excel 2003、LINGO9.0 4. 基本原理 (1)节约算法

实验报告实验二存储管理

实验二存储管理 一.实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二.实验内容 (1)通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。 页面失效次数为每次访问相应指令时,该指令所对应的页不在内存页面失效次数 命中率?1?页地址流长度中的次数。,用户内存,用户虚存容量为 32k 在本实验中,假定页面大小为1k 32页。容量为4页到320条指令。produce_addstream通过随机数产生一个指令序列,共(2)指令的地址按下述原则生成:A、 的指令是顺序执行的)150% 的指令是均匀分布在前地址部分2)25% 的指令是均匀分布在后地址部分3)25% 体的实施方法是:、具B ;319]的指令地址之间随机选取一起点m)在[0,1 的指令;顺序执行一条指令,即执行地址为m+1)2 该指令的地址为中随机选取一条指令并执行,,m+1]3)在前地址[0 ;m' 的指令'+1)顺序执行一条指令,地址为m4 319]中随机选取一条指令并执行;[m在后地址'+2,5) 320次指令)~5),直到执行6)重复上述步骤1 将指令序列变换称为页地址流C、 条指令条指令排列虚存地址,即320k存放10在用户虚存中,按每在虚存中的存放方式为:;,9])第9条指令为第0页(对应虚存地址为[0第0条~ ;19])条指令为第1页(对应虚存地址为[10,第10条~第19 。。。。。。;,319])[310条~第319条指令为第31页(对应虚存地址为310第页。按以上方式,用户指令可组成32 计算并输出下属算法在不同内存容量下的命中率。)(3 );)先进先出的算法(FIFO1 ;最近最少使用算法(LRU)2) ;OPT)最佳淘汰算法()3 ;)LFR最少访问页面算法()4. 其中3)和4)为选择内容 三.系统框图

实验 存储器管理(二)

存储器管理(二) 一、目的 本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。 二、题目 存储器管理 三、要求及提示 1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行 多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用 “命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块, 或回收模块,或内存查询模块,或最终退出系统。 2、编程实现。 3、工具:C语言或其它高级语言 4、实验时间:3学时 四、实验报告 1、写出存储器管理的思想。 2、画出算法流程图和设置的数据结构。 3、写出调试程序出现的问题及解决的方法。 4、打印实验报告及程序清单。 5、报告给出测试的结果。 五、范例 采用可变分区存储器管理方案的模拟系统。 1、问题描述 该模拟系统的外部特性与真实系统基本一样。存储分配算法采用首次适应法。用“拼,接”和“紧凑”技术来处理存储器碎片。 2、算法 存储分配算法采用首次适应(FF)法。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,则形成一个较小的空闲区留在自由链中。 回收时,根据MAT将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。 当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。 本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块menu。Menu用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。 系统的主流程如图3所示。 3、数据结构 (1)自由链与区头。内存空闲区采用自由链结构。链首由freep指向,链中各个空

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

实验四操作系统存储管理实验报告 一、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二、实验内容 (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)先进先出的算法

存储管理实验报告.doc

存储管理实验报告

北方工业大学 《计算机操作系统》实验报告 实验名称存储管理实验序号 2 实验日期2013.11.27实验人 一、实验目的和要求 1.请求页式存储管理是一种常用的虚拟存储管理技术。本实验目的 是通过请求页式存储管理中页面置换算法的模拟设计,了解虚拟存储 技术的特点,掌握请求页式存储管理的页面置换算法。 二、相关背景知识 1.随机数产生办法 关于随机数产生办法, Linux 或 UNIX 系统提供函数 srand() 和 rand() ,分 别进行初始化和产生随机数。 三、实验内容 (1).通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成: 1.50% 的指令是顺序执行的; 2.25% 的指令是均匀分布在前地址部分; 3.25% 的指令是均匀分布在后地址部 分;具体的实施方法是: 1.在[0, 319]的指令地址之间随机选取一起点 m; 2.顺序执行一条指令,即执行地址为 m+1 的指令; 3.在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’; 4.顺序执行一条指令,其地址为 m’+1; 5.在后地址 [m ’+2, 319]中随机选取一条指令并执行; 6.重复上述步骤 1~5,直到执行 320 次指令。 (2)将指令序列变换成页地址流,设 1.页面大小为 1K ; 2.用户内存容量为 4 页到 32 页; 3.用户虚存容量为 32K 。 在用户虚存中,按每 K 存放 10 条指令排列虚存地址,即 320 条指令在虚存 中存放的方式为: 第 0 条至第 9 条指令为第 0 页(对应虚存地址为 [0, 9]); 第 10 条至第 19 条指令为第 1 页(对应虚存地址为 [10, 19]); 第 310 条至第 319 条指令为第 31 页(对应虚存地址为 [310,319]); 按以上方式,用户指令可以组成 32 页。 (3)计算并输出下述各种算法在不同内存容量下的命中率。

实验三 动态分区存储管理方式的主

实验三动态分区存储管理方式的主存分配回收 一、实验目的 深入了解动态分区存储管理方式主存分配回收的实现。 二、实验预备知识 存储管理中动态分区的管理方式。 三、实验内容 编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括: 首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。 四、提示与讲解 动态分区管理方式预先不将主存划分成几个区域,而把主存除操作系统占用区域外的空间看作一个大的空闲区。当作业要求装入主存时,根据作业需要主存空间的大小查询主存内各个空闲区,当从主存空间中找到一个大于或等于该作业大小的主存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装入该作业。作业执行完后,它所占的主存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 实现动态分区的分配和回收,主要考虑的问题有三个: 第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法;第三,在设计的数据表格基础上设计主存回收算法。 首先,考虑第一个问题: 设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。

由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时空闲区有时会变成两个分区: 空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。 由此可见,主存的分配和回收主要是对空闲区的操作。这样为了便于对主存空间的分配和回收,就建立两张分区表记录主存使用情况,一张表格记录作业占用分区的“已分配区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个作业占用分区的登记项,内容为该作业的作业名;空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配”。在实际系统中,这两表格的内容可能还要多,实验中仅仅使用上述必须的数据。为此,“已分配区表”和“空闲区表”在实验中有如下的结构定义。 已分配区表的定义: #define n 10//假定系统允许的最大作业数量为n struct {float address;//已分分区起始地址

物流实验报告

实验目的: 物流实验室是搭建理论与实践的桥梁,为我们提供实训平台,深化学生对现代物流理论的理解,提高学生的操作能力。物流实验基于现代物流的核心理论和核心流程,全面系统考虑,避免“肤浅”、“游戏型”的虚拟实验环境。通过实验,让我们更好的了解物流作业的各个关键环节,熟悉环节中的岗位设置与职责。 实验内容: 一、供应链管理 供应商管理系统——系统管理>企业资料 基本信息 采购管理>采购信息 业务管理>订单查询、订单确认、发货通知单、发货确认 制造商管理系统——系统管理、基本信息、生产计划、电子采购、采购管理、生 产管理、仓储管理、零售商管理、销售管理、财务管理 零售商管理系统——系统管理、基本信息、订购管理、销售管理、仓储管理、管 理结算、统计分析 物流公司管理系统——仓储管理、配送管理、运输管理、商务结算、系统报表、 统计查询 (1)拉动式供应链 拉动式供应链是整个供应链的驱动力产生于最终的顾客,产品生产是受需求驱动的。生产是根据实际顾客需求而不是预测需求进行协调的。在拉动式供应链模式中,需求不确定性很高,周期较短,主要的生产战略是按订单生产,按订单组装、和按订单配置。整个供应链要求集成度较高,信息交换迅速,可以根据最终用户的需求实现定制化服务。 1.零售商录入订单 零售商录入客户订单信息,通过审核发如采购部门,采购部门收并到审核采购,根据库存情况,生成采购单发往生产厂商。 2.制造商处理订单并采购 制造商收到零售商的需求信息后,审核相应的订单,查询库存看是否能发货,如有库存通知库房发货,如果库存不足则转入生产制造。 首先转入销售订单,通过审核,然后进行MRP运算(生产加工建议,原材料采购建议,以及采购建议)。 3.供应商向生产商供应原材料 供应商收到制造商订单信息后,通过审核,查看库存信息,如果库存不足,则进行补货,如果库存足够,就生成发货单,通知库房和选择第三方物流公司进行送货。 4.物流公司送货

实验三 虚拟存储器管理

实验三虚拟存储器管理 一、实验目的 为了使大的进程(其地址空间超过主存可用空间)或多个进程的地址空间之和超过实际主存空间时,仍能运行,引入了虚拟存储器的概念。使进程的一部分地址空间在主存,另一部分在辅存,由操作系统实现多级存储器的自动管理,实现主存空间的自动覆盖。模拟请求分页虚拟存储器管理技术中的硬件地址变换、缺页中断以及页式置换算法,处理缺页中断。 通过本实验,使学生对请求分页存储管理的概念有一个清楚的理解。 二、实验内容 1、模拟请求分页存储管理中的硬件地址变换的过程 (1)请求分页虚拟存储器管理技术是把进程地址空间的全部信息存放在磁盘对换区上。当进程被选中运行时,先把进程的开始几页装入主存并启动运行。为此在为进程建立页表时,应说明哪些页已在主存,哪些页不在主存。页表的格式如表1 所示。 在表1中 ①"标志位"表示对应页是否已经装入主存的标志: "0"表示对应页未装入主存;"1"表示对应页已装入主存。 ②"主存块号"表示该页对应的主存块号。 ③"修改位"指示该页进主存后是否修改过的标志。 ④"外存地址"表示该页所在的外存地址。 设计一个主存分块表,假定分配给进程的主存块数为M,且该进程开始的M页已装入主存。 (2)进程执行时,指令中的逻辑地址指出指令或操作数的地址中的页号和页内地址。硬件地址转换机构按页号查页表。 ①若该页的有效位为"1" ,表示该页已在主存,从而找到该页对应的主存块号。根据如下的关系式,计算出欲访问的主存地址: 绝对地址=块号×块的长度+页内地址 由于页的大小为2 的整次幕,所以只要将块号与页内地址相拼接,放入主存地址寄存器,形成绝对地址。不去模拟指令的执行,而是输出被转换的地址即可。 ②若该页的有效位为"0" ,对应的页不在主存,由硬件产生缺页中断,转操作系统处理。这里不去设计缺页处理程序,仅输出"*该页号的页不在主存,产生缺页中断"即可,以表示产生了一次缺页中断。 假定主存的每块长度为128个字节。现有一个具有8页的进程,系统为它分配了4 个主存块(即m=4)。其中第0~3页已经装入主存。该进程的页表如表2 所示,进程执行的指令序列如表3 所示,地址变换算法流程如图1所示。

虚拟存储器管理实验报告

淮海工学院计算机科学系实验报告书 课程名:《操作系统》 题目:虚拟存储器管理 页面置换算法模拟实验 班级: 学号: 姓名:

一、实验目的与要求 1.目的: 请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。 2.要求: 本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。 二、实验说明 1.设计中虚页和实页的表示 本设计利用C语言的结构体来描述虚页和实页的结构。 在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。 在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。 2.关于缺页次数的统计 为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内, 此虚页被命中,count加1。最终命中率=count/20*100%。 3.LRU算法中“最近最久未用”页面的确定 为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问 一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前

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

实验四 操作系统存储管理实验报告 一、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 二、实验内容 (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次指令 页地址流长度页面失效次数命中率- =1

C、将指令序列变换称为页地址流 在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中 的存放方式为: 第0条~第9条指令为第0页(对应虚存地址为[0,9]); 第10条~第19条指令为第1页(对应虚存地址为[10,19]); 。。。。。。 第310条~第319条指令为第31页(对应虚存地址为[310,319]); 按以上方式,用户指令可组成32页。 (3)计算并输出下属算法在不同内存容量下的命中率。 1)先进先出的算法(FIFO); 2)最近最少使用算法(LRU); 3)最佳淘汰算法(OPT); 4)最少访问页面算法(LFR); 其中3)和4)为选择内容

计算机操作系统实验三 存储管理

南京信息工程大学实验(实习)报告 实验(实习)名称存储管理实验(实习)日期 20131130 得分指导教师 系计算机系专业计科年级 2011 班次 1 姓名汤建洋学号 20112308018 1. 实验目的 本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的 特点,掌握请求页式存储管理的页面置换算法,此外通过实验了解HASH表数据结构的使用。 2. 实验准备 ⑴数据结构HASH表查找方式。 ⑵操作系统相关内存交换知识。 ⑶阅读Linux系统的msg.c、sem.c和shm.c等源码文件,掌握几个LINUX函数getpid ( )、srand (int a)和int rand ( )的使用方法。 3. 实验内容 设计一个虚拟存储区和内存工作区,并分别编程实现使用先进先出置换算法(FIFO) 和最近最少使用页面置换算法(LRU)计算访问命中率。 4. 实验指导 拥有页面交换机制的操作系统总是把当前进程中急需处理的部分页面换入到内存当中,而把更多暂时不需处理的页面放置在外存当中,由于进程需要处理页面的顺序不同,而需要 在内存与外存之间进行页面交换,交换算法也就应运而生。 本实验并没有进入系统空间对实际进程页面进行控制,而是在用户空间用线性表的连续 存储方式对进程页面交换进行的模拟。 ⑴ FIFO算法实现 <原理描述> 在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先的AP个页面放入 内存; 这时有需要处理新的页面,则将原理在内存中的AP个页面中最先进入的调出,然 后放入新页面; 以后如果有新页面需要调入,按(2)之规则进行。 算法特点:所使用的内存页面构成一个队列。 <算法实现提示> 要得到“命中率”,必然应该有一个常量total_instruction记录页面总共使用次数;此外需 要一个变量记录总共换入页面的次数(需要换出页面,总是因为没有命中而产生的)diseffect。利用公式(1-diseffect/total_instructiong)×100%可以得到命中率。 [步骤1] 初始化。设置两个数组page[ap]和pagecontrol[pp]分别表示进程页面数和内存分 配的页面数,并产生一个的随机数序列main[total_instruction](当然这个序列由page[]的下标 随机构成),表示待处理的进程页面顺序,diseffect置零。 [步骤2] 看main[]中是否有下一个元素,有就由main[]中获取该页面下标,并转到⑶; 没有,就转到⑺。 [步骤3] 如果该page业已在内存中,就转到⑵;否则就到⑷,同时未命中的diseffect加1。

相关文档