- Berubah dari running ke waiting state.
- Berubah dari running ke ready state.
- Berubah dari waiting ke ready state.
- Dihentikan.
Penjadwalan Preemptive mempunyai arti kemampuan sistem operasi untuk memberhentikan sementara proses yang sedang berjalan untuk memberi ruang kepada proses yang prioritasnya lebih tinggi. Penjadwalan ini bisa saja termasuk penjadwalan proses atau M/K. Penjadwalan Preemptive memungkinkan sistem untuk lebih bisa menjamin bahwa setiap proses mendapat sebuah slice waktu operasi. Dan juga membuat sistem lebih cepat merespon terhadap event dari luar (contohnya seperti ada data yang masuk) yang membutuhkan reaksi cepat dari satu atau beberapa proses. Membuat penjadwalan yang Preemptive mempunyai keuntungan yaitu sistem lebih responsif daripada sistem yang memakai penjadwalan Non Preemptive.
Program C++ Untuk Mencari Preemptive
#include <iostream>
#include <iomanip>
using namespace std;
struct process {
int idno;
int ready;
int run;
int remaining;
int active;
int finish; };
class myclock
{
protected:
int clock99;
public:
myclock() { clock99 = 0; }
void setclock( int w ) { clock99 = w; }
void tick() { clock99++; }
int gettime() { return clock99; }
};
class processor
{
protected:
int maxjobs;
int jobsub;
int current_id;
int previous_id;
int quantum;
int elapsed;
process * list;
public:
processor( int q, int n)
{
maxjobs = n;
jobsub = 0;
elapsed = 0;
current_id = -1;
previous_id = -1;
quantum = q;
list = new process[n];
}
int insertjob( int id, int start, int run )
{
if( jobsub < maxjobs )
{
list[jobsub].idno = id;
list[jobsub].ready = start;
list[jobsub].run = run;
list[jobsub].remaining = run;
list[jobsub].active = 0;
list[jobsub].finish = -1;
jobsub++;
return 1;
}
else
return 0;
}
void printlist()
{
if( jobsub > 0 )
for( int i = 0; i < jobsub; i++ )
{
cout << list[i].idno << setw(10) << list[i].ready << setw(10)
<< list[i].run << setw(10) << list[i].finish;
if( list[i].finish != -1 )
cout << setw(10) << list[i].finish - list[i].ready << endl;
else
cout << endl;
}
}
int jobsleft()
{
int temp = 0;
for( int i=0; i < jobsub ; i++)
if( list[i].remaining != 0 )
temp = 1;
return temp;
}
void fixready( int t)
{
for( int i=0; i < jobsub; i++)
if( list[i].ready == t)
list[i].active = 1;
}
int anyactive()
{
int temp = 0;
for( int i = 0; i < jobsub; i++)
if( list[i].active )
temp = 1;
return temp;
}
void check( int t )
{
if( current_id != -1 )
{
if( list[current_id].remaining == 0 )
{
list[current_id].finish = t;
list[current_id].active = 0;
previous_id = -1;
current_id = -1;
elapsed = 0;
}
if( elapsed == quantum)
{
previous_id = current_id;
current_id = -1;
elapsed = 0;
}
}
if( current_id == -1 && anyactive() )
{
current_id = findmin();
}
if( current_id != -1 )
{
list[current_id].remaining -= 1;
elapsed++;
}
}
int getcurrent() { return list[current_id].idno; }
int findmin()
{
int found = 0, smallsub;
for( int i = 0; i < jobsub; i++)
if( list[i].remaining != 0 && list[i].active )
if( found == 0 )
{
smallsub = i;
found = 1;
}
else
if( list[i].active && (list[i].remaining <
list[smallsub].remaining ))
smallsub = i;
if( smallsub == previous_id )
{
int countties = 0;
for( int i = 0; i < jobsub; i++)
if( list[i].active && list[i].remaining == list[smallsub].remaining )
countties++;
if( countties > 1 )
{
int j = 0;
int found = 0;
while( j < jobsub && !found )
if( list[j].active && list[j].remaining == list[smallsub].remaining
&& j != smallsub )
found = 1;
else
j++;
smallsub = j;
}
}
return smallsub;
}
void endsim( int t )
{
list[current_id].finish = t;
}
};
int main()
{
myclock timer;
int quantum, t;
int newid,newstart,newruntime;
char ch;
int n;
cout << "How Many Jobs? ";
cin >> n;
cout << endl << "What Is The Quantum? ";
cin >> quantum;
processor cpu( quantum, n);
cout << endl << "Enter ID Number, Start Time, and Run Time For Each Job ";
cout << endl << "-------------------------------------------------------";
cout << endl;
for( int i = 0; i < n; i++)
{
cin >> newid >> newstart >> newruntime;
if( cpu.insertjob( newid, newstart, newruntime ) )
cout << "Job Inserted Successfully " << endl;
else
cout << "Processor Queue Size Limit Exceeded " << endl;
cout << "-------------------------------------------------------"
<< endl;
}
cout << endl << "-------------------------------------------------------"
<< endl;
cout << "Summary of Data Entered " << endl;
cout << "-------------------------------------------------------" << endl;
cpu.printlist();
cout << "-------------------------------------------------------" << endl;
cout << endl << endl << "-------------------------------------------------------" << endl;
cout << "Gantt Chart" << endl;
cout << "-------------------------------------------------------" << endl;
while( cpu.jobsleft() )
{
t = timer.gettime();
cpu.fixready( t );
cpu.check( t );
if( cpu.anyactive() )
cout << "|" << cpu.getcurrent();
else
cout << "|---";
timer.tick();
}
t = timer.gettime();
cout << "|";
cpu.endsim(t);
cout << endl << "-------------------------------------------------------" << endl;
cout << endl << endl;
cout << "-------------------------------------------------------" << endl;
cout << "Simulation Results " << endl;
cout << "-------------------------------------------------------" << endl;
cpu.printlist();
int ll;
cin >> ll;
cout << "-------------------------------------------------------" << endl;
}



0 komentar:
Posting Komentar