资源描述
动态分区存储管理方式的主存分配回收
一、实验目的
深入了解动态分区存储管理方式主存分配回收的实现。
二、实验要求
编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。
三、实验步骤
实现动态分区的分配和回收,主要考虑的问题有三个:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法:第三,在设计的数据表格基础上设计主存回收算法。
首先,考虑第—个问题:设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。
由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,主存的分配和回收主要是对空闲区的操作。这样为了便于对主存空间的分配和回收,就建立两张分区表记录主存使用情况.一张表格记录作业占用分区的“已分配区表”一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。在试验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个作业占用分区的登记项,内容为该作业的作业名;空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配”。在实际系统中,这两表格的内容可能还要多,实验中仅仅使用上述必须的数据。为此,“已分配区表”和“空闲区表”
可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
四、实验结果
程序代码:
#include <iostream.h>
#include <iomanip.h>
float minsize=5;
int count1=0;
int count2=0;
#define m 10
#define n 10
struct
{float address;
float length;
int flag;
}used_table[n];
struct
{float address;
float length;
int flag;
}free_table[m];
void initialize(void);
int distribute(int, float);
int recycle(int);
void show();
void initialize(void)
{
int a;
for(a=0; a<=n-1; a++)
used_table[a].flag=0;
free_table[0].address=1000;
free_table[0].length=1024;
free_table[0].flag=1;
}
int distribute(int process_name, float need_length)
{
int i, k=-1;
float ads, len;
int count=0;
i=0;
while(i<=m-1)
{
if(free_table[i].flag==1 && need_length <=free_table[i].length)
{
count++;
if(count==1||free_table[i].length < free_table[k].length)
k=i;
}
i=i+1;
}
if(k!=-1)
{
if((free_table[k].length-need_length)<=minsize)
{
free_table[k].flag=0;
ads=free_table[k].address;
len=free_table[k].length;
}
else
{
ads=free_table[k].address;
len=need_length;
free_table[k].address+=need_length;
free_table[k].length-=need_length;
}
i=0;
while(used_table[i].flag!=0)
{i=i+1;}
if(i<=n-1)
{
used_table[i].address=ads;
used_table[i].length=len;
used_table[i].flag=process_name;
count1++;
}
else
{
if(free_table[k].flag == 0)
{
free_table[k].flag=1;
free_table[k].address=ads;
free_table[k].length=len;
}
else
{
free_table[k].address=ads;
free_table[k].length+=len;
}
cout<<"内存分配区已满,分配失败!\n";
return 0;
}
}
else
{
cout <<"无法为该作业找到合适分区!\n";
return 0;
}
return process_name;
}
int recycle(int process_name)
{
int y=0;
float recycle_address, recycle_length;
int i, j, k;
int x;
while(y<=n-1&&used_table[y].flag!=process_name)
{ y=y+1;}
if(y<=n-1)
{
recycle_address=used_table[y].address;
recycle_length=used_table[y].length;
used_table[y].flag=0;
count2++;
}
else
{
cout<<"该作业不存在!\n";
return 0;
}
j=k=-1;
i=0;
while(!(i>=m||(k!=-1&&j!=-1)))
{
if(free_table[i].flag==1)
{ if((free_table[i].address+free_table[i].length)==recycle_address)
k=i;
if((recycle_address+recycle_length)==free_table[i].address)
j=i;
}
i=i+1;
}
if(k!=-1)
{
if(j!=-1){
free_table[k].length+=free_table[j].length+recycle_length;
free_table[j].flag=0;
}
else
free_table[k].length+=recycle_length;
}
else if(j!=-1)
{
free_table[j].length+=recycle_length;
free_table[j].address=recycle_address;
}
else
{
x=0;
while(free_table[x].flag!=0)
x=x+1;
if(x<=m-1)
{
free_table[x].length=recycle_length;
free_table[x].flag=1;
}
else
{
used_table[y].flag=process_name;
cout<<"空闲区已满,回收失败!\n";
return 0;
}
}
return process_name;
}
void show()
{
cout<<" 空 闲 区\n";
for(int i=0;i<=count2;i++)
cout<<"地址:"<<free_table[i].address<<" "<<"作业长度:"<<free_table[i].length<<" "<<"状 态:"<<free_table[i].flag<<endl;
cout<<"已 分 配 区\n";
for(int j=0;j<count1;j++)
cout<<"地址:"<<used_table[j].address<<" "<<"作业长度:"<<used_table[j].length<<" "<<"作业名:"<<used_table[j].flag<<endl;
}
void main()
{
int choice;
int job_name;
float need_memory;
bool exitFlag=false;
cout<<" 动态分区分配方式的模拟 \n";
initialize();
while(!exitFlag)
{
cout<<"1: 分配内存 2: 回收内存\n";
cout<<"3: 查看分配 0: 退 出\n";
cin>>choice;
switch(choice)
{
case 0:
exitFlag=true;
break;
case 1:
cout<<"请输入作业名和所需内存:";
cin>>job_name>>need_memory;
distribute(job_name, need_memory);
break;
case 2:
int ID;
cout<<"请输入您要释放的分区号:";
cin>>ID;
recycle(ID);
break;
case 3:
show();
break;
}
}
}
内存分配回收实现截图
(1)、假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。
(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”。
(3)、当要释放某个作业时,将已分配表中此作业的标志置为‘0’,并在空闲区做相应登记。
五、总结
核心算法:
//最优分配算法实现的动态分区
int distribute(int process_name, float need_length)
{
int i, k=-1; //k用于定位在空闲表中选择的未分配栏
float ads, len;
int count=0;
i=0;
//核心的查找条件,找到最优空闲区
while(i<=m-1) //循环找到最佳的空闲分区
{
if(free_table[i].flag==1 && need_length <=free_table[i].length)
{
count++;
if(count==1||free_table[i].length < free_table[k].length)
k=i;
}
i=i+1;
}
if(k!=-1)
{
if((free_table[k].length-need_length)<=minsize) //整个分配
{
free_table[k].flag=0;
ads=free_table[k].address;
len=free_table[k].length;
}
else
{ //切割空闲区
ads=free_table[k].address;
len=need_length;
free_table[k].address+=need_length;
free_table[k].length-=need_length;
}
i=0;
//循环寻找内存分配表中标志为空栏目的项
while(used_table[i].flag!=0)
{i=i+1;}
if(i<=n-1) //找到,在已分配区表中登记一个表项
{
used_table[i].address=ads;
used_table[i].length=len;
used_table[i].flag=process_name;
count1++;
}
else //已分配区表长度不足
{
if(free_table[k].flag == 0) //将已做的整个分配撤销
{
free_table[k].flag=1;
free_table[k].address=ads;
free_table[k].length=len;
}
else //将已做的切割分配撤销
{
free_table[k].address=ads;
free_table[k].length+=len;
}
cout<<"内存分配区已满,分配失败!\n";
return 0;
}
}
else
{
cout <<"无法为该作业找到合适分区!\n";
return 0;
}
return process_name;
}
每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。再一个问题是回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。物业安保培训方案
为规范保安工作,使保安工作系统化/规范化,最终使保安具备满足工作需要的知识和技能,特制定本教学教材大纲。
一、课程设置及内容全部课程分为专业理论知识和技能训练两大科目。
其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
1)保安人员培训应以保安理论知识、消防知识、法律常识教学为主,在教学过程中,应要求学员全面熟知保安理论知识及消防专业知识,在工作中的操作与运用,并基本掌握现场保护及处理知识2)职业道德课程的教学应根据不同的岗位元而予以不同的内容,使保安在各自不同的工作岗位上都能养成具有本职业特点的良好职业道德和行为规范)法律常识教学是理论课的主要内容之一,要求所有保安都应熟知国家有关法律、法规,成为懂法、知法、守法的公民,运用法律这一有力武器与违法犯罪分子作斗争。工作入口门卫守护,定点守卫及区域巡逻为主要内容,在日常管理和发生突发事件时能够运用所学的技能保护公司财产以及自身安全。
2、培训要求
1)保安理论培训
通过培训使保安熟知保安工作性质、地位、任务、及工作职责权限,同时全面掌握保安专业知识以及在具体工作中应注意的事项及一般情况处置的原则和方法。
2)消防知识及消防器材的使用
通过培训使保安熟知掌握消防工作的方针任务和意义,熟知各种防火的措施和消防器材设施的操作及使用方法,做到防患于未燃,保护公司财产和员工生命财产的安全。
3) 法律常识及职业道德教育
通过法律常识及职业道德教育,使保安树立法律意识和良好的职业道德观念,能够运用法律知识正确处理工作中发生的各种问题;增强保安人员爱岗敬业、无私奉献更好的为公司服务的精神。
4) 工作技能培训
其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
安全生产目标责任书
为了进一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标:
一、目标值:
1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。
2、现金安全保管,不发生盗窃事故。
3、每月足额提取安全生产费用,保障安全生产投入资金的到位。
4、安全培训合格率为100%。
二、本单位安全工作上必须做到以下内容:
1、对本单位的安全生产负直接领导责任,必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全责任制在本单位全面落实,并全力支持安全工作。
2、保证公司各项安全管理制度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。
3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。
4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。
5、在公司及政府的安全检查中杜绝各类违章现象。
6、组织本部门积极参加安全检查,做到有检查、有整改,记录全。
7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要予以查处。
8、虚心接受员工提出的问题,杜绝不接受或盲目指挥;
9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。
10、必须按规定对单位员工进行培训和新员工上岗教育;
11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。
三、 安全奖惩:
1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。
2、每月接受主管领导指派人员对安全生产责任状的落
展开阅读全文