操作系统实验报告.docx
- 文档编号:9642984
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:37
- 大小:325.79KB
操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(37页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
实验报告
实验课程:
操作系统
学生姓名:
吴征宇
学号:
3101110002
专业班级:
J计算机1001
实验一、处理器的调度
一、实验课题:
设计一个按优先数调度算法实现处理器调度的进程
二、数据结构及符号说明:
typedefstructDATA
{charpname[10];//进程名
floattime;//要求运行时间数
intove;//优先级
charflag;//状态
}DATA;
typedefstructpcb
{DATAdata;
structpcb*next;
}pcb;
三.流程图
四、源程序以及注释:
#include
#include
#include
#include
typedefstructDATA
{
charpname[10];//进程名
floattime;//要求运行时间数
intove;//优先级
charflag;//状态
}DATA;
typedefstructpcb
{
DATAdata;
structpcb*next;
}pcb;
intflag=5;//假设有五个进程
pcb*init(pcb*p)//初始化
{
p=(pcb*)malloc(sizeof(DATA));
p->next=NULL;
returnp;
}
voidshow(pcb*p)//输出显示
{
if(!
flag)
{
printf("\n完毕。
\n");
}
else
{printf("\n名称");
printf("");
printf("执行时间");
printf("");
printf("优先数");
printf("");
printf("状态\n");
while(p->next)
{p=p->next;
printf("%s",p->data.pname);
printf("");
printf("%1.0f",p->data.time);
printf("");
printf("%d",p->data.ove);
printf("");
printf("%c\n\n",p->data.flag);
}
}
}
voiddel(pcb*h)//进程执行完成后的删除
{
pcb*p;
p=h;
p=p->next;
if(p->data.flag=='E')
{
printf("有一个进程执行完成:
\n");
printf("进程的名称为:
%s\n",p->data.pname);
p=p->next;
h->next=p;
flag--;
}
}
voidin(pcb*h)//从键盘中输入数据
{
inti=0;
pcb*pc,*l;
pc=h;
printf("输入五个进程的名称、执行时间、优先数:
\n");
for(i;i { l=init(l); scanf("%s%f%d",&l->data.pname,&l->data.time,&l->data.ove); rewind(stdin); if(! l->data.time) { l->data.flag='E'; } else l->data.flag='R'; l->next=NULL; pc->next=l; pc=pc->next; } } voidsoar(pcb*p)//对于这五个进程按其优先级进行排序 { pcb*q; pcb*h; inti=0; intj; q=init(q); h=p->next; for(i;i { for(j=0;j<(flag-1);j++) { if(h->data.time) { if(h->data.ove { q->data=h->data; h->data=h->next->data; h->next->data=q->data; } h=h->next; } else { printf("有一个执行完成: \n"); printf("进程名称: %s\n",h->data.pname); flag--; } } h=p->next; } if(flag) printf("\n目前优先级最高的进程是: %s\n",p->next->data.pname); } voidrun(pcb*h)//执行程序 { h=h->next; h->data.time--; h->data.ove--; if(! h->data.time) { h->data.flag='E'; } } voidmain() {pcb*p; charc; p=init(p); in(p); soar(p); show(p); del(p); while(flag) { run(p); del(p); soar(p); show(p); c=getch(); rewind(stdin); } } 五、初值以及运行结果: 实验二、虚拟存储器 一、实验课题: 理解并掌握模拟分页式虚拟存储管理的缺页中断,以及选择页面调度算法处理缺页中断。 用最近最少用(LRU)页面调度算法处理缺页中断 二、源程序及注释 #include"stdio.h" #definen7 #definem4 voidmain() {intym[n],i,j,q,mem[m]={0},table[m][n]; charflag,f[n]; printf("请输入页面访问序列\n"); for(i=0;i scanf("%d",&ym[i]); printf("\n"); for(i=0;i {q=0; while((ym[i]! =mem[q])&&(q! =m))q++; if(q==m)flag='*';//缺页,则置标志flag为'*' elseflag=''; for(j=q;j>0;j--) mem[j]=mem[j-1]; mem[0]=ym[i]; for(j=0;j table[j][i]=mem[j]; f[i]=flag;} printf("输出结果为下表(0代表为空,*代表有缺页): \n"); for(i=0;i {for(j=0;j printf("%3d",table[i][j]); printf("\n");} for(i=0;i printf("%3c",f[i]);} 三、实验结果 实验三、驱动调度 一、实验课题: 模拟电梯调度算法,对磁盘进行移臂和旋转调度 二、数据结构及其说明 typedefstruct_proc { charname[32];/*定义进程名称*/ intteam;/*定义柱面号*/ intci;/*定义磁道面号*/ intrec;/*定义记录号*/ struct_proc*prior; struct_proc*next; }PRO; 三、源程序及注释 #include #include #include #include typedefstruct_proc { charname[32];/*定义进程名称*/ intteam;/*定义柱面号*/ intci;/*定义磁道面号*/ intrec;/*定义记录号*/ struct_proc*prior; struct_proc*next; }PRO; PRO*g_head=NULL,*g_curr=NULL,*local; intrecord=0;//初始柱面号 intyi=1;//初始方向 intrec0=0;//初始记录号 voidinit() { PRO*p;/*初始化链表(初始I/O表)*/ g_head=(PRO*)malloc(sizeof(PRO)); g_head->next=NULL; g_head->prior=NULL; p=(PRO*)malloc(sizeof(PRO)); strcpy(p->name,"P1"); p->team=100; p->ci=10; p->rec=1; p->next=NULL; p->prior=g_head; g_head->next=p; g_curr=g_head->next; p=(PRO*)malloc(sizeof(PRO)); strcpy(p->name,"P2"); p->team=30; p->ci=5; p->rec=5; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=p; p=(PRO*)malloc(sizeof(PRO)); strcpy(p->name,"P3"); p->team=40; p->ci=2; p->rec=4; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=p; p=(PRO*)malloc(sizeof(PRO)); strcpy(p->name,"P4"); p->team=85; p->ci=7; p->rec=3; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=p; p=(PRO*)malloc(sizeof(PRO)); strcpy(p->name,"P5"); p->team=60; p->ci=8; p->rec=4; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=g_head->next; local=(PRO*)malloc(sizeof(PRO));/*选中进程*/ strcpy(local->name,"P0"); local->team=0; local->ci=0; local->rec=0; local->next=NULL; local->prior=NULL; } voidPrintInit()/*打印I/O表*/ { PRO*t=g_head->next; printf("-------------------------------------\n"); printf("请求I/O表\n"); printf("进程名柱面号磁道号记录号\n"); while(t! =NULL) { printf("%4s%8d%8d%5d\n",t->name,t->team,t->ci,t->rec); t=t->next; } printf("Currentprocessis: \n"); printf("进程名柱面号记录号\n"); printf("%4s%8d%8d\n",local->name,local->team,local->rec); switch(yi) { case1: printf("currentdirectionisUP\n"); printf("-------------------------------------\n"); break; case0: printf("currentdirectionisDOWN\n"); printf("-------------------------------------\n"); break; } } voidacceptreq()/*接受请求函数*/ { PRO*p; p=(PRO*)malloc(sizeof(PRO)); printf("pleaseinputtheinformationofthenewprocess\n"); printf("进程名: "); scanf("%s",p->name); printf("柱面号(0-199): "); scanf("%d",&p->team);/*输入请求进程信息*/ printf("磁道号(0-20): "); scanf("%d",&p->ci); printf("记录号(0-7): "); scanf("%d",&p->rec); getchar(); g_curr=g_head;/*将此节点链入I/O请求表*/ while(g_curr->next! =NULL) g_curr=g_curr->next; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=g_head->next; PrintInit();/*将新的I/O请求表输出*/ } voidqddd()/*驱动调度函数*/ { PRO*out; intdeng=0; intdeng1=0; intmin=g_head->next->team; intmax=g_head->next->team; for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(g_curr->team==record) { min=g_curr->rec; out=g_curr; deng=1; break; } } switch(deng) { case1: for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) {if(g_curr->team==record&&abs(g_curr->rec-rec0)<=abs(min-rec0)) { min=g_curr->rec; out=g_curr; } } break; case0: switch(yi) { case1: for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(g_curr->team>record) { min=g_curr->team; deng1=1; break; } } switch(deng1) { case1: for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(min>=g_curr->team&&g_curr->team>record) { min=g_curr->team; out=g_curr; } } break; case0: yi=0; for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(max<=g_curr->team) { min=g_curr->team; out=g_curr; } } break; } break; case0: for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(g_curr->team { max=g_curr->team; deng1=1; break; } } switch(deng1) { case1: for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(max<=g_curr->team&&g_curr->team { max=g_curr->team; out=g_curr; } } break; case0: yi=1; for(g_curr=g_head->next;g_curr! =NULL;g_curr=g_curr->next) { if(min>=g_curr->team) { min=g_curr->team; out=g_curr; } } break; } break; } break; } strcpy(local->name,out->name); local->team=out->team; local->ci=out->ci; local->rec=out->rec; printf("被选中进程: \n"); printf("进程名柱面号磁道号记录号\n"); printf("%4s%8d%8d%5d\n",out->name,out->team,out->ci,out->rec); switch(yi) { case1: printf("currentdirectionisUP\n"); printf("-------------------------------------\n"); break; case0: printf("currentdirectionisDOWN\n"); printf("-------------------------------------\n"); break; } record=local->team; rec0=local->rec; if(out->next==NULL)/*将选中的进程从I/O请求表中删除*/ { out->prior->next=NULL; free(out); } else { out->prior->next=out->next; out->next->prior=out->prior; free(out); } } voidacceptnum()/*通过输入0~1选择‘驱动调度’或是‘接受请求’*/ { floatnum; charc='y'; do { printf("pleaseinputanumberbetween0and1\n"); printf("num<=0.5: 接受请求num>0.5: 驱动调度\n"); printf("num: "); scanf("%f",&num); getchar(); while((num<0||num>1))/*过滤不合法数据注意: 本程序其他输入数据可能未过滤*/ { printf("ERROR! ! ! ! Inputagainplease! \nnum: \n"); scanf("%f",&num); getchar(); } if(num>0.5)/*驱动调度*/ { if(g_head->next==NULL) printf("请求I/O表isempty! ! ! \n");/*请求表为空无需调度*/ else { printf("-------------------------------\n"); printf("驱动调度\n"); qddd();/*调用函数进行调度*/ } } else/*接受请求*/ { printf("-------------------------------\n"); printf("接受请求\n"); acceptreq(); } printf("是否继续(y/n): ");/*输入n离开本程序*/ c=getchar(); if(c=='n'||c=='N') printf("thankyoufortestingmyprogram! \nBYE! \n"); }while(c=='y'||c=='Y'); } intmain()/*主程序*/ { init(); PrintInit(); acceptnum(); return0; } 四、实验结果 实验四、同步机构 一、实验课题: 模拟PV操作同步机构,且用PV操作解决生产者-----消费者问题 二、源程序及注释 #include #include"math
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)