Advertisement
Kaidul

SJF - preemptive

Jan 27th, 2013
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.98 KB | None | 0 0
  1. /**
  2.  * author : kaidul
  3. **/
  4. using namespace std;
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <queue>
  8. #include <bitset>
  9.  
  10. #define M 100
  11.  
  12. struct process {
  13.     int processId, arrivalTime, burstTime, priority;
  14.     int waitingTime, turnAroundTime, responseTime;
  15.     bool operator < (const process& a) const {
  16.         if(arrivalTime == a.arrivalTime) return burstTime > a.burstTime;
  17.         return arrivalTime > a.arrivalTime;
  18.     }
  19. } pArray[M];
  20.  
  21. struct waitingProcess {
  22.     int processId, arrivalTime, burstTime, priority;
  23.     bool operator < (const waitingProcess& a) const {
  24.         if(burstTime == a.burstTime) return arrivalTime > a.arrivalTime;
  25.         return burstTime > a.burstTime;
  26.     }
  27. } wp;
  28.  
  29. priority_queue<process> q;
  30. priority_queue<waitingProcess> waitingList;
  31. bitset <M> taken;
  32.  
  33. struct timeLine {
  34.     int proc, start, end;
  35. } tmline[M];
  36.  
  37. int nProcess, timeInterval, averageTime;
  38. float throughtputTime;
  39.  
  40.  
  41. int main() {
  42.     freopen("input.txt", "r", stdin);
  43.     cin >> nProcess;
  44.  
  45.     for (int i = 1; i <= nProcess ; i++) {
  46.         pArray[i].processId = i;
  47.         cin >> pArray[i].arrivalTime >> pArray[i].burstTime >> pArray[i].priority;
  48.         q.push(pArray[i]);
  49.     }
  50.     cin >> timeInterval;
  51.  
  52.     cout << "Shortest Job First - Preemptive : \n";
  53.     int i = 1;
  54.     process next, top;
  55.     waitingProcess waiting;
  56.     tmline[0].start = 0, tmline[0].proc = 0, tmline[0].end = 0;
  57.  
  58.     cout << "\nExecution Sequence : \n";
  59.     while (!waitingList.empty() || !q.empty()) {
  60.         tmline[i].start = tmline[i-1].end;
  61.         if(waitingList.empty() && !q.empty()) {
  62.             top = q.top();
  63.             q.pop();
  64.             if(!q.empty()) {
  65.                 waitingProcess p;
  66.                 next = q.top();
  67.                 if(next.arrivalTime < (top.burstTime + tmline[i-1].end)) {
  68.                     tmline[i].end = next.arrivalTime;
  69.                     tmline[i].proc = top.processId;
  70.                     int exeRemain = (top.burstTime + tmline[i-1].end) - next.arrivalTime;
  71.                     p.processId = top.processId, p.arrivalTime = top.arrivalTime, p.priority = top.priority, p.burstTime = exeRemain;
  72.                     waitingList.push(p);
  73.                 } else {
  74.                     tmline[i].end = tmline[i].start + top.burstTime;
  75.                     tmline[i].proc = top.processId;
  76.                 }
  77.  
  78.             } else {
  79.                 tmline[i].end = tmline[i].start + top.burstTime;
  80.                 tmline[i].proc = top.processId;
  81.             }
  82.         } else if(!waitingList.empty() && q.empty()) { // queue khali, waiting list khali na - sobtheke soja case
  83.             waitingProcess wt = waitingList.top();
  84.             tmline[i].end = tmline[i].start + wt.burstTime;
  85.             tmline[i].proc = wt.processId;
  86.             waitingList.pop();
  87.         } else { // both queue have processes
  88.             top = q.top();
  89.             waiting = waitingList.top();
  90.             if(top.burstTime < waiting.burstTime) {
  91.                 q.pop();
  92.                 if(!q.empty()) {
  93.                     waitingProcess wt;
  94.                     next = q.top();
  95.                     if(next.arrivalTime < (top.burstTime + tmline[i-1].end)) {
  96.                         tmline[i].end = next.arrivalTime;
  97.                         tmline[i].proc = top.processId;
  98.                         int exeRemain = (top.burstTime + tmline[i-1].end) - next.arrivalTime;
  99.                         wt.processId = top.processId, wt.arrivalTime = top.arrivalTime, wt.priority = top.priority, wt.burstTime = exeRemain;
  100.                         waitingList.push(wt);
  101.                     } else {
  102.                         tmline[i].end = tmline[i].start + top.burstTime;
  103.                         tmline[i].proc = top.processId;
  104.                     }
  105.  
  106.                 } else {
  107.                     tmline[i].end = tmline[i].start + top.burstTime;
  108.                     tmline[i].proc = top.burstTime;
  109.                 }
  110.             } else { // waitinglist and queue 2ta tei process ase, waiting er tar burst time kom, so se age execute hobe
  111.                 q.pop();
  112.                 waitingList.pop();
  113.                 waitingProcess wt;
  114.                 wt.processId = top.processId ,wt.arrivalTime = top.arrivalTime, wt.burstTime = top.burstTime, wt.priority = top.priority;
  115.                 waitingList.push(wt);
  116.                 tmline[i].end = tmline[i].start + waiting.burstTime;
  117.                 tmline[i].proc = waiting.processId;
  118.             }
  119.  
  120.         }
  121.         cout << tmline[i].start << " " << tmline[i].end << " " << tmline[i].proc << "\n";
  122.         i++;
  123.     }
  124.     cout << "\n";
  125.  
  126.     taken.reset();
  127.     int range = i -1;
  128.  
  129.     // calulating response time
  130.     for (int i = 1; i <= range; i++) {
  131.         if(taken.test(tmline[i].proc)) continue;
  132.         pArray[tmline[i].proc].responseTime = tmline[i].start - pArray[tmline[i].proc].arrivalTime;
  133.         taken.set(tmline[i].proc, 1);
  134.     }
  135.  
  136.     // Calculating Turn-Around Time
  137.     taken.reset();
  138.     for (int i = range; i >= 1; i--) {
  139.         if(taken.test(tmline[i].proc)) continue;
  140.         pArray[tmline[i].proc].turnAroundTime = tmline[i].end - pArray[tmline[i].proc].arrivalTime;
  141.         taken.set(tmline[i].proc, 1);
  142.     }
  143.  
  144.     // Calculating Waiting Time
  145.     /**
  146.       key: turn-around time = execution(burst) time + waiting time
  147.     **/
  148.     int total = 0;
  149.     for (int i = 1; i <= nProcess; i++ ) {
  150.         pArray[i].waitingTime = pArray[i].turnAroundTime - pArray[i].burstTime;
  151.         cout << pArray[i].processId << "\n";
  152.         cout << "Waiting Time : " << pArray[i].waitingTime << "\n";
  153.         total += pArray[i].waitingTime;
  154.         cout << "TurnAround Time : " << pArray[i].turnAroundTime << "\n";
  155.         cout << "Response Time : " << pArray[i].responseTime << "\n\n";
  156.     }
  157.  
  158.     averageTime = total / nProcess;
  159.     cout << "Average waiting Time : " << averageTime << "\n";
  160.  
  161.     throughtputTime = (float)nProcess / tmline[range].end;
  162.     cout << "Throughput Time : " << throughtputTime << "\n";
  163.  
  164.  
  165.  
  166.     return false;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement