操作系统实验报告模板.docx
《操作系统实验报告模板.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告模板.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统实验报告模板
操作系统实验报告
实验1
分析实验结果参照实验指导书回答下面的问题:
5:
6:
从实验中得到了两次不同的结果
原因是程序采用了多线程的写法,两个线程同时抢占CPU资源,CPU并发处理该程序。
10:
11:
CPU并发处理程序
第一次
先运行func2()中的x=x+2再输出x=2接着执行func2()中的y=3,然后执行func1()x=3y=y+x,输出y所以结果为x=2y=7
第二次
先运行func1()中的x=4y=4再运行func2()中y=3x=x+2
得到x=6y=3
15:
CPU并发执行程序使得在完成整个循环之前输出x的值
19:
通过控制turn变量使得程序先完成func2()的完整循环再完成func1()的完整循环最后
得到结果100
23:
由于信号量s的出现通过wai(s)和signal(s)语句避免了在未完成循环前推出的情况
实验2
分析实验结果参照实验指导书回答下面的问题:
5:
11:
发生死锁
交换p()函数中wait(e)与wait(s)的顺序之后
消费者进入缓冲池后没能够出去,一直占用缓冲池,使得生产者无法进入缓冲池生产.
使得进程陷入死锁
不剥夺.
17:
发生死锁:
c()函数中wait(n)与wait(s)的顺序后.
会导致生产者处于一直生产的状态.当缓冲池满后,生产者在缓冲池中,出不去,消费者也进不了缓冲池.仅使进程处于请求保持状态,还有不剥夺,环路等待状态.
实验3(该实验为期中考试项目,按照期中考试要求提交报告)
实验4
问题1:
描述内存控制块结构;描述内存控制块与内存分区和内存块的关系
¦只有当把内存控制块与分区关联起来之后,系统才能对其进行相应的管理和控制。
它才是一个真正的动态内存区。
问题2:
应用程序的源代码(请对内存操作给出注释)
#include"includes.h"
#defineTASK_STK_SIZE512//任务堆栈长度
OS_STKStartTaskStk[TASK_STK_SIZE];
OS_STKMyTaskStk[TASK_STK_SIZE];
OS_STKYouTaskStk[TASK_STK_SIZE];
OS_STKHerTaskStk[TASK_STK_SIZE];
INT16Skey;//用于退出uCOS_II的键
char*s;
char*s1="MyTask--ZYS";
char*s2="YouTask-ZYS";
char*s3="HerTask-ZYS";
INT8Uerr;
INT8Uy=0;//字符显示位置
INT8UTimes=0;
OS_MEM*IntBuffer;//定义内存控制块指针
INT8UIntPart[8][6];//划分分区及内存块
INT8U*IntBlkPtr;
OS_MEM_DATAMemInfo;
voidStartTask(void*pdata);
voidMyTask(void*pdata);
voidYouTask(void*pdata);
voidHerTask(void*pdata);
/************************主函数******************************************/
voidmain(void)
{
OSInit();//初始化uCOS_II
PC_DOSSaveReturn();//保存Dos环境
PC_VectSet(uCOS,OSCtxSw);//安装uCOS_II中断
IntBuffer=OSMemCreate(IntPart,8,6,&err);
OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],0);
OSStart();
}
/****************************任务StartTask*************************************************/
voidStartTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE-1],3);
OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE-1],4);
OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE-1],5);
//按ESC退出ucos
for(;;)
{
if(PC_GetKey(&key)==TRUE){
if(key==0x1B){
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}
}
/****************************任务MyTask*************************************************/
voidMyTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr=OSMemGet(IntBuffer,&err);//请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo);//查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList);//头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
sprintf(s,"%d",MemInfo.OSNUsed);//显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE);
if(Times>4)
{
OSMemPut(IntBuffer,IntBlkPtr);//释放内存块,
}
Times++;
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
/**********************************任务YouTask*************************************/
voidYouTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_YELLOW);
IntBlkPtr=OSMemGet(IntBuffer,&err);//请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo);//查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList);//头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_YELLOW);
sprintf(s,"%d",MemInfo.OSNUsed);//显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_YELLOW);
OSMemPut(IntBuffer,IntBlkPtr);//释放内存块,
OSTimeDlyHMSM(0,0,2,0);//等待2s
}
}
/**************************任务HerTask******************************/
voidHerTask(void*pdata)
{
#ifOS_CRITICAL_METHOD==3
OS_CPU_SRcpu_sr;
#endif
pdata=pdata;
for(;;)
{
PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_RED);
IntBlkPtr=OSMemGet(IntBuffer,&err);//请求内存块,分区指针,错误信息
OSMemQuery(IntBuffer,&MemInfo);//查询内存控制块信息,待查询内存控制块指针
sprintf(s,"%0x",MemInfo.OSFreeList);//头指针
PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_RED);
sprintf(s,"%d",MemInfo.OSNUsed);//显示已用数目
PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_RED);
OSMemPut(IntBuffer,IntBlkPtr);//释放内存块,
OSTimeDlyHMSM(0,0,1,0);//等待1s
}
}
问题3:
上述程序输出结果的截屏画面
实验5
FCFS磁盘调度算法的实现
#include
#include
inti,j,t;
intpoint=100,distance=0;
floatsum=0,average=0;
intarray[9]={55,58,39,18,90,160,150,38,184};
intfcfs(intarray[9])
{
intcount=0;
printf("从100号磁道开始");
printf("\n");
printf("被访问的下一个磁道号移动磁道数");
printf("\n");
for(i=0;i<9;i++)
{
count=count+1;
printf("%d",array[i]);
distance=fabs(point-array[i]);
point=array[i];
sum=sum+distance;
printf("%d",distance);
printf("\n");
}
average=sum/count;
printf("sum=%2f",sum);
printf("\n");
printf("average=%f",average);
printf("\n");
}
voidmain()
{
fcfs(array);
}