tmp=tmp*x;
}
returntmp;
}
introot(intx,inty){
intresult=y,count=0;
while(result!
=1){
result=result/x;
count++;
}
returncount;
}
intsplit(inttempId){
block*pend=(structblock*)malloc(sizeof(structblock));
block*cend=(structblock*)malloc(sizeof(structblock));
block*newf=(structblock*)malloc(sizeof(structblock));
block*newu=(structblock*)malloc(sizeof(structblock));
pend=id[tempId]->next;
intflag=0,isFirst=0;
while(pend!
=NULL){
if(pend->loc==0){
if(isFirst==0){
id[tempId]->next=pend->next;
}else{
pend->prior->next=pend->next;
}
intsize=(pend->size)/2;
intstart=pend->start;
newu->size=size;
newu->start=start;
newf->start=start+size;
newu->loc=0;
newf->size=size;
newf->loc=0;
newf->prior=newu;
newu->next=newf;
newf->next=NULL;
tempId--;
cend=id[tempId];
while(cend->next!
=NULL){
cend=cend->next;
}
cend->next=newu;
newu->prior=cend;
flag=1;
return1;
}else{
pend=pend->next;
isFirst++;
}
}
if(flag==0){
tempId=tempId+1;
if(tempId<=9){
free(pend);free(cend);free(newu);free(newf);
split(tempId);
}else{
return-1;
}
}
}
intmerge(inttempId,block*first){
block*merger=(structblock*)malloc(sizeof(structblock));
block*second=NULL;
second=id[tempId]->next;
intnextStart=first->start+first->size;
intpreStart=first->start-first->size;
intflag=0,isFirst=0;
while(second!
=NULL){
if((second->start==nextStart||second->start==preStart)&&second->loc==0){
merger->size=(first->size)+(second->size);
merger->loc=0;
merger->start=(first->start)<(second->start)?
(first->start):
(second->start);
if(first->next!
=NULL){
first->next->prior=first->prior;
}
if((first->prior->prior)==first->prior){
id[tempId]->next=first->next;
}else{
first->prior->next=first->next;
}
if(second->next!
=NULL){
second->next->prior=second->prior;
}
if(isFirst==0){
id[tempId]->next=second->next;
}else{
second->prior->next=second->next;
}
tempId++;
merger->next=id[tempId]->next;
merger->prior=id[tempId];
if(id[tempId]->next!
=NULL)id[tempId]->next->prior=merger;
id[tempId]->next=merger;
if(tempId<9){
merge(tempId,merger);
}else{
return0;
}
return1;
}else{
second=second->next;
isFirst++;
}
}
return1;
}
intfreeb(intsize){
block*first=(structblock*)malloc(sizeof(structblock));
inttempId=root(2,size);
first=id[tempId]->next;
intflag=0;
while(first!
=NULL){
if(first->loc==1){
first->loc=0;
flag=1;
break;
}else{
first=first->next;
}
}
if(flag==1){
merge(tempId,first);
printmem();
}else{
printf("需要释放的内存块不存在!
\n");
}
return1;
}
intrequestb(intsize){
block*temp=(structblock*)malloc(sizeof(structblock));
inttempId=root(2,size);
intflag=0;
temp=id[tempId]->next;
while(temp!
=NULL){
if(temp->loc==0&&temp->size==size){
temp->loc=1;
flag=1;
printf("分配成功!
\n");
printmem();
return1;
}else{
temp=temp->next;
}
}
if(flag==0){
tempId++;
if(tempId<=9){
intrs=split(tempId);
if(rs==-1){
printf("没有合适的空间可分配!
\n");
return-1;
}else{
requestb(size);
}
}else{
printf("没有合适的空间可分配!
\n");
return-1;
}
}
free(temp);
}
intmain(){
init();
intflag=1;
intsize;
charorder;
do{
printf("请输入命令:
(以空格相隔,示例:
r8)\n");
scanf("%c%d",&order,&size);
if(order=='r'){
requestb(size);
}elseif(order=='f'){
freeb(size);
}else{
printf("error!
");
}
printf("是否继续?
(1继续,0退出):
");
scanf("%d",&flag);
getchar();
}while(flag==1);
}
结果图:
2.页故障率反馈模型
源程序;
#include
#include
#include
#defineMAX_WORKSET10
#defineWINDOW_SIZE20
intmempage=10;
intprocArray[WINDOW_SIZE];
intwin[MAX_WORKSET][2];
doublemaxRate=0.8,minRate=0.2;
doublecurRate;
intcur_workset=3;
intconflictCount=0;
voidprint(){
curRate=(double)conflictCount/(double)WINDOW_SIZE;
printf("缺页故障率:
%g,故障率上限/下限:
%g/%g\n",curRate,maxRate,minRate);
}
voidchangeArray(){
inti;
for(i=0;iprocArray[i]=rand()%mempage;
}
printf("进程调用页面序列:
");
for(i=0;iprintf("%d|",procArray[i]);
}
printf("\n");
}
voidinit(){
inti,j;
//changeArray();
for(i=0;iwin[i][0]=-1;
win[i][1]=cur_workset;
}
}
voidchangePage(intnumber){
inti,flag=0;
for(i=1;iif(win[flag][1]<=win[i][1]){
flag=i;
}
}
win[flag][0]=procArray[number];
win[flag][1]=1;
conflictCount++;
for(i=0;iif(i!
=flag&&win[i][1]!
=-1){
win[i][1]++;
}
}
}
voidstep(intnumber){
inti,hit=0;
for(i=0;iif(procArray[number]==win[i][0]){
//number++;
hit=1;
break;
}
}
if(hit==0){
changePage(number);
}
}
voidrun(){
inti;
conflictCount=0;
changeArray();
for(i=0;istep(i);
}
printf("冲突次数:
%d,",conflictCount);
}
voidfeedback(){
curRate=(double)conflictCount/(double)WINDOW_SIZE;
if(curRate>maxRate){
cur_workset++;
}elseif(curRatecur_workset--;
}
}
intmain(){
init();
charquit;
do{
run();
print();
feedback();
printf("输入任意字符继续,q退出\n");
scanf("%c",&quit);
getchar();
}while(quit!
='q');
}
4、结果分析与实验体会
存储管理是操作系统中最重要的组成部分之一。
在早期计算时代,由于人们所需要的内存数目远远大于物理内存,人们设计出了各种各样的策略来解决此问题,其中最成功的是虚拟内存技术。
它使得系统中为有限物理内存竞争的进程所需内存空间得到满足。
我们以BuddyHeap算法为例,实现模拟Linux系统中连续内存分配。
BH算法具有速度快的明显特点,同时解决了外碎片问题,但带来内碎片,这是由于实际请求一般不能恰好与2i相对应,此时必须向上取整。
对于更大块的请求内碎片的浪费更严重。
为此Linux将剩余的内碎片按2j整数次幂切片并由二次分配器进行单独管理。
此外当进程物理空间不要求连续时,内存分配由第三分配器完成。
此外,这个实验还需要很好的理解FIFO算法,这是最简单的页面淘汰算法,在实现时,对应每一个页面需要有一个调入时间,该时间可设在内存中并用软件记录,不过最好设在寄存器中并由硬件记录。
当内存空间紧张时,调入时间最早的页面将被淘汰。
FIFO算法易于理解和编程,但它的效率不高。
被置换的页面可能存有一个初始化程序段,很早以前曾用到,以后不会再用到;但也可能存有一组经常访问的全局变量,初始化时被调入内存,在整个程序运行过程中都将会用到。
这次实验难点在理论方面,在理解了之后操作比较顺利。
友情提示:
范文可能无法思考和涵盖全面,供参考!
最好找专业人士起草或审核后使用,感谢您的下载!