Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C ++ สำหรับการตั้งเวลางานที่สั้นที่สุดก่อน (SJF) (ไม่ยึดเอาเสียก่อน)


กำหนดกระบวนการ เวลาระเบิดของกระบวนการตามลำดับและขีดจำกัดควอนตัม งานคือการค้นหาและพิมพ์เวลารอ เวลาตอบสนอง และเวลาเฉลี่ยตามลำดับโดยใช้วิธี Shortest Job First Scheduling ที่ไม่ยึดหน่วง

งานแรกที่สั้นที่สุดในการจัดตารางงานแรกคืออะไร

การจัดกำหนดการงานครั้งแรกที่สั้นที่สุดคืออัลกอริธึมการจัดกำหนดการงานหรือกระบวนการที่เป็นไปตามระเบียบวินัยการจัดกำหนดการที่ไม่ยึดเอาเสียก่อน ในสิ่งนี้ ตัวกำหนดตารางเวลาจะเลือกกระบวนการจากคิวรอโดยมีเวลาเสร็จสิ้นน้อยที่สุด และจัดสรร CPU ให้กับงานหรือกระบวนการนั้น Shortest Job First เป็นที่ต้องการมากกว่าอัลกอริธึม FIFO เพราะ SJF นั้นเหมาะสมกว่าเพราะช่วยลดเวลารอโดยเฉลี่ยซึ่งจะช่วยเพิ่มปริมาณงาน

เวลาตอบสนอง เวลารอ และเวลาที่เสร็จสิ้นคืออะไร

  • เวลาที่เสร็จสมบูรณ์ คือเวลาที่กระบวนการต้องใช้เพื่อให้การดำเนินการเสร็จสิ้น
  • เวลาตอบสนองคือช่วงเวลาระหว่างการส่งกระบวนการและเสร็จสิ้น

    เวลาดำเนินการ =เสร็จสิ้นกระบวนการ – การส่งกระบวนการ

  • เวลารอคือความแตกต่างระหว่างเวลาตอบสนองกับเวลาที่ระเบิด

    เวลารอ =เวลาตอบสนอง – เวลาที่ระเบิด

ตัวอย่าง

เราได้รับกับกระบวนการ P1, P2, P3, P4 และ P5 ที่มีเวลาระเบิดที่สอดคล้องกันด้านล่าง

กระบวนการ เวลาระเบิด
P1 4
P2 2
P3 8
P4 1
P5 9

เนื่องจากเวลาที่ระเบิดของกระบวนการ P4 นั้นน้อยที่สุดในบรรดากระบวนการทั้งหมด มันจะถูกจัดสรร CPU ก่อน หลังจากนั้น P2 จะเข้าคิว จากนั้น P1, P3 และ P5

โปรแกรม C ++ สำหรับการตั้งเวลางานที่สั้นที่สุดก่อน (SJF) (ไม่ยึดเอาเสียก่อน)

เวลารอเฉลี่ยคำนวณโดยใช้แผนภูมิแกนต์ P1 ต้องรอ 3 P2 ต้องรอ 1 P3 ต้องรอ 7 P4 ต้องรอ 0 และ P5 ต้องรอ 15 ดังนั้นเวลารอเฉลี่ยจะเท่ากับ -

โปรแกรม C ++ สำหรับการตั้งเวลางานที่สั้นที่สุดก่อน (SJF) (ไม่ยึดเอาเสียก่อน)

อัลกอริทึม

Start
Step 1-> In function swap(int *a, int *b)
   Set temp = *a
   Set *a = *b
   Set *b = temp
Step 2-> In function arrangeArrival(int num, int mat[][3])
   Loop For i=0 and i<num and i++
      Loop For j=0 and j<num-i-1 and j++
         If mat[1][j] > mat[1][j+1] then,
            For k=0 and k<5 and k++
            Call function swap(mat[k][j], mat[k][j+1])
Step 3-> In function completionTime(int num, int mat[][3])
   Declare temp, val
   Set mat[3][0] = mat[1][0] + mat[2][0]
   Set mat[5][0] = mat[3][0] - mat[1][0]
   Set mat[4][0] = mat[5][0] - mat[2][0]
    Loop For i=1 and i<num and i++
      Set temp = mat[3][i-1]
      Set low = mat[2][i]
      Loop For j=i and j<num and j++
         If temp >= mat[1][j] && low >= mat[2][j] then,
            Set low = mat[2][j]
            Set val = j
            Set mat[3][val] = temp + mat[2][val]
            Set mat[5][val] = mat[3][val] - mat[1][val]
            Set mat[4][val] = mat[5][val] - mat[2][val]
            Loop For  k=0; k<6; k++
            Call function swap(mat[k][val], mat[k][i])
Step 4-> In function int main()
   Declare and set num = 3, temp
   Declare and set mat[6][3] = {1, 2, 3, 3, 6, 4, 2, 3, 4}
   Print Process ID, Arrival Time, Burst Time
   Loop For i=0 and i<num and i++
      Print the values of mat[0][i], mat[1][i], mat[2][i]
      Call function arrangeArrival(num, mat)
      Call function completionTime(num, mat)
      Print Process ID, Arrival Time, Burst Time, Waiting Time, Turnaround Time
      Loop For i=0 and i<num and i++  
      Print the values of  mat[0][i], mat[1][i], mat[2][i], mat[4][i], mat[5][i]
Stop

ตัวอย่าง

// C++ program to implement Shortest Job first with Arrival Time
#include<iostream>
using namespace std;
void swap(int *a, int *b) {
   int temp = *a;
   *a = *b;
   *b = temp;
}
void arrangeArrival(int num, int mat[][3]) {
   for(int i=0; i<num; i++) {
      for(int j=0; j<num-i-1; j++) {
         if(mat[1][j] > mat[1][j+1]) {
            for(int k=0; k<5; k++) {
               swap(mat[k][j], mat[k][j+1]);
            }
         }
      }
   }
}
void completionTime(int num, int mat[][3]) {
   int temp, val;
   mat[3][0] = mat[1][0] + mat[2][0];
   mat[5][0] = mat[3][0] - mat[1][0];
   mat[4][0] = mat[5][0] - mat[2][0];
    for(int i=1; i<num; i++) {
      temp = mat[3][i-1];
      int low = mat[2][i];
      for(int j=i; j<num; j++) {
         if(temp >= mat[1][j] && low >= mat[2][j]) {
            low = mat[2][j];
            val = j;
         }
      }
      mat[3][val] = temp + mat[2][val];
      mat[5][val] = mat[3][val] - mat[1][val];
      mat[4][val] = mat[5][val] - mat[2][val];
      for(int k=0; k<6; k++) {
         swap(mat[k][val], mat[k][i]);
      }
   }
}
int main() {
   int num = 3, temp;
   int mat[6][3] = {1, 2, 3, 3, 6, 4, 2, 3, 4};
   cout<<"Before Arrange...\n";
   cout<<"Process ID\tArrival Time\tBurst Time\n";
   for(int i=0; i<num; i++) {
      cout<<mat[0][i]<<"\t\t"<<mat[1][i]<<"\t\t"<<mat[2][i]<<"\n";
   }
   arrangeArrival(num, mat);
   completionTime(num, mat);
   cout<<"Final Result...\n";
   cout<<"Process ID\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n";
   for(int i=0; i<num; i++) {
      cout<<mat[0][i]<<"\t\t"<<mat[1][i]<<"\t\t"<<mat[2][i]<<"\t\t"<<mat[4][i]<<"\t\t"<<mat[5][i]<<"\n";
   }
}

ผลลัพธ์

โปรแกรม C ++ สำหรับการตั้งเวลางานที่สั้นที่สุดก่อน (SJF) (ไม่ยึดเอาเสียก่อน)