欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

操作系统实验--进程调度(不可抢占式动态优先级)

程序员文章站 2022-03-05 09:55:47
...
#include<stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
/*不可抢占式动态优先级*/
/*若正在运行的进程时间片用完就转为就绪状态,占用一次cpu优先级-1
就绪队列中等待的队列,每等待cpu运行完一个时间片,优先级+1*/

// 枚举进程的状态:就绪、执行、阻塞、完成
enum STATE { Ready, Run, Block, Finish };
struct PCB
{
    string name;
    int time;//运行需要时间
    int rtime;//还需要运行多长时间才能完成
    int priority;//优先数
    PCB *next;//指向一下个PCB
    STATE   state;//状态(就绪、执行、阻塞、完成)
};
PCB *finish,*ready,*run,*tail;//完成,就绪,运行队列
int num;//实际进程总数,小于10
int timeslice;//时间片

void input();//输入
void init();//初始化参数
void output();//输出
void insert(PCB *p);//根据优先级将进程插入有序单向链表队列
void in();//从就绪队列选择队首进程运行
void running();//进程调度

int main()
{
    input();
    init();
    output();
    running();
    return 0;
}

void input()//输入
{
    ready=NULL;
    finish=NULL;
    run=NULL;
    PCB *p;
    cout<<"请输入进程个数:";
    cin>>num;
    cout<<endl;
    cout<<"请输入时间片大小: ";
    cin>>timeslice;
    cout<<endl;
    for(int i=0;i<num;i++)
    {
        p=new PCB;
        cout<<"请输入进程"<<i+1<<"的信息"<<endl;
        cout<<"名字:";
        cin>>p->name;
        cout<<endl;
        cout<<"运行时间: ";
        cin>>p->time;
        cout<<endl;
        cout<<"优先数: ";
        cin>>p->priority;
        cout<<endl;
        p->next=NULL;//初始化新建进程的下一个都为NULL
      //  cout<<p->name<<" input finish, next is insert"<<endl;
        /*
        if(ready==NULL)
        {
            p->next=ready;
            ready=p;
        }
        else
            */
            insert(p);
    }
}
void init()//初始化参数
{
    PCB *p=ready;
    for(int i=0;i<num;i++)
    {
       //p->wtime=0;
       p->rtime=p->time;
       p->state=Ready;
       p=p->next;
    }
/*
    tail=ready;
    p=tail->next;
    while(p!=NULL)
    {
       tail=tail->next;
       p=tail->next;
    }
*/
}

void output()//输出
{
    PCB *temp=ready;
    cout<<"进程名 "<<"运行时间 "<<"优先数 "<<"剩余时间 "<<"状态 "<<endl;

    cout<<"ready队列"<<endl;
    while(temp!=NULL)
    {
        cout<<temp->name<<setw(7)<<temp->time<<setw(9)<<temp->priority
        <<setw(7)<<temp->rtime<<setw(9)<<temp->state<<endl;
        temp=temp->next;
    }

 //   if(temp==NULL)
 //       cout<<"运行完成!"<<endl;
/*
    temp=run;
    cout<<"runing队列"<<endl;
    while(temp!=NULL)
    {
        cout<<temp->name<<setw(5)<<temp->time<<setw(7)<<temp->priority
        <<setw(5)<<temp->rtime<<setw(7)<<temp->state<<endl;
        temp=temp->next;
    }
*/
    temp=finish;
    cout<<"finish队列"<<endl;
    while(temp!=NULL)
    {
        cout<<temp->name<<setw(7)<<temp->time<<setw(9)<<temp->priority
        <<setw(7)<<temp->rtime<<setw(9)<<temp->state<<endl;
        temp=temp->next;
    }
}

void insert(PCB *p) /* 建立对进程进行优先级排列函数*/
{
    p->state=Ready;
	PCB *first, *second;
	int flag = 0;
	if((ready==NULL)||((p->priority)>(ready->priority))) /*优先级最大者,插入队首*/
	{
		p->next=ready;//插入的数据作为链表头结点
		ready=p;//头结点指针指向插入数
	}

	else /* 进程比较优先级,插入适当的位置中*/
    {
		first = ready;
		second = first->next;
		while (second != NULL)
		{
			if ((p->priority) > (second->priority)) /*若插入进程比当前进程优先数大,*/
			{ /*插入到当前进程前面*/
				p->next = second;
				first->next = p;
				second = NULL;
				flag = 1;
                break;
			}
			else /* 插入进程优先数最低,则插入到队尾*/
			{
				first = first->next;
				second = first->next;
			}
		}
		if (flag == 0)
        {
            first->next=p;
           // p->next=NULL;
        }
	}
}


void in()//从就绪队列选择队首进程运行
{
    if(ready==NULL)
    {
        run=NULL;
        return;
    }
    run=ready;
    run->state=Run;
    cout<<"running: "<<run->name<<endl;
    cout<<run->name<<setw(7)<<run->time<<setw(9)<<run->priority
    <<setw(7)<<run->rtime<<setw(9)<<run->state<<endl;
    ready=ready->next;
    run->next=NULL;
}
void running()//进程调度
{
    PCB *temp=ready;
    in();
    while(run!=NULL)
    {
        temp=ready;
        if(run->rtime<=timeslice)
        {
            run->rtime=0;
            run->state=Finish;
            run->next=finish;
            finish=run;
            run=NULL;
        }
        else
        {
            //如果超过规定时间片,则此进程优先级-1,回到就绪队列,就绪队列中其他进程优先级+1
           run->rtime=(run->rtime)-timeslice;
           run->priority=(run->priority)-1;
           while(temp!=NULL)
           {
               temp->priority++;
               temp=temp->next;
           }
           insert(run);
          // tail->next=run;
          // tail=tail->next;
          // sort();
        }
        output();
        in();
    }
}