进程调度模拟实验

  • 格式:doc
  • 大小:45.00 KB
  • 文档页数:9

进程调度模拟实验 1.实验目的 通过对进程调度算法的模拟加深对进程概念和进程调度过程的理解。 2.实验内容 用C语言、Pascal语言或其他开发工具实现对N(N=5)个进程的调度模拟,要求至少采用两种不同的调度算法(如简单轮转法Round Robin和优先权高者优先算法Highest Priority First),分别进行模拟调度。 每个用来标识进程的进程控制块PCB用结构(记录)来 描述,根据需要,它包括以下字段: 进程标识数ID。 进程优先数Priority,并规定优先数越大的进程,其优先权越高。采用简单轮转法时该字段无用。 进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 优先数改变的原则(采用简单轮转法时该字段无用): 进程在就绪队列中等待一个时间片,优先数增加1; 进程每运行一个时间片,优先数减3。 假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容:

ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 0 9 0 3 2 3 READY 1 38 0 3 -1 0 READY 2 30 0 6 -1 0 READY 3 29 0 3 -1 0 READY 4 0 0 4 -1 0 READY

为了清楚地观察诸进程的调度过程,程序应该将每个时间片内各进程的情况显示出来并暂停,参考格式如下:

运行/Running:I 就绪队列/Ready Queue:Idi,Idj,… 阻塞队列/Block Queue:Idk,Idl,… ====================================================================== 进程号 优先数 已运行时间 需要时间 开始阻塞时间 阻塞时间 状态 0 P0 C0 A0 T0 B0 S0 1 P1 C1 A1 T1 B1 S1 2 P2 C2 A2 T2 B2 S2 3 P3 C3 A3 T3 B3 S3 4 P4 C4 A4 T4 B4 S4 ====================================================================== 3.实验分析和思考 在实际的进程调度中,还有哪些可行的算法,怎样模拟? 在实际的进程调度中,除了按算法选择下一个运行的进程之外,操作系统还应该做哪些工作? 为什么对进程的优先数可以按上述原则进行修改?有什么好处? 4.实验学时安排: 6学时,在调度与死锁内容学习之后进行。

// 模拟操作系统四种进程调度算法(先进先出、短进程优先、高优先权优先、简单时间片轮转) // 本实验可以模拟任意一种,可以自定义进程个数、自定义初始化他们的PCB。 //C++代码:

#include "stdafx.h" #include using std::cout; using std::cin; using std::cerr;

enum Status{running,ready,blocked}; enum Policy{fifo,spf,hpf,rr};

typedef class PCB {//定义PCB类。 public: int id,priority,cputime,alltime,startblock,blocktime; Status state; class PCB *next; PCB() { priority=0; } }PCB,*PCBptr,**PCBpp;

char x; PCBpp pp;//两个全局变量

void Print(PCBptr head) {//打印head为头指针的PCB链表信息。 PCBptr p; cout<<"\n运行/Running:"; for(p=head;p->next;p=p->next) { if(p->next->state==running) { cout<<"ID"id; break; } } cout<<"\n就绪队列/Ready Queue:"; for(p=head;p->next;p=p->next) if(p->next->state==ready) cout<<"ID"id<<' '; cout<<"\n阻塞队列/Block Queue:"; for(p=head;p->next;p=p->next) if(p->next->state==blocked) cout<<"ID"id<<' ';

cout<<"\n-----------------------------------------------------------------------\n" <<" 进程号 优先数 已运行时间 还需要时间 开始阻塞时间 阻塞时间 状态\n"; for(p=head;p->next;p=p->next) { cout<<" "id<<" "priority<<" "cputime<<" "alltime<<" "startblock<<" "blocktime<<" "; switch(p->next->state) { case ready:cout<<"就绪";break; case running:cout<<"运行";break; case blocked:cout<<"阻塞";break; default:exit(0); } cout<<'\n'; } cout<<"------------------------------------------------------------------------\n" <<"按任意键以继续..."; cin>>x; }

void Delete(PCBptr head,PCBptr p) {//删除以head为头指针的PCB链表中p所指向的结点。 PCBptr q=head; while(q->next!=p) q=q->next; q->next=p->next; delete p; }

void InsertSort(PCBpp Rdy,PCBpp RdyEd,Policy algthm) {//直接插入排序。 if(*(Rdy+1))//队列不为空 if(RdyEd-1!=Rdy+1) {//Ready+1队列中不只一个。 switch(algthm) { case hpf: if((*(RdyEd-1))->priority>(*(RdyEd-2))->priority) { PCBpp tt; *Rdy=*(RdyEd-1); *(RdyEd-1)=*(RdyEd-2); for(tt=RdyEd-3;(*Rdy)->priority>(*tt)->priority;tt--) *(tt+1)=*tt; *(tt+1)=*Rdy; } break; case spf: if((*(RdyEd-1))->alltime<(*(RdyEd-2))->alltime) { PCBpp tt; *Rdy=*(RdyEd-1); *(RdyEd-1)=*(RdyEd-2); for(tt=RdyEd-3;(*Rdy)->alltime<(*tt)->alltime;tt--) *(tt+1)=*tt; *(tt+1)=*Rdy; } } } }

void RunToBlk(PCBpp Run,PCBpp &BlkEd) {//定义运行态转为阻塞态。 (*Run)->state=blocked; *BlkEd=*Run; BlkEd++; }

void RdyToRun(PCBpp &Rdy,PCBpp Run,Policy algthm) {//定义就绪态转为运行态。 if(algthm==hpf||algthm==spf) { if(*(Rdy+1)) { (*(Rdy+1))->state=running; *Run=*(Rdy+1); Rdy++; } } else { if(*Rdy) { (*Rdy)->state=running; *Run=*Rdy; Rdy++; } } }

void RunToRdy(PCBpp Run,PCBpp Rdy,PCBpp &RdyEd,Policy algthm) {//定义运行态转为就绪态。 (*Run)->state=ready; *RdyEd=*Run; RdyEd++; if(algthm==hpf||algthm==spf) InsertSort(Rdy,RdyEd,algthm); }

//上面是定义的函数,下面是主函数。 int main() { cout<<"*******************实验开始*******************\n\n需要做几个进程并发执行的实验?"; int n; if(!(cin>>n)) {cerr<<"错误:输入不正确!"; exit(0);}

PCBptr Listhead,Listp,Listq;//建立n个 Listhead=new PCB; // Listp=Listhead; // for(int i=0;i<=n-1;i++) // { Listq=new PCB; // Listp->next=Listq; // Listp=Listq; // } Listp->next=0; //PCB的队列。

Policy algorithm; int num1,num2; L1: cout<<"\n请选择算法(0表示FIFO,1表示SPF,2表示HPF,3表示RR):";