操作系统实验报告模板

操作系统实验报告

实验1

分析实验结果参照实验指导书回答下面的问题:

5:

6:

从实验中得到了两次不同的结果

原因是程序采用了多线程的写法 , 两个线程同时抢占CPU资源, CPU并发处理该程序。

10:

11:

CPU并发处理程序

第一次

先运行func2()中的 x=x+2   再输出x=2 接着执行func2()中的y=3,然后执行func1() x=3  y=y+x, 输出y  所以 结果为 x=2      y=7

第二次

先运行 func1()中的 x=4  y=4 再运行 func2()中y=3  x=x+2

得到 x=6  y=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"

#define  TASK_STK_SIZE                 512     //任务堆栈长度

OS_STK        StartTaskStk[TASK_STK_SIZE];

OS_STK        MyTaskStk[TASK_STK_SIZE];       

OS_STK        YouTaskStk[TASK_STK_SIZE];

OS_STK        HerTaskStk[TASK_STK_SIZE];

INT16S key;              //用于退出uCOS_II的键 

char *s;

char *s1="MyTask--ZYS";

char *s2="YouTask-ZYS";

char *s3="HerTask-ZYS";

INT8U err;

INT8U y=0;                //字符显示位置

INT8U Times=0;

OS_MEM *IntBuffer;                 //定义内存控制块指针

INT8U IntPart[8][6];                   //划分分区及内存块

INT8U *IntBlkPtr;

OS_MEM_DATA MemInfo;

void StartTask(void *pdata);

void MyTask(void *pdata);

void YouTask(void *pdata);

void HerTask(void *pdata);

/************************主函数******************************************/

void  main (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 *************************************************/

void  StartTask (void *pdata)

{

#if OS_CRITICAL_METHOD == 3                              

    OS_CPU_SR  cpu_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 *************************************************/

void MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

    OS_CPU_SR cpu_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*************************************/

void YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

    OS_CPU_SR cpu_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******************************/

void HerTask(void *pdata)

{

#if OS_CRITICAL_METHOD==3

    OS_CPU_SR cpu_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<stdio.h>

#include<math.h>

int i,j,t;

int point=100,distance=0;

float sum=0,average=0;

int array[9]={55,58,39,18,90,160,150,38,184};

int fcfs(int array[9])

{

       int count=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");

}

void main()

{

       fcfs(array);

}

 

第二篇:《操作系统(CE)》实验报告模板I(第6周实验用)

                                                              班    级         R工商102           

大连交通大学                               姓    名        吴燚(11号)          

实 验 报 告                     同 组 人   李沛瑾   张文琬   

课程名称:    操作系统(CE)                                     成    绩                          

实验名称:   模拟时间片调度                                    指导老师          郭金令          

相关推荐