Posted on 2010-08-17 12:59
Brian 閱讀(2212)
評論(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");
}