操作系统实验报告

时间:2024.4.20

操作系统实验报告

实验名称:   理解UNIX/LINUX ShellUNIX的进程树     成绩:          

专业班级:计科    姓名:      学号:                联系电话:             

实验日期: 20## 12 5 日              实验报告日期: 2013  12 

一、实验名称

理解UNIX/LINUX ShellUNIX的进程树

二、实验目的

1)了解并掌握操作系统与用户的接口界面;

2)了解进程的结构及控制方法。

三、实验设备

装有Linux虚拟机的计算机

四、实验步骤

1)典型Shell命令的操作和使用,尤其是重定位、管道的应用;

pwd, cd, mkdir, rmdir, cp, ls, rm, cat, …

>   <   |

ps, df, sh, …

2)创建进程,撤消进程,检查进程的状态。

fork(), execl(), 等创建进程,kill撤消进程,

3)编程在子进程中完成ls的功能。

创建子进程,在子进程中启动/bin/ls

五、实验数据、结果分析

1、熟悉Shell命令。

More:分页显示查看的内容,按空格查看下一页的内容,按Q退出分页显示的模式。

Grep ‘^b’:以分页显示的方式显示以b开头的文件。

> t1:重定向查找出的文件将其存入t1文件夹中。

Ps:列出当前系统正在运行的进程。

2、创建进程,撤消进程,检查进程的状态。

Ps -ef:查看所有在运行的程序。

Pts/0表示在终端0上运行。

打开一个新的终端后,在终端0中用ps -ef命令,可看到出现了pts/1。

在终端1中创建bash进程,并用ps -f查看。在终端0中用ps -ef查看所用运行中的进程。

用ps -ft pts/1查看终端1中的所有进程。

用kill -9命令无条件杀死进程。如在终端0中输入kill -9 9127命令为无条件删除进程9127,可在终端1中看到结果显示为“以杀死”。

输入kill -9 9074,无条件删除终端1这个进程。

六、学习心得


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


这个免费,文库上那个家伙要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的结构。通过创建进程、观察正在运行的进…

操作系统实验报告

目录实验一进程的创建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...

操作系统实验报告

操作系统实验报告学院计算机科学与技术学院班级姓名完成日期大连理工大学DalianUniversityofTechnology大连理工大学实验报告学院系计算机科学与技术学院专业计算机科学与技术班级电计1103姓名...

操作系统实验报告

实验一LinuxUNIX操作系统使用命令解释程序1目的通过本实验熟悉UNIX或Linux操作系统及C语言熟悉系统调用的编程能力程序中允许使用库函数2内容利用C语言编写一个微型命令解释程序接受并解释以下命令dir...

操作系统实验报告

华中科技大学计算机学院操作系统课程设计实验报告班级学号姓名指导教师完成日期20xx04021一实验目的1掌握Linux操作系统的使用方法2了解Linux系统内核代码结构3掌握实例操作系统的实现方法二实验题目1掌...

操作系统进程控制实验报告

操作系统实验报告实验题目进程控制专业计算机科学与技术学生姓名班级学号120xx715指导教师指导单位计算机学院日期20xx年11月13日一实验目的1学习和了解进程控制的基本和常用的系统调用forkwaitsle...

操作系统 综合实验报告

华北科技学院计算机学院综合性实验实验报告课程名称计算机操作系统实验学期20xx至20xx学年第1学期学生所在系部计算机年级大三专业班级计科B113学生姓名黄宋学号20xx07014313任课教师王祥仲实验成绩计...

操作系统实验报告三

操作系统实验报告实验序号03实验项目名称Windows控制台命令系统管理

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