الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج (عمل ال Cpu /preemptive ) ممكن المساعده

بدأه ms_z في 17 يناير 2008 · 20 رد · 10,880 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته .

الاخوه / الاخوات الكرام .

الموضوع :

انا اقوم بعمل (project ) عباره عن برنامج بالسي ++ والي هو عباره عن خوارزميات المعالج مثل :

1-first come first served

2-shortest job first

a-nonpreemptive

b-preemptive

3-round robin

ولقد قمت بعمل ثلثي البرنامج ....... والان واجهت مشكله في الفقره 2 الجزء b خوارزمية ال.. preemptive

لم استطع اتمام هذه الخوارزميه ... لذلك اريد بعض المساعده منكم ..

وجزيتم خيرا .

مع التحيه

#2

1. أين الكود اللذى تطلب المساعدة به؟

2. ما هى المشكلة بالضبط؟

#3

اخي الكريم اولا اشكر لك تجاوبك الكريم ....

بالفعل كان يجب عليا طرح الكود اولا ...

سوف اقوم بادراجه بعد قليل ... إن شاء الله

وسوف اشرح المشكله بالتفصيل ..

مع التحيه

#4

اخي الكريم blueteeth

المشكله معي هي :

اريد ان اعمل برنامج يقوم بحساب الوقت المستغرق( للمعالج cpu ) والذي يكون عمله في بعض انظمة التشغيل على الاساس الاتي :

1- يحسب زمن وصول العمليه (p)

2- يحسب زمن معالجة العمليه

3- يحسب المتوسط الحسابي لجميع العمليات

وبالتالي اريد ان اعمل برنامج بالسي ++ على النحو التالي :

1- اسمح للمستخدم بادخال عدد العمليات

2- اجعل المستخدم يدخل زمن وصول كل عمليه ومن ثم زمن معالجة هذه العمليه

3- اقوم باخذ اول عمليه حسب زمن وصولها ثم افحص زمن الوصول لباقي العمليات

4- اذا كان هناك عمليات قد تم وصولهن خلال معالجة العمليه الاولى افحص ايهن اقل من حيث زمن المعالجه ثم أئخذ الاقل وقت وهكذا.....

واليكم توضيح افضل :

Shortest-Job-First (SJR) Scheduling

والتي تعني ان الـ Processe التى لاتستغرق وقت طويل في المعالج تدخل اولا وتنقسم هذه الطريقه الى نوعان :

النوع الاول : nonpreemptive عند قدوم عدد من الـ Processe الى المعالج ياخذ الـ Processe التي لاتاخذ وقت طويل ولكن عند قدوم Processe الوقت اللازم لها اقل من التي مع المعالج فانه يتم تجاهلها ويكمل المعالج عمله الى ان ينتهي .

النوع الثاني : preemptive نفس الطريقه السابقه ولكن الفرق هو عند قدوم Processe الوقت اللازم لها اقل من التي مع المعالج فان المعالج يوقف العمليه ويضع الProcesse التي معها في الكيو وياخذ Processe القادمه وهكذا . انظر الرسمه :

post-129884-1201107259_thumb.gif

الرسمه السابقه تابعه للنوع - SJF -non-preemptive

ومن الرسمه نجد ان :

Average waiting time = (0 + 6 + 3 + 7)/4 = 4

سوف احاول ان اشرح اكثر حتى تتضح الصوره .

من الرسمه السابقه المقصود بـ Arrival Time هو وقت وصول الـ Process الى المعالج ونقصد بـ Burst Time هو الوقت الذي يستغرقه Process داخل المعالج لاتمامه .

الان من الرسمه نرى ان اول Process وصلت الى المعالج كانت P1 فعند وصولها دخلت المعالج مباشرة ولم تنتظر فكان وقت انتظارها = صفر وعند وصول P2 وجدت ان المعالج مشغول بعمليه فانتظرت وفي هذا الانتظار وصلت P3 ثم وصلت P4 والمعالج مازال مشغول بـ P1 وعندما انتهى المعالج منها وجد امامه P2 P3 P4 وهنا اخذ الـ Process التى تاخذ وقت اقل لتنفيذها . وتم ترتيبها كما هو موضح في الرسمه . ------ ارجو ان اكون وفقت في الشرح-------

الان سوف نشاهد نفس العمليات السابقه ولكن بالنوع الثاني :

انظر الرسمه لترى الاختلاف بينها وبين النوع الاول :

post-129884-1201107617_thumb.gif

من الرسمه نشاهد ان الوضع اختلف كثيرا عن السابق وللتوضيح سوف اشرح ماحدث :

ماحدث هو انه عند وصول P1 ودخولها على المعالج وكانت تحتاج الى 7 من الوقت وبعد مرور 2 من الزمن وصلت P2 وتحتاج الى 4 من الزمن فقط بينما P1 بقي لها 5 من الزمن حتى تنتهي هنا توقف المعالج عن العمل واخرج P1 وادخل P2 مكانها وبينما يتم العمل مع P2 وبعد مرور 2 من الزمن وصلت P3 التي لاتحتاج الا لواحد من الزمن فتوقف المعالج عن العمل وادخل P3 .......وهكذا والباقي ان شاء الله يكون واضح في الرسمه .

Average waiting time = (9 + 1 + 0 +2)/4 = 3

واليكم الكود للنوع الاول ال (nonpreemptive)

// this program calculat the non-preemptive (SJF)
#include<iostream.h>
#include<conio.h>
void main()
{
int p[4],a[4],c[4],w[4],i,g,m;
for(i=0;i<4;i++)
{p=i+1;
 cout<<"enter the arrival time("<<i+1<<") \n ";
 cin>>a;
 if(i>0)
 do
 {
  if(a>a[i-1])
  break;
  else
  {
   cout<<"\nenter the arrival time("<<i+1<<") agine \n ";
	cin>>a;}
 }while(a<a[i-1]);
 cout<<"enter the cpu time("<<i+1<<") \n ";
 cin>>c;
}
//test ............................
 int x=c[0]+a[0];
 for(i=1;i<4;i++)
{
   for(g=i+1;g<4;g++)
   {if(i==2)
   x=c[i-2]+c[i-1]+a[0];
   if(x>=a[g])
   {
   if(c>c[g])
   {int temp=c;
   c=c[g];
   c[g]=temp;
   int t=p;
   p=p[g];
   p[g]=t;
   int te=a;
   a=a[g];
   a[g]=te;}}
	else break;
}}
//end test........................
  w[0]=0;
  for(i=1;i<4;i++)
{ if(i==1)
  w=c[i-1]+a[0]-a;
   if(i==2)
  w=(c[i-1]+c[i-2]+a[0])-a;
	 if(i==3)
  w=(c[i-1]+c[i-2]+c[i-3]+a[0])-a;
}
   for(i=0;i<4;i++)
   {
   if(w<0)
	w=0;
   cout<<endl<<"p"<<p<<"  "<<a<<"  "<<c<<"  "<<w;
  }
  float s=0;
	for(i=0;i<4;i++)
	s+=w;
   s/=4;
	cout<<endl<<s;
  getche();
}

بس انا لم استطع عمل البرنامج للنوع الثاني (PREEMPTIVE) لذلك اطلب المساعده

افيدونا جزاكم الله خير

#5

الوووووووووووه

71 قراءه

لكن لا حلول ولا حتى اقتراحات .....

الله يعين .

#6

السلام عليكم, أسف على التأخير بس الواحد بقا نادرا لما بقعد و أعرف أكتب كود :(.

أنا بصراحة حاولت أفهم الكود اللى إنت حاطه, بس لقيته صعب أوى و إنت مش حاطط تعليقات كفاية, فكتبت كود جديد بس خللى بالك أنا معملتلوش كومبايل و معرفش صح وﻻ ﻷ بس أهو نجرب مع بعض و نحاول نصحح اﻷخطاء لو فيه و على فكرة هو لسة ناقص حاجة بسيطة كدة اللى هى ال functor اللى بيرتب ال priority_queue .

#include <iostream>

#include <vector>

#include <queue>

using namespace std;



struct process{

	double arr;

	double burst;

	double rem;

	double end;



	process(double arrival_time=0, double burst_time=0):arr(arrival_time), burst(burst_time), rem(burst_time), end(0)

	{}

};



double pre_emptive(vector<process> p)

{

	priority_queue<process,vector<process>,/*Functor to arrange by arrival time*/> by_arr;
	priority_queue<process,vector<process>,/*Functor to arrange by remaining time*/> ready;

	vector<process> completed;

	process curr;

	double my_time;

	bool proc_idle = true;

	int n = p.size();



	// fill the queue by arrivals to loop through all processes

	for (int i=0; i<n, i++)

		by_arr.push(p);



	// loop through all processes

	while (!by_arr.empty())

	{

		// an operation has arrived

		if (proc_idle == true)  // processor is idle

		{

			my_time = by_arr.top().arr;

			curr = by_arr.pop();

			proc_idle = false;  // allocate the processor

		}

		else  // a process is already running

		{

			if (by_arr.top().arr < my_time + curr.rem)  // the new process arrived before the current process finishes

			{

				if (by_arr.top().rem < curr.rem)  // the new process is shorter than current

				{

				// calculate the remaining time for the current job

					curr.rem -= (by_arr.top().arr - my_time);



					// swap the 2 processes

					ready.push(curr);

					curr = by_arr.pop();



					// update the time

					my_time = curr.arr;

				}

				else   // the new process is longer

					ready.push( by_arr.pop() );

			}

			else  // the new process arrived after the current process finishes

			{

				my_time += curr.rem;

				curr.rem = 0;  // the process completed

				curr.end = my_time;



				completed.push_back(curr);

				proc_idle = true;

			}

		}

	}



		// complete all the ready processes

		if (proc_idle == false)  // there's a current process

		{

			my_time += curr.rem;

			curr.rem = 0;

			curr.end = my_time;



			completed.push_back(curr);

			proc_idle = true;

		}



		// finish all the ready processes

		while (!ready.empty())

		{

			proc_idle = false;

			curr = ready.pop();

			my_time += curr.rem;

			curr.end = my_time;

			completed.push_back(curr);

			proc_idle = true;

		}



		// all the processes are completed

		// compute the average waiting time

		double sum_wt = 0;

		for (int i=0; i<completed.size(); i++)

			sum_wt += completed.end - completed.arr;



		return (sum_wt/n);

}





int main()

{

	vector<process> all;

	int num;

	process p;

	cout << "Enter the number of processes: ";

	cin >> num;



	for (int i=1; i<=num; i++)

	{

		cout << "Enter process " << i << " arrival time: ";

		cin >> p.arr;

		cout << "Enter process " << i << " CPU burst time: ";

		cin >> p.burst;

		p.rem = p.burst;

		all.push_back(p);

	}



	cout << "Pre-emptive SJF average waiting time = " << pre_emptive(all) << endl;



	return 0;

}
#7

اخي الكريم

اولا اشكر لك جهدك وتفاعلك ..

-بس معي بعض الاسئله لاني واجهت عدة سطور لم اعرف ايش عملها يمكن لاني لسه في البدايه ..

1-#include <vector>

2-#include <queue>

3- process(double arrival_time=0, double burst_time=0):arr(arrival_time), burst(burst_time), rem (burst_time), end(0)

{}

وكذلك بعض من سطور هذه الداله

double pre_emptive(vector<process> p)

{

priority_queue<process,vector<process>,/*Functor to arrange by arrival time*/> by_arr;

priority_queue<process,vector<process>,/*Functor to arrange by remaining time*/> ready;

vector<process> completed;

ارجو المزيد من التوضيح على هذه السطور

مع التحيه

تم تعديل هذه المشاركة بواسطة ms_z في 30 يناير 2008 في 13:04

#8

قبل فتره بدأت بمثل هذا البرنامج ، وكسلت أكمله :) ، على العموم كنت كتبت الـ Non - Premptive فقط لخوارزميه FCFS و SJF .

وهذا ما كتبته لعله يفيدك ،

الكلاس الأول ويمثل مفهوم Process بشكل مبسط ، ويحتوي جميع المعلومات المطلوبه عن العمليه

/*
  * Process
  * class That Represnet The Process Control Block PCB 
  * and Hold Some Information about Process
  * Coded By : Wajdy Essam (romansy)
  * FeedBack : SudanGeek@hotmail.com
*/

enum PriorityLevel { NO , Height , Low };

class Process
{
	private :
			Process* next;			// poniter to next Process
			Process* previous;		// pointer to previous process

			// Process info
			int burstTime;		// time needed to execute process
			int watingTime;		// time that Process wating in readyQeue
			int turnAroundTime;	// time that Process take to finish ( burst + wating)
			PriorityLevel pl;	// The Priority Of Process

	public :
			Process (int bt , PriorityLevel p= NO ) : burstTime(bt),pl(p)
			{	next = previous = 0;	}

			~Process ()
			{	delete next; delete previous;	}

			void setNext (Process* n)
			{	next = n; }

			void setPrevious ( Process* n )
			{	previous = n;	}

			Process* getNext()	  {	return next;	}
			Process* getPrevious()  {	return previous;}

			void setBurstTime   (int bt)	{ burstTime   = bt;	}
			void setWatingTime  (int wt) 	{ watingTime  = wt; 	}
			void setTurnAroundTime (int at)	{ turnAroundTime = at;	}
			void setPriorityLevel (PriorityLevel p) { pl = p;	}

			int getBurstTime ()		{	return burstTime;	}
			int getWatingTime()		{	return watingTime;	}
			int getTurnAroundTime() {	return turnAroundTime;	}
			PriorityLevel getPriorityLevel () { return pl;	}
};

وهنا كلاس يمثل صف العمليات ReadyQueue ، وبه داله ادخال للصف وحذف ، وارجاع process معين على حسب موقعه index وبعض الأشياء الأخرى .

/*
  * Ready Queue
  * class that implements Queue of Process
  * using the Double Linked List Techniques
  * Coded By : Wajdy Essam (romansy)
  *FeedBack : SudanGeek@hotmail.com
*/

#include "Process.h"
#include <iostream>
using namespace std;

class ReadyQueue
{
	protected :
		Process* front;
		Process* back;

	public :
		ReadyQueue () : front(NULL),back(NULL)
		{		  }

		void displayList ();
		void enqueue (Process* n);
		void removeProcess (Process* p);
		void  deleteProcessByData (int bt	);

		int getCount ();
		bool isEmpty ();

		Process* getProcess (int index );
		Process* operator[] (int index );
};

void ReadyQueue  :: enqueue (Process* n )
{
	 if ( isEmpty() )
	 {
		  front = n;
		  back  = n;
	 }
	 else
	 {
		 back->setNext(n);
		 n->setPrevious(back);
		 back = n;
	 }
}

int ReadyQueue :: getCount()
{
	Process* tmp = front;
	int count = 0;

	while ( tmp != NULL )
	{
		count++;
		tmp = tmp->getNext();
	}

	return count;
}



Process* ReadyQueue :: getProcess (int index)
{
	Process*  tmp  = front;

	for (int i = 0; i<index; i++)
		tmp = tmp->getNext();

	return tmp;
}

Process* ReadyQueue :: operator[] (int index)
{
	if ( index < 0 || index > getCount() )
		return getProcess(0);

	Process*  tmp  = getProcess(index);

	return tmp;
}		


void ReadyQueue :: displayList ()
{
	 Process* tmp = front;

	 while ( tmp != NULL )
	 {

		   cout << tmp->getBurstTime() 		 << "\t\t\t"  
				<< tmp->getWatingTime() 	 << "\t\t" 
				<< tmp->getTurnAroundTime()  <<"\t\t";

			if ( tmp->getPriorityLevel() == 0 )
				cout << " NO ";
			else if ( tmp->getPriorityLevel() == 1 )
				cout << " Hight "; 
			else 
				cout << " LOW	";

		   tmp = tmp->getNext();
		   cout << "\n";
	 }


}

bool ReadyQueue :: isEmpty ()
{
	 if ( front == NULL )
		return true;
	 else
		 return false;
}

void ReadyQueue :: removeProcess (Process* node)
{
	if ( node->getPrevious()  == NULL && node->getNext() == NULL )
		front = back = NULL;

	else if ( node->getPrevious() == NULL )
	{
		front = node->getNext();
		node->getNext()->setPrevious(NULL);
	}

	else if ( node->getNext() == NULL)
	{
		back = node->getPrevious();
		node->getPrevious()->setNext(NULL);
	}

	else
	{
		node->getPrevious()->setNext(node->getNext());
		node->getNext()->setPrevious(node->getPrevious());
	}

	delete node;
}

void ReadyQueue :: deleteProcessByData (int bt	)
{
	Process* tmp = front;

	while ( tmp != NULL)
	{
		if ( tmp->getBurstTime() == bt)
		{
			removeProcess(tmp);
			return;
		}

		tmp = tmp->getNext();
	}
}

والان أي خوارزميه نريد أن نطبقها ، كل ماعليها هو استخدام المفاهيم السابقه Process و ReadyQueue ومن غير الدخول في تفاصيل تلك الأمور والتركيز على الخوارزميه نفسها .

مثلا هذه خوارزميه FCFS :

/*
  * Operation System 
  * CPU Scheduling Algorithms
  * First Come First Served [FCFS]
  * Strategy : Non - Preemptive
  * Coded By : Wajdy Essam
  * Data Structure : Queue implemenation via Double Linked List
  * FeedBack : SudanGeek@hotmail.com
*/

#include "ReadyQueue.h"

class FCFS : public ReadyQueue
{
	private :
			Process *proc;

			// helper function
			void setWatingTimeForProcess ();
			void setTurnAroundTimeForProcess ();

	public :
			FCFS () : proc(NULL)
			{	
				system("cls");
				cout << "\n\n\t\t	 {First Come First Served Scheduling} \n";
				cout << "\t\t =============================================\n\n"; 
			}

			void addProcess (int timeNeeded);
			void printReport ();
			void calculateTime ();

};

void FCFS :: addProcess (int timeNeed )
{
	proc = new Process(timeNeed);	// create new Process

	// add to queue
	enqueue(proc);	
}

void FCFS :: setWatingTimeForProcess ( )
{
	int tmp = 0;
	int size = this->getCount() - 1 ;

	for (int i=0; i<=size ; i++)
	{
		tmp = 0;
		for (int j=0; j<i; j++)
		{
			tmp += (*this)[j]->getBurstTime();
		}

		(*this)->setWatingTime(tmp);

	}
}

void FCFS :: setTurnAroundTimeForProcess ()
{
	int tmp = 0;
	int size = this->getCount() - 1 ;

	for (int i=0; i<=size ; i++)
	{
		(*this)->setTurnAroundTime(
			(*this)->getBurstTime() + (*this)->getWatingTime() );

	}
}

void FCFS :: printReport ()
{
	cout << "Burst Time \t Wating Time \t TurnAround Time \t Priority Level \n";
	displayList();

}

void FCFS :: calculateTime ()
{
	setWatingTimeForProcess();
	setTurnAroundTimeForProcess();

	printReport();

	double x =  ( (double)this->getCount() / (double)(*this)[getCount()-1]->getTurnAroundTime() );

	cout << "\n\nThe Throughput is " << this->getCount() << " Process in " 
		 << (*this)[getCount()-1]->getTurnAroundTime() << " = " 
		 << x 
		 << endl;
}

int main ()
{
	FCFS p;

	p.addProcess(29);
	p.addProcess(5);
	p.addProcess(15);
	p.addProcess(4);

	p.calculateTime();


	return 0;

}

قم بتشغيل البرنامج السابق وستجد أنه يعمل تماما بدون مشاكل (على ما أذكر) .

وهذه خوارزميه الـ SJF ، وهي تعمل بلا مشاكل على ما أذكر.

/*
  * Operation System 
  * CPU Scheduling Algorithms
  * Shortest Job First [SJF]
  * Strategy : Non - Preemptive
  * Coded By : Wajdy Essam
  * Data Structure : Queue implemenation via Double Linked List
  * FeedBack : SudanGeek@hotmail.com
*/

#include "ReadyQueue.h"

class SJF : public ReadyQueue
{
	private :
			Process *proc;



	public :
			SJF () : proc(NULL)
			{	
				system("cls");
				cout << "\n\n\t\t	 {Shortest Job First [SJF] Scheduling} \n";
				cout << "\t\t =============================================\n\n"; 
			}

			void addProcess (int timeNeeded);
			Process* getSmallest();
			void printReport ();
			void calculateTime ();

};

void SJF :: addProcess (int timeNeed )
{
	proc = new Process(timeNeed);	// create new Process

	// add to queue
	enqueue(proc);	
}


void SJF :: printReport ()
{
	cout << "Burst Time \t Wating Time \t TurnAround Time \t Priority Level \n";
	displayList();

}

Process* SJF :: getSmallest ()
{
	Process* tmp = front , *min = front;
	int m =  tmp->getBurstTime();

	while ( tmp != NULL )
	{
		if (m >  tmp->getBurstTime() )
		{
			min = tmp;
			m = tmp->getBurstTime();
		}

		tmp = tmp->getNext();
	}
	Process* a = min;
	int x = min->getBurstTime();
	cout << "f = " << a->getBurstTime() << endl;

	return a;
}	

void SJF :: calculateTime ()
{

	ReadyQueue newQueue;

	Process* tmp = front;
	int previousWating = 0;


	while ( tmp != NULL )
	{
		Process* min = getSmallest();

		min->setWatingTime(previousWating);
		min->setTurnAroundTime(min->getWatingTime() + min->getBurstTime());
		previousWating =min->getBurstTime();

		cout << min->getBurstTime() << endl;
		cout << min->getWatingTime() << endl;
		cout << min->getTurnAroundTime() << endl;
		cout << previousWating << endl;

		Process* a = min;
		newQueue.enqueue(a);
		deleteProcessByData(min->getBurstTime());

		tmp = tmp->getNext();
	}
		newQueue.displayList();
		printReport();

}

int main ()
{
	SJF p;

	p.addProcess(29);
	p.addProcess(5);
	p.addProcess(15);
	p.addProcess(4);

	p.getReport();
	//p.calculateTime();


	Process* tmp = NULL;
	int previousWating = 0;

	while ( tmp != NULL )
	{
		Process* min = p.getSmallest();

		min->setWatingTime(previousWating);
		min->setTurnAroundTime(min->getWatingTime() + min->getBurstTime());
		previousWating =min->getBurstTime();

		cout << min->getBurstTime() << endl;
		cout << min->getWatingTime() << endl;
		cout << min->getTurnAroundTime() << endl;
		cout << previousWating << endl;

		Process* a = min;
		//newQueue.enqueue(a);
		p.deleteProcessByData(min->getBurstTime());

		tmp = tmp->getNext();
	}

	return 0;

}

على العموم بعد مرور الوقت أكتشفت أن التطبيق لخوارزميه FCFS و SJF التي كتبتها في الأعلى ، غير صحيحه منطقيا ، حيث قمت باستخدام مفهوم الواراثه Inheritance من ReadyQueue وهو أمر غير صحيح أبدا ، حيث أن FCFS هي ليست نوع من الـ ReadyQueue .

والصح هو أن أجعل كائن من الـ ReadyQueue ضمن الـ FCFS (أو أي خوارزميه أخرى) وهو ما يعرف بالـ Composition .

المهم الذي تريده هو اضافه مفهوم الـ Preemptive وسأحاول فيه ان توفر الوقت الكافي وسأرجع في حال توفقت .

بالنسبه الى Vector التي أستخدمها أخي Blueteeth فهي عباره عن مصفوفه قابله للتوسعه ,, أما Queue فهي Data Structure معرفه مسبقا ، وتم استخدامها هنا مباشره من غير كتابه Queue من البدايه ، كما كتبته أنا في برنامجي السابق .

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

اخي الفاضل romancy

الف الف شكر على المشاركه الحلوه ....

ملاحظه / انا محرج والله منكم ..

المشكله معي هي خوارزمية ال preemptive والتي اتمنى ان تتوفقون في عملها ....

***** واتمنى لو تعطوني الكود في اسرع وقت ممكن *******

مع التحيه .

#10

السلام عليكم .....

يا جماعه لاتنسون اخوكم ...

مع التحيه .

#11

تحياتي

كان نفس السؤال مطلوب منا واجب قبل فتره حليته بال vb6 و بال C

ولكن للأسف نسخة ال C ضاعت موجود نسخة الفيجوال (نفس طريقة الحل في السي لم يختلف شيئ عنها) أرفقه لك راجيا أن يفيدك

ملاحظع طبعا طريقة ال SJF عندما تصبح Preemptive يصبح اسمها Shortest remaning next(Time)

تحياتي

HW3.zip

#12

بخصوص الأسطر التى لم تعرفها, فهى كما تفضل أخى romansy بشرحها,

ال vector<> عبارة عن حاوية مثل ال array و لكنها قابلة للتمدد أوتوماتيكيا, و لوضع أى عنصر فى أخر ال vector إستخدمت الطريقة push_back الخاصة بكلاس ال vector.

ال priority_queue<> عبارة عن حاوية تقوم بإدخال العناصر بداخلها بترتيب معين تحدده بواسطة ال functor (ممكن تعتبره نوع من أنواع الدوال), و تستخدم الطريقة push لدفع العناصر بداخله و الطريقة top لإسترجاع أول عنصر به و الطريقة pop لمسح أول عنصر به.

و حتى نستطيع إستخدام هذه الحاويات يجب عمل include للفايلين vector و queue

لمعلومات أكثر

> http://www.cplusplus.com/reference/stl/vector/

> http://www.cplusplus.com/reference/stl/priority_queue/

أنا الحمد لله لقيت شوية وقت و قعدت صححت شوية أخطاء و البرنامج إشتغل بعون الله >

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct process{
	double arr;
	double burst;
	double rem;
	double end;
	double wait;
	double last_run;

	process(double arrival_time=0, double burst_time=0):arr(arrival_time), burst(burst_time), rem(burst_time), end(0), wait(0), last_run(arrival_time)
	{}
	process& operator = (const process& o)
	{
		arr = o.arr;
		burst = o.burst;
		rem = o.rem;
		end = o.end;
		wait = o.wait;
		last_run = o.last_run;
		return *this;
	}
};

struct arr_sort{
	bool operator ()(process p1, process p2) {  return (p1.arr > p2.arr);  }
};

struct rem_sort{
	bool operator ()(process p1, process p2) {  return (p1.rem > p2.rem);  }
};

double pre_emptive(vector<process> p)
{
	priority_queue<process,vector<process>,arr_sort> by_arr;
	priority_queue<process,vector<process>,rem_sort> ready;
	vector<process> completed;
	process curr;
	double my_time;
	bool proc_idle = true;
	int n = p.size();

	// fill the queue by arrivals to loop through all processes
	for (int i=0; i<n; i++)
		by_arr.push(p);

	while (!by_arr.empty())
	{
		process nuproc = by_arr.top();  // the newly arrived process
		by_arr.pop();

		if (proc_idle == true)  // processor is idle
		{
			my_time = nuproc.arr;

			if (ready.empty() || nuproc.rem<ready.top().rem)
				curr = nuproc;
			else
			{
				curr = ready.top();
				ready.pop();
				curr.wait += my_time - curr.last_run;
				ready.push(nuproc);
			}
			proc_idle = false;
		}

		else  // a process is already running
		{
			curr.rem -= (nuproc.arr - my_time);

			if (nuproc.rem < curr.rem)  // the new process is shorter than current
			{
				// run the new process
				curr.last_run = nuproc.arr;
				ready.push(curr);
				curr = nuproc;
			}
			else   // the new process is longer
			{
				nuproc.last_run = nuproc.arr;
				ready.push( nuproc );
			}

			// update the time
			my_time = nuproc.arr;
		}

		// take a peek
		if (!by_arr.empty() && (by_arr.top().arr >= my_time + curr.rem)) // the next process will arrive after the current process finishes
		{
			my_time += curr.rem;
			curr.rem = 0;
			curr.end = my_time;

			completed.push_back(curr);
			proc_idle = true;
		}
	}

		// complete all the ready processes
		if (proc_idle == false)  // there's a current process
		{
			my_time += curr.rem;
			curr.rem = 0;
			curr.end = my_time;

			completed.push_back(curr);
			proc_idle = true;
		}

		// finish all the ready processes
		while (!ready.empty())
		{
			proc_idle = false;
			curr = ready.top();
			ready.pop();
			curr.wait += my_time - curr.last_run;
			my_time += curr.rem;
			curr.end = my_time;
			completed.push_back(curr);
			proc_idle = true;  // just for completeness
		}

		// all the processes are completed
		// compute the average waiting time
		double sum_wt = 0.0;
		for (int i=0; i<completed.size(); i++)
			sum_wt += completed.wait;

		return (sum_wt/n);
}

int main()
{
	vector<process> all;
	int num;
	double arrival, burst;
	cout << "Enter the number of processes: ";
	cin >> num;

	for (int i=1; i<=num; i++)
	{
		cout << "Enter process " << i << " arrival time: ";
		cin >> arrival;
		cout << "Enter process " << i << " CPU burst time: ";
		cin >> burst;
		process p(arrival, burst);
		all.push_back(p);
	}

	cout << "Pre-emptive SJF average waiting time = " << pre_emptive(all) << endl;

	return 0;
}
#13

الف شكر على الكود ....

إن شاء الله يكون شغال

بالنسبه للاخ الي عامل بالفيجوال بيسك اشكرك على تفاعلك معي ....

مع التحيه

تسلموووووووووووووووووووووووووو

#14

السلام عليكم /

اليوم لي الحق في العتاب لكن لن اعاتب

لاني تعبتكم معي .. بس معي طلب اخير ياليت تكونوا تتاكدو من الاكواد ان تكون صحيحه

لانه الى الان لم يتنفذ معي ولا كود واحد

مع التحيه

#15
CONSOLE
Enter the number of processes: 4
Enter process 1 arrival time: 0
Enter process 1 CPU burst time: 7
Enter process 2 arrival time: 2
Enter process 2 CPU burst time: 4
Enter process 3 arrival time: 4
Enter process 3 CPU burst time: 1
Enter process 4 arrival time: 5
Enter process 4 CPU burst time: 4
Pre-emptive SJF average waiting time = 3
Press any key to continue . . .


دا ال o/p من البرنامج اللى أنا حاطه بأخر رد ليا. إزاى مشتغلش معاك؟ إيه هى الأخطاء اللى طلعتلك؟

<<خارج الموضوع>>
اقتباس
اليوم لي الحق في العتاب لكن لن اعاتب

مع إحترامى يا أخى, ليس لك حق "العتاب", لأن أى حد حيساعدك فى أى حاجة تطلبها دا حيبقا من باب حب مساعدة الغير, فهو ليس مجبرا أن يضيع وقته فى قراءة كودك و إيجاد الأخطاء و تصحيحها. فا لو عمل كده يبقى أقل شئ مطلوب منك هو أن تصحح الأخطاء الموجودة بنفسك أو تسأل مرة أخرى عن شئ إنت مش فاهمه, لكن "عتاب"! مش فى محلها.

تم تعديل هذه المشاركة بواسطة Blueteeth في 19 فبراير 2008 في 16:07

#16

اخي الكريم أسف جدا على كلامي السابق

احب ان استفسر الكود الي انت وضعته يشتغل على اي اصدار من اصدارات السي بلس بلس

يمكن ان الاصدار الي معي ما يدعمش بعض الخواص في الكود

والاخطاء التي بتظهر لي حوالي اربعة اخطاء

سوف ادرجها لاحقا

على العموم الف شكر على التفاعل معي

مع التحيه

#18

[لسلام عليكم ....

اخي blueteeth مشكور على تفاعلك في الموضوع ....

بالنسبه للصدار في اختلاف بيناتنا ...

انا اشتغل على turpo c++ 4.5

لهذا ارجوا كل الرجاء ان تقدم لي هذه الخدمه وهي فحص البرنامج على هذا الاصدار او يمكنك افادتي من خلال شرح هذه الاخطاء التي بتظهر لي

عند التنفيذ ....

post-129884-1204538573_thumb.jpg

مع التحيه

تم تعديل هذه المشاركة بواسطة ms_z في 3 مارس 2008 في 13:06

#19

أسف معنديش الإصدار ده و معرفش ممكن يبقى قبل الستاندرد و لازم تعمل include ل iostream.h مش iostream بس. أنصحك بتغييره.

#20

مشكور اخي على كل ما بذلته معي ......

فعلا انا ممنونك تسلم

وشكرا على النصيحه ..

مع التحيه

#21

السلام عليكمالسلام عليكــم ورحمـة الله وبركاتــه ،،

لوسمحتوا بقيت اعرف اذا بحذف كل ال processes بعد ما ادخلها بالqueue عشان ادخل بروسيز غيرها اشلون؟

على نفس الكود اللي محطوط بالصفحه الاولى مال ReadyQueue ؟؟

لوسمحتوا محتاجه رد بسرعه :S

وشكراً جزيلا مقدما

مواضيع مشابهة