//System Shedule Algorithm
//include the Priority First Algorithm and the Time Slice Algorithm
//Version 2.0
//author:chillyCreator
#include<string>
#include<iostream>
#include<iomanip>
using namespace std;
class process
{
private:
string name;//the name of process
int pri;//the priority,the bigger is the higher. the number is from 0 to 99
int round;// the time slice.
int cpuTime;//the process used by cpu
int needTime;//the time need to finish the process
int state;// 1 is ready, 0 is Run, -1 is Finish
process* next;//to the next
public :
//constructor
process(string Name,int Pri,int NeedTime,int roundTime = 10,int State = 1,int CpuTime=0,process * Next = NULL)
{
name = Name;
pri = Pri;
round = roundTime;
cpuTime = CpuTime;
needTime = NeedTime;
state = State;
next = Next;
}
//gettors and settors
string getName()
{
return name;
}
int getPri()
{
return pri;
}
int getNeedTime()
{
return needTime;
}
int getCpuTime()
{
return cpuTime;
}
int getState()
{
return state;
}
process* getNext()
{
return next;
}
void setState(int State)
{
state = State;
}
void setCpuTime(int Time)
{
cpuTime += Time;
}
void setNeedTime(int Time)
{
needTime -= Time;
}
void setPri(int Pri)
{
pri -= Pri;
}
void setNextProcess(process* Next)
{
next = Next;
}
void print()
{
//for print
cout <<setw(14)<<name << setw(2)<<state<<setw(7)<<needTime
<<setw(10)<<pri<<setw(5)<<cpuTime<<endl;
}
};
//this is nonpreempt system
class System
{
private:
process* head;
process* tail;
int length;
//auto test
void test1(int n)
{
head = new process("Head",-1,0,0);
length = 0;
process* temp = head;
for(int i=0;i<n;i++)
{
temp->setNextProcess(new process("NameIsForTest "+i,20-i,30+i));
length++;
temp = temp->getNext();
}
tail = temp;
}
//user test
void test2(int n)
{
head = new process("Head",-1,0,0);
length = 0;
process* temp = head;
string name;
int priority,needtime;
for(int i=0;i<n;i++)
{
cin>>name>>priority>>needtime;
temp->setNextProcess(new process(name,priority,needtime));
length++;
temp = temp->getNext();
}
tail = temp;
}
public:
//testN is for the various of tests. 1 is using the default test. 2 is using the User test.
System(int testN,int num)
{
//num is the number of processes
if(testN == 1)
test1(num);
else
test2(num);
}
//delete a process
void deleteProcess(process* a)
{
process* temp = tail;
toQueueEnd(a);
delete a;
tail = temp;
tail->setNextProcess(NULL);
length--;
}
void toQueueEnd(process* a)
{
if(a->getNext()==NULL)
return;
process* temp = findP(a);
temp->setNextProcess(a->getNext());
tail->setNextProcess(a);
tail = a;
tail->setNextProcess(NULL);
}
//put the process to the end of the queue
void toQueueHead(process* a)
{
if(head->getNext()==a)
return;
process* temp = findP(a);
temp->setNextProcess(a->getNext());
if(a==tail)
tail = temp;
a->setNextProcess(head->getNext());
head->setNextProcess(a);
}
//find parent
process* findP(process* a)
{
process* temp = head;
while(temp->getNext() != a)
temp = temp->getNext();
return temp;
}
//when the process is sheduled into the CPU
void use(process* pro,int RunTime,int dePriority)
{
if(pro->getState()==1)
{
if(RunTime < pro->getNeedTime())
{
toQueueHead(pro);
pro->setCpuTime(RunTime);
pro->setNeedTime(RunTime);
pro->setPri(dePriority);
toQueueEnd(pro);
}
else
{
toQueueHead(pro);
pro->setCpuTime(pro->getNeedTime());
pro->setNeedTime(pro->getNeedTime());
pro->setState(-1);
cout << endl<<pro->getName()<<" finally use the cpu time is "<<pro->getCpuTime()<<endl;
deleteProcess(pro);
}
}
}
void printAll()
{
//All of the process are printed
cout << setw(14)<<"name " << setw(2)<<"state "<<setw(5)<<"needTime "
<<setw(3)<<"pri "<<setw(5)<<"cpuTime "<<endl;
for(process* temp = head->getNext();temp!=NULL;temp= temp->getNext())
{
temp->print();
}
}
//find the Highest priority
process* findHighest()
{
if(head->getNext()==NULL)
return NULL;
process* temp = head->getNext();
process* first = NULL;
int i=-1;
for(;temp!=NULL;temp=temp->getNext())
{
if(i < temp->getPri())
{
i = temp->getPri();
first = temp;
}
}
return first;
}
//the priority First Algorithm
void FP()
{
while(length > 0)
{
process* fir = findHighest();
if(fir != NULL)
{
printAll();
use(fir,10,2);
}
}
}
//the Time slice Algorithm
void TS(int RunTime)
{
while(length>0)
{
process* temp = head->getNext();
printAll();
if(temp != NULL)
use(temp,RunTime,0);
}
}
};
//test
int main()
{
System a(1,4);
a.FP();
cout<<endl<<endl<<endl;
System b(1,4);
b.TS(10);
return 0;
}
今天终于把上面的代码调试成功了!
不过感觉还不够好。如果队列能写成一个单独的类就好了。
而且今天编写队列的删除,进程移至队尾和队首的算法时,思路没有整理好。故白白浪费了太多时间。
对于移至队尾的操作应该记住要把最后一个节点的next指针赋为null.
移至队首的操作也要注意队尾的变化。
对于队列某个元素的删除操作,可以先将元素置尾再删除。或者查找指向它的前一个元素,再通过基本的操作进行删除。
这段程序代码使用的是链表队列。所以考虑的事件较多。如果使用数组的话会省些时间。
此外process 类的gettors and settors太多。简单的可以将私有的变量成员变为共有的。不过安全性不高。这个类中有些变量并没有什么作用,只不过为以后方便模拟。
继续优化cpu调度算法 |
|
如果在system类中加一个这样函数
//find the process which is not used. //the process will be older with the Time. void findOld(int RunT) { const int increasePri = -2; static int time=1; process* temp = head->getNext(); while(temp!=NULL) { if((temp->getCpuTime() - time*RunT) < 0) temp->setPri(increasePri); temp = temp->getNext(); } time++; cout <<time; }
而void FT()算法中这样调用:
// the priority First Algorithm void FP() { int TimeSlice = 10; int oldTimer=0; while(length > 0) {
process* fir = findHighest(); if(oldTimer%4==1) { findOld(TimeSlice); //cout << oldTimer; } if(fir != NULL) { printAll(); use(fir,10,2); } oldTimer++; } }
这样改动后就可以让进程随时间的增加而优先级提高。当一个进程在队列中很长一段时间后,进程就会出现老化情况。为了防止老化(就是很难再得到利用)的发生,过一段时间后就会检测进程。当发现长时间没有用到的进程时,优先级会升高。
不过void findOld(int RunT) 并不严谨。可能会出现所以进程都提高优先级的情况。所以还要进行优化。
另外在上一次的代码中有可能会出现进程优先级为负数的情况。可以这样修改类process
void setPri(int Pri) { if(pri-Pri<0) return; if(pri-Pri>100) return; pri -= Pri; }
|
|
分享到:
相关推荐
本压缩包文件提供了关于两种常见的进程调度算法——时间片轮转和优先级调度算法的源码和相关报告,这对于理解这些算法的工作原理和实现细节非常有帮助。 时间片轮转调度算法是一种公平的调度策略,它将所有就绪状态...
广州大学操作系统课设-设计一个按照优先级调度算法实现处理机调度的程序 含报告 题目一:设计一个按照时间片轮转法实现处理机调度的程序 虽然该文内容的是题目二,但是题目一和题目二也就调度方式不一样,其他都是...
根据给定文件的信息,我们可以详细地探讨时间片轮转算法和优先级调度算法,并通过C语言来模拟这两种算法的实现。 ### 进程调度的概念 进程调度是操作系统中处理机管理的重要组成部分,它负责选择一个合适的进程...
时间片轮转算法和优先级调度算法 C 语言模拟实现 一、进程调度算法概述 进程调度是操作系统中的一种核心机制,负责将 CPU 时间片分配给不同的进程,以便实现多任务处理。常见的进程调度算法有优先级调度算法和时间...
时间片轮转算法和优先级调度算法-C语言模拟实现-收藏.doc
1、实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解 2、实验内容 (1)用C语言来实现对N个进程采用动态优先权优先算法的进程调度 (2)每个用来标示进程的PCB用结构来描述,包括字段如下: ...
本主题主要探讨三种常见的调度算法:短作业优先(Shortest Job First, SJF)、时间片轮转(Round Robin, RR)以及优先级调度算法。 首先,短作业优先调度算法是一种非抢占式策略,其目标是最大化系统效率,即最小化...
时间片轮转算法和优先级调度算法 C 语言模拟实现 本文将对时间片轮转算法和优先级调度算法进行详细的说明,并提供 C 语言模拟实现的示例代码。 一、进程调度算法 进程调度算法是操作系统中最核心的组件之一,它...
优先数调度算法与时间片调度算法是操作系统中用于管理进程执行的重要策略,它们在多任务环境中确保了系统的公平性和效率。下面将详细解释这两种调度算法的原理、应用场景以及实现细节。 优先数调度算法(Priority ...
为了加深理解时间片轮转算法和优先级调度算法,本实验要求使用C语言模拟实现这两种调度算法。实验中,需要设计进程控制块(PCB)的结构,包括进程名、进程优先数、进程已占用的CPU时间、进程到完成还需要的时间、...
在新的抢占式优先级调度算法中,除了考虑时间片,还需要考虑进程的优先级。这里定义了5个优先级,优先级越高,进程的执行权越优先。在调度时,优先选择优先级高且时间片未用尽的进程。 实验中还需要以下步骤: - *...
### 优先级调度算法程序分析 #### 一、概述 优先级调度算法是一种常见的作业调度策略,它基于每个进程的优先级来决定哪个进程应当优先获得CPU资源。本程序通过C语言实现了一种简单的优先级调度算法,并包含了必要的...
在该程序中,我们定义了一个结构体 PCB(Process Control Block),用于描述一个进程的信息,包括进程标识符、优先级、时间轮转时间片、CPU 占用时间、剩余时间、计数器和状态等信息。 在该程序中,我们还定义了四...
总的来说,基于优先级的时间片轮转调度算法结合了时间片轮转的公平性和优先级调度的响应性,是多任务操作系统中的一种实用策略。通过编程实践,我们可以更好地理解和掌握这一算法,提升操作系统设计的能力。
本文将详细探讨两种常见的进程调度算法:时间片轮转法和优先级调度算法,以及它们在实际操作环境中的应用。 首先,我们来理解**时间片轮转法**。该算法的基本思想是将所有就绪进程按照先进先出(FIFO)原则放入一个...
这里我们将深入探讨四种常见的调度算法:非抢占式短进程优先(Non-preemptive Shortest Process Next, SPN)、优先级调度和多级反馈调度。 1. **非抢占式短进程优先(SPN)**: 非抢占式SPN算法是一种简单但有效的...
在调度算法中,只有处于就绪状态的进程才能被调度,调度算法结合了优先级调度和时间片轮转调度算法,约定:从最高优先级队列取第 1 个就绪状态的进程进行调度,时间片到后降低其优先级(降低一半),然后插入到低...
时间片轮转算法和优先级调度算法C语言...本文档提供了时间片轮转算法和优先级调度算法的C语言模拟实现,旨在帮助读者深入理解进程控制块、进程队列、进程状态、进程调度算法等概念,并提供了一个完整的程序实现细节。
时间片轮转算法和优先级调度算法 C 语言模拟实现 时间片轮转算法和优先级调度算法是操作系统中两种常用的进程调度算法。本文通过 C 语言模拟实现了这两种算法,旨在帮助读者更好地理解进程控制块、队列管理和调度...