Brian Warehouse

Some birds aren`t meant to be caged, their feathers are just too bright... ...
posts - 40, comments - 16, trackbacks - 0, articles - 1

实验一代码 时间片轮转法 高响应比优先

Posted on 2010-08-17 12:59 Brian 阅读(2074) 评论(1)  编辑 收藏 引用 所属分类: OS
/*
Title: 时间片轮转法
Author: Brian
Date: 2010/04/09
*/
#include 
<iostream>
#include 
<cstdlib>
using namespace std;

typedef 
struct PNode { // PCB
   struct PNode *next; //指向下一个节点的指针
   char name[12];    // 进程名
   int All_Time;    // 总运行时间
   int Runed_Time;    // 已运行时间
   char state;        // 进程状态 Ready / End
}* Proc; // 指向该PCB的指针

int ProcNum; // 全局变量,用于用户自己确定进程个数

void InitPCB(Proc &H) { //初始化就绪队列
    cout<<"输入总进程个数: ";
    cin
>>ProcNum; //进程总个数
    int Num=ProcNum;
    H
=(Proc)malloc(sizeof(PNode));    
    H
->next=NULL;
    Proc p
=H;
    cout
<<"总进程个数默认为 "<<ProcNum<<" 个,请输入相应信息\n\n";
    
    
while (Num--) {
        p
=p->next=(Proc)malloc(sizeof(PNode));
        cout
<<"进程名 总运行时间 已运行时间 :";
        cin
>>p->name>>p->All_Time>>p->Runed_Time;
        p
->state='R';
        p
->next=NULL;
    }
    p
->next=H->next; // 构造循环队列
}

void DispInfo(Proc H) { //输出运行中信息
    Proc p=H->next;
    
do {
        
if (p->state != 'E')
        {
            cout
<<"进程名:"<<p->name<<"\t总运行时间:"<<p->All_Time
                
<<"\t已运行时间:"<<p->Runed_Time
                
<<"\t状态:"<<p->state<<endl;
            p
=p->next;
        }
        
else p=p->next;
    } 
while (p != H->next); // 整个进程链条始终完整,只是状态位有差异
}

void SJP_Simulator(Proc &H) { // 时间片轮转法模拟器
    cout<<endl<<"-------------------START--------------------\n";
    
int flag=ProcNum; // 记录剩余进程数
    int round=0// 记录轮转数
    Proc p=H->next;
    
while (p->All_Time > p->Runed_Time) {
            round
++;
            cout
<<endl<<"Round "<<round<<"--正在运行 "<<p->name<<" 进程"<<endl;
            p
->Runed_Time++;
            DispInfo(H);    
            
if (p->All_Time == p->Runed_Time) {
                p
->state='E';
                flag
--;
                cout
<<p->name<<" 进程已运行结束,进程被删除!\n";
            }
            p
=p->next;
            
while (flag && p->All_Time == p->Runed_Time)
                p
=p->next; // 这一步非常重要,跳过先前已结束的进程

    }
    cout
<<endl<<"--------------------END---------------------\n";
}

void main() {
    Proc H;
    InitPCB(H); 
// 数据初始化
    DispInfo(H); // 初始化成功后的进程状态
    SJP_Simulator(H); // 模拟时间片轮转法
    system("pause");
}

 

/*
Title: 高响应比优先算法
Author: Brian
Date: 2010/04/11
*/
#include 
<iostream>
#include 
<cstdlib>
#include 
<cstring>
using namespace std;

typedef 
struct PNode {  //PCB
    struct PNode *next; //指向下一个节点的指针
    char name[12];        //进程名
    int All_Time;        //要求运行时间
    int Wait_Time;        //等待时间
    float Res_Ratio;    //响应比    
    char state;            //状态 Ready/End    
}* Proc; //指向该PCB的指针

int ProcNum; // 全局变量,用于用户自己确定进程个数

void ComputeRes(Proc &H) //计算响应比
{
    Proc p
=H->next;
    
while (p) {
        
if (p->state == 'R') {
            p
->Wait_Time++;
            p
->Res_Ratio=1+(float)(p->Wait_Time)/p->All_Time;
        }
        
else p->Res_Ratio=0.0;
        p
=p->next;
    }
}

void InitProc(Proc &H)
{
    cout
<<"输入总进程个数: ";
    cin
>>ProcNum; //进程总个数
    int Num=ProcNum;
    H
=(Proc)malloc(sizeof(PNode));    
    H
->next=NULL;
    Proc p
=H;
    cout
<<"总进程个数默认为 "<<ProcNum<<" 个,请输入相应信息\n\n";
    
    
while (Num--) {
        p
=p->next=(Proc)malloc(sizeof(PNode));
        cout
<<"进程名 总运行时间 等待时间 :";
        cin
>>p->name>>p->All_Time>>p->Wait_Time;
        p
->state='R';
        p
->Res_Ratio=1+(float)(p->Wait_Time)/p->All_Time;
        p
->next=NULL;
    }
}

void DispInfo(Proc H) { //输出运行中信息
    Proc p=H->next;
    
while (p) {
        cout
<<endl<<"进程名:"<<p->name<<"\t总运行时间:"<<p->All_Time
            
<<"\t等待时间:"<<p->Wait_Time
            
<<"\t响应比:"<<p->Res_Ratio<<"\t状态:"<<p->state<<endl;
        p
=p->next;
    }
}

void RelocateMax(Proc &H)  // 进程排序 (逆序算法) , 首节点是响应比最高节点
{
    
if(H->next==NULL || H->next->next==NULL)
        
return// 只剩一个节点或没有节点时无需排序
    Proc p=H->next,q,r;
    
if (p) {
        r
=p->next;
        p
->next=NULL;
        p
=r;
        
while (p) {
            r
=p->next;
            q
=H;
            
while (q->next && q->next->Res_Ratio < p->Res_Ratio)
                q
=q->next;
            p
->next=q->next;
            q
->next=p;
            p
=r;
        }
    }
    p
=H->next;
    H
->next=NULL;
    
while (p) {
        q
=p->next;
        p
->next=H->next;
        H
->next=p;
        p
=q;
    }
}

void HRN_Simulator(Proc &H) //高响应比算法模拟器
{
    cout
<<endl<<"-------------------START--------------------\n";    
    
int flag=ProcNum; // 记录剩余进程数
     while (flag)
    {
        Proc p
=H->next;
        p
->All_Time--;
        p
->Wait_Time=0;
        p
->Res_Ratio=1.0;
        
if (p->All_Time == 0)
        {
            p
->state = 'E';
            ComputeRes(H);
            DispInfo(H);    
            
if (p->next == NULL)
                H
->next = NULL;
            
else H->next = p->next; //将首节点删除    
            cout<<endl<<p->name<<" 进程已运行结束\n";
            flag
--;
        }
        
else 
        {
            
            DispInfo(H);ComputeRes(H);
        }
        RelocateMax(H);    
    }
    cout
<<endl<<"--------------------END---------------------\n\n";
}

void main()
{
    Proc H;
    InitProc(H); 
// 数据初始化
    DispInfo(H); // 初始化成功后的进程状态
    HRN_Simulator(H); // 模拟高响应比优先算法
    system("pause");
}

Feedback

# re: 实验一代码 时间片轮转法 高响应比优先  回复  更多评论   

2010-08-19 22:09 by 普派
void main()
{
Proc H;
InitProc(H); // 数据初始化
DispInfo(H); // 初始化成功后的进程状态
HRN_Simulator(H); // 模拟高响应比优先算法
system("pause");
}

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理