操作系统实验报告

时间:2024.3.27

武汉理工大学

实验课程名称        操作系统           

开 课 学 院     计算机科学与技术学院     

指导老师姓名                      

学 生 姓 名                        

学生专业班级                   

2014 —  20## 学年  第 一学期

实验课程名称:    操作系统             

实验课程名称:    操作系统             

实验课程名称:    操作系统             

实验课程名称:   操作系统                

实验课程名称:    操作系统             


第二篇:操作系统实验报告(免费)


这个免费,文库上那个家伙要10分,下着蛋疼

实验   进程状态转换及其PCB的变化

一、程序流程图:

二、使用的数据结构及说明:

         在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:

struct PCB

{

  int  P_Id;                                                     //PCB的ID号

  char P_Name[10];                             //PCB的名称

  char P_State[10];                                       //PCB状态

  int  P_Runtime;                                         //PCB的所需要的运行时间

  int P_Requiry;                                             //PCB所需要的资源要求

  struct  PCB * next ;                                   //PCB块的下一个指针

} ;                                                                      

  其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。

三、程序源代码:

#include"stdlib.h"

#include"stdio.h"

#include"string.h"

/********** globle structure and viable ******/

struct PCB

{

  int  P_Id;                                           //PCB的ID号

  char P_Name[10];                             //PCB的名称

  char P_State[10];                                       //PCB状态

  int  P_Runtime;                                         //PCB的所需要的运行时间

  int P_Requiry;                                             //PCB所需要的资源要求

  struct  PCB * next ;                                   //PCB块的下一个指针

} ;

struct PCB * Create_state;                            //创建状态

struct PCB * Run_state;                                 //运行状态

struct PCB * Ready_state;                   //就绪状态

struct PCB * Block_state;                     //阻塞状态

struct PCB * Exit_state;                                 //退出状态

int signal4=0;                                                   //标示进程4的完成状态

int signal5=0;                                                   //标示进程5的完成状态

void InsertQueue(struct PCB **head,struct PCB *node)  /* insert node function */

{

  struct PCB * p,*q;

  node->next=NULL;

  if(*head==NULL)                                                  //如果队列为空

  {

    *head=node;

  }

 Else                                                                  //队列不空

  {

    p=*head;

    q=p->next;

    while(q!=NULL)                                       //找到最后的元素位置

      {

         p=q;

        q=q->next;         

      }

    p->next=node;                                       //将节点插入队列

  } 

}

void DeleteQueue(struct PCB **head,struct PCB *node)  //撤销进程,从队列中删除元素

{

         struct PCB *p,*q;

         q=*head;

         if(*head==NULL||node==NULL)                                      //如果队列为空,返回

           return ;

         if(*head==node)                                                               //如果要删除的元素是队首元素

           {

        *head=(*head)->next;

                   return;

           }

        Else                                                                                      //如果不是队列的首元素

          {

            while(q->next!=p&&q->next!=NULL)

                   q=q->next;

            q=p->next;

            p->next=NULL;

          }

}

void Display_Process(struct PCB * node)                     //打印进程状态的元素函数

{

  printf("\n\nthis process Id is        : %d \n",node->P_Id);

  printf("this process name is      : %s \n",node->P_Name);

  printf("this process state is     : on %s \n ",node->P_State);

  printf("this process Runtime is   : %d \n",node->P_Runtime);

 

if(node->P_Requiry)

  printf("this process resource is ready    \n");

else

  printf("this process resource is not ready ! \n");

}

void DispatchToBlock(struct PCB *node)        // /* dispatch to block function*/

{                                                                                            //调度到阻塞状态的函数

   //struct PCB *p=(struct PCB *)malloc(sizeof(struct PCB));

   if(!node->P_Requiry)                               //如果所需要的资源没有满足则,调度到阻塞状态

     {

         strcpy(node->P_State,"block");

       InsertQueue(&Block_state,node);                   //插入到阻塞队列

         Display_Process(node);

     }

}

void DispatchToReady(struct PCB *node)  // dispatch to ready state

{                                                                                   //调度到就绪状态的函数

   if(node->P_Requiry)                                         //如果所需的资源满足,则调度

     {

         strcpy(node->P_State,"Ready");

       InsertQueue(&Ready_state,node);

         Display_Process(node);

     }

}

void DispatchBlockToReady()  //dispatch the process to readyqueue

{                                                                         //从阻塞状态调度到就绪状态函数

  struct PCB*p,*q;

  q=Block_state;

  while(q!=NULL)                                                    //如果阻塞状态队列不空

   { 

      p=q;

      q=q->next;

     if(signal4&&p->P_Id==4)                    //如果所需要的资源满足

         {

           DeleteQueue(&Block_state,p);

           strcpy(p->P_State,"ready");

          InsertQueue(&Ready_state,p);

           printf("process4 will be in the state of ready!\n");

           Display_Process(p);

          }

     if(signal5&&p->P_Id==5)

         {

           DeleteQueue(&Block_state,p);

           strcpy(p->P_State,"ready");

          InsertQueue(&Ready_state,p);

           printf("process5 will be in the state of ready!\n");

           Display_Process(p);

          }       

   }

}

void Create_Process()                                                                        //创建进程函数

{

  int i;

  struct PCB *p;

  char name[10];

  strcpy(name,"process");

   for(i=1;i<3;i++)                                                                     //动态创建2个处于阻塞状态的进程

   {

    p=(struct PCB *)malloc(sizeof(struct PCB));

    p->P_Id=i;

    name[7]=i+'0';

    name[8]='\0';

    strcpy(p->P_Name,name);

    strcpy(p->P_State,"create");

    p->P_Runtime=1;                                                               //所需要的时间片为1

    p->P_Requiry=0;

 

    Display_Process(p);

    sleep(4);

    printf(" \n process%d will be in the state of Block, waiting the resource ready \n\n",i);

    DispatchToBlock(p);                                                        //同时调度到阻塞队列

   }

  

   for(i=3;i<7;i++)                                                                     //创建4个就绪状态的队列

   {

     p=(struct PCB *)malloc(sizeof(struct PCB));

    p->P_Id=i;

    name[7]=i+'0';

    name[8]='\0';

    strcpy(p->P_Name,name);

    strcpy(p->P_State,"create");

   

      p->P_Requiry=1;

    if(i==6)                                                                        //在这里个进程6所需要的时间片为2

      p->P_Runtime=2;

    else

      p->P_Runtime=1;

 

    Display_Process(p);

    sleep(4);

    printf(" \n process%d will be in the state of Ready, waiting to run \n\n",i);

    DispatchToReady(p);  

   } 

}

void display(struct PCB **head)                                       //打印各个状态队列里进程数目

{

  struct PCB *p,*q;

   p=*head;

 while(p!=NULL)

 {

  sleep(2);

  //printf("\n\n///////////////////////////////////\n");

  printf("\n\nthis process Id is        : %d \n",p->P_Id);

  printf("this process name is      : %s \n",p->P_Name);

  printf("this process state is     : on %s \n ",p->P_State);

  printf("this process Runtime is   : %d \n",p->P_Runtime);

 

if(p->P_Requiry)

  printf("this process resource is ready    \n");

else

  printf("this process resource is not ready ! \n");   

     p=p->next;

  }

}

void Process_Run()                                                                    //进程运行函数

{

  struct PCB *p,*q;

  p=Ready_state;

  q=p;

  while(p!=NULL)                                                                       //就绪队列不空则继续执行

    {

       if(p->P_Runtime<=0) break;                             //如果时间片执行完了,则跳出循环

      strcpy(p->P_State,"running");

         Display_Process(p);

      p->P_Runtime=p->P_Runtime-1;

       sleep(4);

      if(p->P_Runtime>0)                                              //没有完成,则进入就绪队列

        {

          printf("this process is not finished,will be dispatch to the ready queue!!\n");

          DeleteQueue(&Ready_state,p);

           strcpy(p->P_State,"ready");

          InsertQueue(&Ready_state,p);

          Display_Process(p);

        }

      Else                                                                          //执行完成,则跳出,并发送相应的信息

        {

      printf("\n\nProcess%d is finished and will be in the state of exit!\n\n",p->P_Id);

          if(p->P_Id==4) signal4=1;

          if(p->P_Id==5) signal5=1;

        }

       if(signal4||signal5)

          DispatchBlockToReady();           //如果资源满足,则将进程调度到就绪队列

         q=q->next;

         p=q;

    }

   if(q==NULL)

    printf("\nthere is no process ready!\n    STOP Machine!!!\n");

}

int main(int argc,char * argv[])                                       //主函数

{

   int i;

   char c='c';                                                                              //界面

   printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");

   printf("...................................Ding Hai bo\n");

   printf("......Press s to start the process.......\n");

   scanf("%c",&c);

   while(1)

    {

      if(c=='s')break;

      scanf("%c",&c);

    }

   Create_Process();                                                                //调用创建进程函数

   printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");

   printf("\n>>>>>>> Display the Ready queue  >>>>>>>>>>>>>>>\n");

   sleep(5);

   display(&Ready_state);         ////////////////显示就绪队列里的进程

   printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");

   printf("\n>>>>>>>> Display the Block queue   >>>>>>>>>>>>\n");

   sleep(5);                                                                                 //显示阻塞队列函数

   display(&Block_state);         /////////////////////

   printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n\n");

   printf("\n>>>>>>>>  Now the process start to run     >>>>>>>>>>>\n");

   sleep(5);

   Process_Run();                                                                     //调用进程运行函数

   }

四、运行结果及说明:

         运行结果的截图:

下面的运行结果是程序执行的每一步进程调度的显示,从进程的创建到进程的执行,结束,每一步进程调度都有显示。

五.程序使用说明:

         1)输入字符’s’启动程序

         2)程序将自动执行,自动创建进程,运行进程和结束进程。

         3)程序将自动显示每一步进程的执行状态。

更多相关推荐:
操作系统实验报告 完全版

《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows2000的结构。通过创建进程、观察正在运行的进…

操作系统实验报告

操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月5日实验报告日期20xx年12月5日一实验名称理解UNIXLINUXShell及...

操作系统实验报告

目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验七LRU页面置换算法14实验八磁盘调度18实验一进程的创建1一实验目的编写一段程...

操作系统实验报告

操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行的现象实验原理fork建立子进程子进程得到父进程地址空间的一个复制返回值成功时该...

计算机操作系统课程设计报告

《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.........................................…

操作系统课程设计实验报告

操作系统课程设计实验报告姓名学号班级地点20xx年月日任务说明共完成四个任务任务一IO系统调用开销比较任务二实现一个简单的shell任务三进程线程同步任务四文件内容的并行搜索其中任务一完成了标准c和unix下的...

操作系统实验报告

郑州航空工业管理学院计算机科学与应用系课程设计报告操作系统原理操作系统课程设计目录1题目简述22需求分析221设计思想222要求323任务324运行环境325开发工具33概要设计与详细设计331系统流程图332...

操作系统实验报告

操作系统实验报告,内容附图。

操作系统实验报告

一实验内容模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序二实验目的现代计算机系统的硬件部分都设有中断机构它是实现多道程序设计的基础中断机构能发现中断事件且当发现中断事件后迫使正在处理器上执行的进程...

操作系统上实验报告3

操作系统实验三报告实验题目进程管理及进程通信实验环境虚拟机Linux操作系统实验目的1利用Linux提供的系统调用设计程序加深对进程概念的理解2体会系统进程调度的方法和效果3了解进程之间的通信方式以及各种通信方...

操作系统原理实验报告02

操作系统原理实验报告实验序号2实验项目名称Windows基本进程管理

操作系统原理实验报告

操作系统原理实验报告一课程设计的题目根据操作系统原理课程的课堂教学内容结合自己的知识积累情况题目可从下述拟题中选择亦可自定二实验设计的内容在Linux或Windows操作系统下用C语言进行操作系统相关的设计开发...

操作系统实验报告(38篇)