Facebook
From Sole Water Vole, 1 Year ago, written in C++.
Embed
Download Paste or View Raw
Hits: 120
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6.  
  7.  
  8.  
  9. int function_for_time_quantum(queue<int> ready_queue)
  10. {
  11.  
  12.     int tot_size=ready_queue.size();
  13.  
  14.     vector<int> v_for_sort,v_for_save;
  15.  
  16.  
  17.     while(!ready_queue.empty()){
  18.         int process_burst=ready_queue.front();
  19.         ready_queue.pop();
  20.  
  21.         v_for_save.push_back(process_burst);
  22.         v_for_sort.push_back(process_burst);
  23.  
  24.  
  25.     }
  26.  
  27.     sort(v_for_sort.begin(),v_for_sort.end());
  28.  
  29.  
  30.     int median;
  31.  
  32.     if(tot_size%2==0){
  33.         median=( v_for_sort[tot_size/2] + v_for_sort[(tot_size/2)-1] )/2.0;
  34.  
  35.     }
  36.     else median=v_for_sort[tot_size/2];
  37.  
  38.     int diff=0;
  39.  
  40.     for(int i=1;i<v_for_sort.size();i++){
  41.         diff+=(v_for_sort[i]-v_for_sort[i-1]);
  42.     }
  43.  
  44.  
  45.  
  46.      double average_of_diff;
  47.  
  48.      if(tot_size==1) average_of_diff=diff;
  49.      else average_of_diff=(double)diff/(tot_size-1);
  50.  
  51.  
  52.     int factor=floor(average_of_diff);
  53.  
  54.  
  55.  
  56.     for(auto it:v_for_save){
  57.        ready_queue.push(it);
  58.  
  59.     }
  60.  
  61.     int t=median+factor;
  62.  
  63.     return t;
  64.  
  65. }
  66.  
  67. int main()
  68. {
  69.  
  70.     int arrival_time[105],burst_time[105],finish_time[105],response_time[105],visited[105],waiting_time[105],turn_time[105];
  71.     int tq;
  72.  
  73.     vector<pair<int,pair<int,int>> > v;
  74.  
  75.     cout<<"Number of process, n:";
  76.  
  77.     int n;cin>>n;
  78.  
  79.     for(int i=1;i<=n;i++){
  80.         response_time[i]=-1;
  81.         visited[i]=0;
  82.     }
  83.  
  84.     for(int i=1;i<=n;i++){
  85.  
  86.         cout<<"Enter the arrival time of P"<<i<<": ";
  87.         cin>>arrival_time[i];
  88.  
  89.         cout<<"Enter the burst time of P"<<i<<": ";
  90.         cin>>burst_time[i];
  91.  
  92.  
  93.         cout<<endl;
  94.  
  95.         v.push_back({arrival_time[i],{burst_time[i],i}});
  96.  
  97.     }
  98.  
  99.  
  100.  
  101.     sort(v.begin(),v.end());
  102.  
  103.     queue<int> ready_queue;
  104.  
  105.  
  106.  
  107.     int current_time=0;
  108.     int tot_idle_time=0;
  109.  
  110.  
  111.  
  112.  
  113.     queue<pair<int,int> > q;
  114.  
  115.  
  116.     q.push({v[0].second.first,v[0].second.second});       /// burst time , id
  117.  
  118.     ready_queue.push(v[0].second.first);
  119.     visited[0]=1;
  120.  
  121.  
  122.     current_time=v[0].first;
  123.  
  124.     cout<<"Gantt Chart: :";
  125.     cout<<0<<" ";
  126.  
  127.     if(current_time!=0){
  128.         cout<<"Idle "<<current_time<<" ";
  129.  
  130.         tot_idle_time+=current_time;
  131.     }
  132.  
  133.     ///int ct=0;
  134.     int total_completed=0;
  135.  
  136.     while(!q.empty()){
  137.  
  138.         auto x=q.front();
  139.  
  140.         int burst=x.first;
  141.         int process_id=x.second;
  142.         q.pop();
  143.         ///ct++;
  144.         if(response_time[process_id]==-1) response_time[process_id]=current_time;
  145.  
  146.         tq=function_for_time_quantum(ready_queue);
  147.  
  148.         ready_queue.pop();
  149.  
  150.         int remaining_burst_time;
  151.         if(tq<burst){
  152.  
  153.            current_time+=tq;
  154.            remaining_burst_time=burst-tq;
  155.  
  156.         }
  157.         else{
  158.            current_time+=burst;
  159.            remaining_burst_time=0;
  160.            finish_time[process_id]=current_time;
  161.            total_completed++;
  162.  
  163.  
  164.         }
  165.  
  166.  
  167.  
  168.         cout<<"P"<<process_id<<" "<<current_time<<" ";
  169.  
  170.  
  171.  
  172.  
  173.  
  174.         for(int i=0;i<n;i++){
  175.             if(v[i].first<=current_time){
  176.                 if(visited[i]==0)
  177.                 {
  178.                     visited[i]=1;
  179.                     q.push({v[i].second.first,v[i].second.second});
  180.  
  181.                     ready_queue.push(v[i].second.first);
  182.  
  183.                 }
  184.             }
  185.         }
  186.  
  187.        /// cout<<"ID2 "<<id<<" bur "<<rem<<endl;https://pastebin.pl/view/346f6894
  188.  
  189.         if(remaining_burst_time!=0){
  190.             q.push({remaining_burst_time,process_id});
  191.  
  192.             ready_queue.push(remaining_burst_time);
  193.  
  194.         }
  195.  
  196.  
  197.  
  198.  
  199.         if(q.empty()){
  200.             if(total_completed!=n){
  201.                 for(int i=0;i<n;i++){
  202.                     if(visited[i]==0)
  203.                     {
  204.                         visited[i]=1;
  205.                         int arrival=v[i].first;
  206.  
  207.                         q.push({v[i].second.first,v[i].second.second});
  208.  
  209.                         ready_queue.push(v[i].second.first);
  210.  
  211.  
  212.  
  213.                         cout<<"Idle "<<arrival<<" ";
  214.  
  215.  
  216.                         tot_idle_time+=(arrival-current_time);
  217.  
  218.  
  219.                         current_time=v[i].first;
  220.  
  221.  
  222.                         break;
  223.                     }
  224.                 }
  225.  
  226.             }
  227.  
  228.         }
  229.  
  230.  
  231.  
  232.  
  233.  
  234.     }
  235.  
  236.     cout<<endl;
  237.  
  238.     ///ct=ct-1;
  239.  
  240.     double total_turn_time=0.0,total_waiting_time=0.0;
  241.  
  242.  
  243.     for(int i=1;i<=n;i++){
  244.  
  245.         turn_time[i]=finish_time[i]-arrival_time[i];
  246.         total_turn_time+=(double)finish_time[i]-arrival_time[i];
  247.  
  248.         waiting_time[i]=turn_time[i]-burst_time[i];
  249.         total_waiting_time+=(double)turn_time[i]-burst_time[i];
  250.     }
  251.  
  252.     for(int i=1;i<=n;i++){
  253.         response_time[i]=response_time[i]-arrival_time[i];
  254.     }
  255.  
  256.  
  257.     for(int i=1;i<=n;i++){
  258.         cout<<"Process: P"<<i<<" End time: "<<finish_time[i]<< " Waiting time:"<<waiting_time[i]<<" "<<"Turnaround time:"<<turn_time[i];
  259.         cout<<" Response time "<<response_time[i];
  260.         cout<<endl;
  261.     }
  262.     cout<<endl;
  263.  
  264.     cout<<"Average waiting time:"<<total_waiting_time/n<<endl;
  265.     cout<<"Average turnaround time:"<<total_turn_time/n<<endl;
  266.     cout<<"IDLE "<<tot_idle_time<<endl;
  267.  
  268.  
  269.  
  270.  
  271.     ///cout<<"CONTEXT "<<ct<<endl;
  272.  
  273.  
  274.  
  275.  
  276.  
  277. }
  278.  
  279. /*
  280.  
  281. 4
  282. 3
  283. 6
  284. 9
  285. 5
  286. 9
  287. 4
  288. 9
  289. 3
  290.  
  291. 5
  292. 3
  293. 4
  294. 7
  295. 1
  296. 10
  297. 5
  298. 11
  299. 5
  300. 9
  301. 2
  302.  
  303. 5
  304. 3
  305. 6
  306. 7
  307. 5
  308. 12
  309. 2
  310. 10
  311. 7
  312. 9
  313. 6
  314.  
  315.  
  316. 3
  317. 0
  318. 5
  319. 0
  320. 6
  321. 0
  322. 22
  323.  
  324.  
  325. */
  326.  
  327.