操作系统2

  • 格式:doc
  • 大小:67.00 KB
  • 文档页数:7

重庆科技学院

实 验 报 告

课程名称:计算机操作系统__开课学期:09-10学年第二学期

院(系):_电子信息工程学院_开课实验室:_I515__

学生姓名:___苏春雷 __ 专业班级:___07计科普__

学 号:__2007520005

重庆科技学院学生实验报告

课程名称 计算机操作系统 实验项目名称 进程的控制与通信

开课院系及实验室 I515 实验日期 2010-04-27

学生姓名 苏春雷 学号 2007520005 专业班级 07计科普

指导教师 黄永文 实验成绩

教师评语:

教师签字: 批改时间:

一、实验目的和要求

目的:

(1) 熟悉Windows系统提供的进程创建与调度。

(2) 掌握Windows系统环境下进程的控制方式与通信方法。

二、实验内容和原理

(1) 进程1和进程2运行过后,进程3才能运行

(2) 进程3运行完成后,进程4和进程5才能运行

(3) 进程4运行一旦完成,进程2也终止

(4) 设置公用存储区传递信息,进程3向进程5传递数据

三、主要仪器设备

装有visual C++的计算机

四、实验操作方法和步骤

(1)启动Visual C++ 6.0集成开发环境,单击菜单栏中的“文件”/“新建”命令打开“新建窗口”,选择“文件”选项卡,在列表中选择“C++ source File”项,在文件名称中输入文件名称“test2”,在Location中确定文件编程框架(项目资源文件)存放的位置“D:\test2”,确认输入正确后点击“OK”按钮.

(2)

#include"stdio.h"

#include"stdlib.h"

#include "string.h"

#include "ctime"

#include

#include

#define WAIT 1

#define RUN 2

#define FINISH 3

using namespace std;

///////结构体模拟进程PCB,增加是否可以运行及是否已经运行过的标识

typedef struct pcb

{

int num;

struct pcb *next;

int priority;

int timeneed;

int state;

int ready;//true or false 表示是否已经准备好运行

int done;//true or false 表示运行的情况

}pcb;/*用此结构体来模拟一个进程*

struct pcb *head;

struct pcb *run;

pcb *jccreat(int n)/*此函数用于创建进程队列*/

{

int i=1;

pcb *head,*p,*q;

head=(pcb *)malloc(sizeof(pcb));/*创建一个空表头*/

p=head;

////创建进程并设置优先级与运行时间

for(i=1;i<=n;i++)/*用循环来创建指定个结点*/

{

q=(pcb *)malloc(sizeof(pcb));

p->next=q;

q->num=i;

q->next=NULL;

q->priority=1+(10*rand()/(RAND_MAX+1.0));/*随机产生优先级*/

q->timeneed=1+(100*rand()/(RAND_MAX+1.0));/*随机产生运行时间*/

if(i==1||i==2) //设置其中两个进程可以运行,其它进程应该是阻塞状态

{ q->state=WAIT;

q->ready=true; }

else

{ q->state=BLOCK;

q->ready=false; }

q->done=false;

p=q;

}

return head;/*返回表头指针*/

}

pcb *getmaxpriority(struct pcb *head)/*此函数用来挑选一个优先级最大的进程来执行*/

{

struct pcb *p,*q;

int max;

p=head->next;

while(p)//获得第一个处于就绪状态的进程

{

if(p->ready==true)

{

max=p->priority;/*初始max为队首结点的优先级*/

break;}

q=p;

}

while(p)

{

if(p->ready==true && p->state==WAIT && p->priority>=max)/*逐一比较,选出优先级最大的结点*/

{max=p->priority;

q=p;}

p=p->next;

}

q->done= true;

return q;

}

/////////进程删除

void delect(struct pcb *head,struct pcb *run)/*此函数用来将运行完的进程删除出进程队列*/

{

struct pcb *q=head;

while(q->next)/*扫描进程队列,找到执行完了的进程*/

{

if(q->next->num==run->num)/*判断是不是已完成的进程*/

{

if (run->next!=NULL)

q->next=run->next;

else q->next=NULL;

free(run);/*释放申请的空间*/

return;

}

q=q->next;

}

}

int i=0;

//////////进程的控制

void changestate()//在进程运行过程中实时更改进程的状态

{

struct pcb *p,*q;

p=head->next;

q=p;

*** bool temp1=false,temp2=false,temp3=false; ***//放在程序首

while(p)

{

if(p->num==1 && p->done==true )/* 进程1 和 进程2 运行过之后再运行进程3*/

temp1=true;

if(p->num==2 && p->done==true && temp1==true)

temp2=true;

if(temp2==true && p->num==3)

p->ready=true;

if(p->num==3 && p->timeneed==0)/* 进程3运行完后进程4和进程5才能运行*/

temp3=true;

if(p->num==4 && temp3==true)

p->ready==true;

if(p->num==5 && temp3==true)

p->ready==true;

„„

pcb *getprocess(struct pcb *head)/*此函数用来挑选一个适合的进程来执行*/

{

struct pcb *p,*q;

int max;

p=head->next;

while(p)//获得第一个处于就绪状态的进程

{

if(p->ready==true)

{

max=p->priority;/*初始max为队首结点的优先级*/

break;}

q=p;

}

while(p)

{

if(p->ready==true && p->state==WAIT && p->priority>=max)/*逐一比较,选出优先级最大的结点*/

{max=p->priority;

q=p;}

p=p->next;

}

q->done= true;

return q;

}

五、实验记录与处理(数据、图表、计算等)

在 Enter the number of the progresses: 输入7

运行后出现:

实验成功。

六、实验结果及分析

在实验过程中迟迟不能拿出正确结果,原因还是代码的理解出了问题,在以后的学习中需要加强对基础知识的复习。