文章目录
操作系统实验
操作系统实验1
实验题目:实验1 进程调度
一、实验目的
(1)掌握处理机调度及其实现。
(2)掌握进程状态及其状态转换。
(3) 掌握进程控制块PCB及其作用。
二、实验内容
进程调度模拟程序:假设有10个进程需要在CPU上执行,三选一:
先进先出调度算法;0
基于优先数的调度算法;1
最短执行时间调度算法 2
确定这10个进程在CPU上的执行过程。要求每次进程调度时在屏幕上显示:
当前执行进程;
就绪队列;
等待队列
三、实验要求
(1)创建10个进程的PCB,每个PCB包括:进程名、进程状态、优先级(110)、需要在处理机上执行的时间(150ms)、队列指针等。
(2)初始化10个PCB(产生随机数0或1,分别表示进程处于就绪态或等待态);rand()%2, rand()%10+1, rand()%50+1。
(3)根据调度算法选择一个就绪进程在CPU上执行。
(4)在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾。
(5)在进程执行过程中,产生一个随机数,表示执行进程能在处理机上执行的时间,如果随机时间(1~20ms)大于总需要的时间,则执行完成。如果小于,则从总时间中减去执行时间。
(6)如果执行进程没有执行完成。则产生随机数0或1,当该随机数为0时,将执行进程加入就绪队列对尾;否则,将执行进程加入等待队列对尾。
(7)一直到就绪队列为空,程序执行结束。
#include<cstring>
#include<string>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct PCB
{
char name; //进程名
int priority; //优先级
int arrtime; //到达时间
int needtime; //需要运行时间
int usedtime; //已用时间
char state; //进程状态
struct PCB* next; //队列指针
}PCB,*pcb;
pcb Tprocess=new PCB; //就绪队列的头指针
pcb Trear=Tprocess; //就绪队列的尾指针
pcb Wprocess=new PCB; //等待队列的头指针
pcb Wrear=Wprocess; //就绪队列的尾指针
void input() //创建进程 3种
{
cout<<"***************************先来先服务调度算法******************************"<<endl;
cout<<"一共创建10个进程"<<endl;
for(int i=0;i<10;i++)
{
pcb p=new PCB; //新的进程
p->name=char(i+65);
p->priorityrand()%10+1; //优先级 先来先服务这个优先级不考虑
//优先级不考虑
p->arrtime=rand()%30+1;//同时到达的……
p->needtime=rand()%50+1;//需要在处理机上执行的时间(1~50ms)
p->usedtime=0; //已用时间
if(rand()%2==0) //插到等待队列
{
p->state='T';
Trear->next=p;
p->next=NULL;
Trear=Trear->next;
}
else //插到就绪队列
{
p->state='W';
Wrear->next=p;
p->next=NULL;
Wrear=Wrear->next;
}
cout<<"第"<<i+1<<"个进程:"<<"\t进程名:"<<p->name<<"\t达到时间:"<<p->arrtime<<"\t还需时间:"<<p->needtime<<"\t进程状态:"<<p->state<<endl;
}
}
void display()//显示调度进程时显示就绪队列与等待队列
{
cout<<endl<<"********************************"<<endl;
cout<<" 就绪队列 "<<endl;
pcb fd=Tprocess->next;
while(fd)
{
cout<<"进程名,已用时间,还需时间,状态"<<endl;
cout<<fd->name<<"\t "<<fd->usedtime<<"\t "<<fd->needtime<<"\t "<<fd->state<<endl;
fd=fd->next;
}
cout<<" 等待队列 "<<endl;
fd=Wprocess->next;
while(fd)
{
cout<<"进程名,已用时间,还需时间,状态"<<endl;
cout<<fd->name<<"\t "<<fd->usedtime<<"\t "<<fd->needtime<<"\t "<<fd->state<<endl;
fd=fd->next;
}
cout<<"********************************"<<endl;
cout<<endl;
}
void Sort_T()//先来先服务,如果同时到则先输入的进程先执行
{
pcb H=Tprocess;
int n=0;
while(H->next)
{
n++;
H=H->next;
}
cout<<"N="<<n<<endl;
for(int i=0;i<n;i++)
{
H=Tprocess->next;
for(int j=0;j<=n-1-i;j++)
{
while(H->next)
{
if(H->arrtime>H->next->arrtime)
{
/*
pcb temp=H;
H=H->next;
H->next=temp;
*/
char tname=H->name; //进程名
H->name=H->next->name;
H->next->name=tname;
// int tpriority; //优先级
int tarrtime=H->arrtime; //到达时间
H->arrtime=H->next->arrtime;
H->next->arrtime=tarrtime;
int tneedtime=H->needtime; //到达时间 //需要运行时间
H->needtime=H->next->needtime;
H->next->needtime=tneedtime;
int tusedtime=H->usedtime; //已用时间
H->usedtime=H->next->usedtime;
H->next->usedtime=tusedtime;
char tstate=H->state; //进程状态
H->state=H->next->state;
H->next->state=tstate;
}
H=H->next;
}
}
}
pcb p=Tprocess->next; //新的进程
while(p)
{
cout<<"进程名:"<<p->name<<"\t达到时间:"<<p->arrtime<<"\t还需时间:"<<p->needtime<<"\t进程状态:"<<p->state<<endl;
p=p->next;
}
}
int main()
{
input(); //创建进程
Sort_T(); //对就绪队列排序,先到达的排在前面
int num=0;
while(Tprocess->next) //直到就绪队列为空,程序执行结束
{
num++;
cout<<endl<<"这是第"<<num<<"次进程调度"<<endl;
display(); //显示就绪队列与等待队列
pcb head=Tprocess->next; //指向就绪队列的队头元素
head->state='R'; //正在运行
Tprocess->next=Tprocess->next->next;//更新队头元素
if(!Tprocess->next) //更新后发现就绪队列为空,这时要更新尾指针
Trear=Tprocess;
int choice;
int runtime=rand()%20+1; //随机运行时间
cout<<"当前时刻正在运行的进程:"<<endl;
cout<<"进程名:"<<head->name<<"\t已用时间:"<<head->usedtime<<"\t还需时间:"<<head->needtime<<"\t随机运行时间:"<<runtime<<endl;
if(Wprocess->next) //等待队列不为空
{
pcb p=Wprocess->next; //指向等待队列的队头元素
choice=rand()%2;
if(choice==1) //将等待队列中的第一个PCB加入就绪队列的队尾
{
cout<<"在进程执行过程中,将等待队列的队头元素插入就绪队列的队尾"<<endl;
p->state='T'; <