操作系统实验报告__实验一.docx
《操作系统实验报告__实验一.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告__实验一.docx(19页珍藏版)》请在冰豆网上搜索。
![操作系统实验报告__实验一.docx](https://file1.bdocx.com/fileroot1/2022-10/2/bf878128-7a29-4bef-9059-7e112b00df16/bf878128-7a29-4bef-9059-7e112b00df161.gif)
昆明理工大学信息工程与自动化学院学生实验报告
(2012—2013学年第二 学期)
课程名称:
操作系统 开课实验室:
信自楼4452011年4月18日
年级、专业、班
学号
姓
成绩
名
实验项目名称
进程管理
指导教师 舒国锋
教
师
评
教师签名:
语
年
月
日
一、实验要求:
对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间
1.先来先服务算法
2.短进程优先算法
3.高响应比优先算法二、实验目的
通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。
以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。
三、实验原理及基本技术路线图(方框原理图)
输入开始进程数n
创建n个PCB并加入ready-queue中
ready-queue是否为
Y
-1-
用C语言或C++语言开发。
需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。
要求有创建、撤销、调度、阻塞、唤醒进程等功能。
输入开始进程数n
创建n个PCB并加入ready-queue中
ready-queue是否为
Y
N
Running<=逐个将redy_pc中的PCB
-2-
Running<=id
N
Running<=id
Running<=逐个将redy_pc中的PCB
N
阻塞Running
Y
Running=idle
N
Y
将Running从ready_queue中删除,再将running加入block_queueb
更新新进程就绪队列进程优先数,优先数加1
N
是否创建新PCB
Y
创建新进程并加入到ready_queue中
随机对block_queue中的进程PCB询问是否要唤醒?
Y
处理完了吗
N
N
是否要唤醒
Y
将其从blick_queuek队列是中删除,再将其加入ready_queuek
N
阻塞Running
Y
Y
Running=idle
N
将Running从ready_queue中删除,再将running加入block_queueb
N
是否创建新PCB
Y
创建新进程并加入到ready_queue中
随机对block_queue中的进程PCB询问是否要唤醒?
Y
处理完了吗
N
N
是否要唤醒
Y
将其从blick_queuek队列是中删除,再将其加入ready_queuek
Y
四、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
五、实验方法、步骤
源代码:
#include"stdio.h"#include"stdlib.h"#include"iostream.h"#defineNULL0#definefalse0#definetrue1
bool_state=0;
-5-
structPCB
{
intID;
intpriority;intCPUtime;intALLtime;intState;PCB*next;
};
voidinit();/*产生idle进程,输入用户进程数目,调用insert()*/voidprint(PCB*pcb);/*输出进程属性信息*/
voidprint_init(PCB*pcb);/*输出所有PCB的初始值*/
voidinsert();/*生成进程属性信息,插入进程就绪队列*/
voidRun_priority(PCB*pcb);/*运行进程,随机阻塞进程、产生新进程,插入就绪队列,唤醒阻塞进程
*/
voidblock(PCB*pcb);/*调用destroy()将进程插入阻塞队列*/voidwakeup();/*唤醒进程,插入就绪队列*/
voidproc_priority();/*优先权调度算法模拟*/
//voidRun_loop(PCB*pcb);
voidproc_loop();/*轮转法调度算法模拟*/voidupdate(PCB*pcb);/*更新进程信息*/
voidpushback_queue(PCB*queue,PCB*item);/*将item插入到队列的尾部*/
voidinsert_queue(PCB*queue,PCB*item);/*将item插入到队列中,使得插入后,队列中按照优先级从高到低有序*/
voidsort_queue(PCB*&queue);/*对queue中的结点进行排序,按照优先级从大到小*/
PCB*ready_queue,*block_queue,*idleprocess;/*就绪队列,阻塞队列及闲逛进程指针变量*/intmain(intargc,char*argv[])
{
inti=0;while
(1)
{
cout<<"\\**********PROCESS**********/";
cout<<("\nPleaseselectanumin(1,2,0)");cout<<("\n1--priority");
cout<<("\n2--loop");cout<<("\n0--exit\n");
cout<<"Pleaseselectanum:
";cin>>i;
while(i)
{
if(i==1)
{
cout<<("\nThisisaexampleforpriorityprocessing:
\n");init();
proc_priority();
}
elseif(i==2)
{
cout<<("\nThisisaexampleforroundrobinprocessing:
\n");init();
proc_loop();
}else
{
cout<<"Pleaseselectanumin(1,2,0)\n";
}
cout<<"Pleaseselectanum:
";cin>>i;
}
return0;
}
}
voidprint_init(PCB*pcb)//输出所有PCB的初始值
{
PCB*temp=pcb->next;
cout<<("\nIDpriorityCPUtimeALLtimeState");while(temp!
=NULL)
{
cout<<"\n"<ID<<" "<priority<<" "<CPUtime<<""<ALLtime;
if(temp->State==0)cout<<("ready");
elseif(temp->State==1)cout<<("running");
else
cout<<("blocked");temp=temp->next;
}
}
voidprint(PCB*pcb)//输出进程属性信息
{
PCB*temp;temp=pcb;if(pcb->ID==0)
cout<<("\nTheidlepeocessidrunning!
");
else
{
cout<<"\n"<ID<<" "<priority<<" "<CPUtime<<""<ALLtime;
if(temp->State==0)cout<<("ready");
elseif(temp->State==1)
cout<<("running");
-6-
else
cout<<("blocked");
}
}
voidinsert_queue(PCB*queue,PCB*item)//将item插入到队列中,使得插入后,队列中按照优先级从高到低有序
{
PCB*p,*q;q=queue;p=q->next;
while(p!
=0&&p->priority>=item->priority)
{
q=p;
p=p->next;
}if(p==0)
{
item->next=0;q->next=item;
}else
{
item->next=p;q->next=item;
}
}
voidpushback_queue(PCB*queue,PCB*item)//将item插入到阻塞队列的尾部
{
PCB*p,*q;q=queue,p=q->next;while(p!
=0)
-16-
{
q=p;
p=p->next;
}
item->next=q->next;q->next=item;
}
voidsort_queue(PCB*&queue)//对queue中的结点进行排序,按照优先级从大到小
{
PCB*temp=newPCB;temp->next=0;while(queue->next)
{
PCB*p;p=queue->next;
queue->next=p->next;insert_queue(temp,p);
}
queue->next=temp->next;deletetemp;
}
voidinsert()//生成进程属性信息,插入进程就绪队列,显示进程信息
{
PCB*newp=0;staticlongid=0;newp=newPCB;id++;
newp->ID=id;newp->State=0;newp->CPUtime=0;
newp->priority=rand()%3+1;newp->ALLtime=rand()%3+1;newp->next=NULL;
pushback_queue(ready_queue,newp);
//print(newp);
//cout<<("建立:
Creating->ready\n");
}
voidinsert(intn)//生成n个进程属性信息,插入进程就绪队列,显示进程信息
{
for(inti=0;i}
voidinit()//产生idle进程,输入用户进程数目,调用insert()
{
block_queue=newPCB;block_queue->next=0;ready_