操作系统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
运行后出现:
实验成功。
六、实验结果及分析
在实验过程中迟迟不能拿出正确结果,原因还是代码的理解出了问题,在以后的学习中需要加强对基础知识的复习。