Computer >> Máy Tính >  >> Lập trình >> C ++

Lập lịch chương trình C ++ cho công việc ngắn nhất đầu tiên (SJF) (ưu tiên)

Đã cho quá trình, thời gian bùng nổ của một quá trình tương ứng và một giới hạn lượng tử; nhiệm vụ là tìm và in thời gian chờ, thời gian quay vòng và thời gian trung bình tương ứng của chúng bằng cách sử dụng phương pháp ưu tiên Lập lịch trước cho công việc ngắn nhất.

Công việc ngắn nhất lên lịch đầu tiên là gì?

Lập lịch trình đầu tiên cho công việc ngắn nhất là thuật toán lập lịch công việc hoặc quy trình tuân theo kỷ luật lập lịch không miễn phí. Trong trường hợp này, bộ lập lịch chọn tiến trình từ hàng đợi có thời gian hoàn thành ít nhất và phân bổ CPU cho công việc hoặc quá trình đó. Công việc ngắn nhất Đầu tiên được mong đợi hơn thuật toán FIFO vì SJF tối ưu hơn vì nó giảm thời gian chờ trung bình sẽ làm tăng thông lượng.

Thuật toán SJF có thể ưu tiên cũng như không ưu tiên. Lập lịch trước còn được gọi là thời gian ngắn nhất còn lại trước tiên lập kế hoạch. Trong cách tiếp cận Preemptive, quy trình mới phát sinh khi đã có quy trình đang thực thi. Nếu thời gian liên tục của quá trình mới đến ít hơn thời gian liên tục của quá trình thực thi thì bộ lập lịch sẽ bắt trước việc thực hiện quá trình với thời gian liên tục nhỏ hơn.

Thời gian quay vòng, thời gian chờ và thời gian hoàn thành là gì?

  • Thời gian hoàn thành là thời gian cần thiết của quá trình để hoàn thành quá trình thực thi
  • Thời gian xoay vòng là khoảng thời gian giữa quá trình gửi đến khi hoàn thành.

    Thời gian quay vòng =hoàn thành quy trình - gửi quy trình

  • Thời gian chờ là sự khác biệt giữa thời gian quay vòng và thời gian liên tục

    Thời gian chờ =thời gian quay vòng - thời gian liên tục

Ví dụ

Chúng tôi đưa ra các quy trình P1, P2, P3, P4 và P5 có thời gian bùng nổ tương ứng của chúng được đưa ra bên dưới

Quy trình Thời gian nổ Giờ đến
P1 4 0
P2 2 1
P3 8 2
P4 1 3
P5 9 4

Vì thời gian đến của P1 là 0 nên nó sẽ là thời điểm đầu tiên được thực thi cho đến khi xuất hiện một quá trình khác. Khi ở 1, quá trình P2 đi vào và thời gian bùng nổ của P2 nhỏ hơn thời gian bùng nổ của P1, do đó bộ lập lịch sẽ điều khiển CPU theo quá trình P2, v.v.

Lập lịch chương trình C ++ cho công việc ngắn nhất đầu tiên (SJF) (ưu tiên)

Thời gian chờ đợi trung bình được tính trên cơ sở biểu đồ gantt. P1 phải đợi (0 + 4) 4, P2 phải đợi 1, P3 phải đợi 7, P4 phải đợi 3 và P5 phải đợi 15. Vì vậy, thời gian chờ trung bình của họ sẽ là -

Lập lịch chương trình C ++ cho công việc ngắn nhất đầu tiên (SJF) (ưu tiên)

Thuật toán

Start
Step 1-> Declare a struct Process
   Declare pid, bt, art
Step 2-> In function findTurnAroundTime(Process proc[], int n, int wt[], int tat[])
   Loop For i = 0 and i < n and i++
      Set tat[i] = proc[i].bt + wt[i]
Step 3-> In function findWaitingTime(Process proc[], int n, int wt[])
   Declare rt[n]
   Loop For i = 0 and i < n and i++
      Set rt[i] = proc[i].bt
      Set complete = 0, t = 0, minm = INT_MAX
      Set shortest = 0, finish_time
      Set bool check = false
      Loop While (complete != n)
         Loop For j = 0 and j < n and j++
            If (proc[j].art <= t) && (rt[j] < minm) && rt[j] > 0 then,
               Set minm = rt[j]
               Set shortest = j
               Set check = true
            If check == false then,
               Increment t by 1
               Continue
               Decrement the value of rt[shortest] by 1
               Set minm = rt[shortest]
            If minm == 0 then,
               Set minm = INT_MAX
               If rt[shortest] == 0 then,
               Increment complete by 1
               Set check = false
               Set finish_time = t + 1
               Set wt[shortest] = finish_time - proc[shortest].bt -proc[shortest].art
            If wt[shortest] < 0
               Set wt[shortest] = 0
               Increment t by 1
Step 4-> In function findavgTime(Process proc[], int n)
   Declare and set wt[n], tat[n], total_wt = 0, total_tat = 0
   Call findWaitingTime(proc, n, wt)
   Call findTurnAroundTime(proc, n, wt, tat)
   Loop For i = 0 and i < n and i++
      Set total_wt = total_wt + wt[i]
      Set total_tat = total_tat + tat[i]
      Print proc[i].pid, proc[i].bt, wt[i], tat[i]
      Print Average waiting time i.e., total_wt / n
      Print Average turn around time i.e., total_tat / n
Step 5-> In function int main()
   Declare and set Process proc[] = { { 1, 5, 1 }, { 2, 3, 1 }, { 3, 6, 2 }, { 4, 5, 3 } }
   Set n = sizeof(proc) / sizeof(proc[0])
   Call findavgTime(proc, n)
Stop

Ví dụ

#include <bits/stdc++.h>
using namespace std;
//structure for every process
struct Process {
   int pid; // Process ID
   int bt; // Burst Time
   int art; // Arrival Time
};
void findTurnAroundTime(Process proc[], int n, int wt[], int tat[]) {
   for (int i = 0; i < n; i++)
   tat[i] = proc[i].bt + wt[i];
}
//waiting time of all process
void findWaitingTime(Process proc[], int n, int wt[]) {
   int rt[n];
   for (int i = 0; i < n; i++)
   rt[i] = proc[i].bt;
   int complete = 0, t = 0, minm = INT_MAX;
   int shortest = 0, finish_time;
   bool check = false;
   while (complete != n) {
      for (int j = 0; j < n; j++) {
         if ((proc[j].art <= t) && (rt[j] < minm) && rt[j] > 0) {
            minm = rt[j];
            shortest = j;
            check = true;
         }
      }
      if (check == false) {
         t++;
         continue;
      }
      // decrementing the remaining time
      rt[shortest]--;
      minm = rt[shortest];
      if (minm == 0)
         minm = INT_MAX;
         // If a process gets completely
         // executed
         if (rt[shortest] == 0) {
            complete++;
            check = false;
            finish_time = t + 1;
            // Calculate waiting time
            wt[shortest] = finish_time -
            proc[shortest].bt -
            proc[shortest].art;
            if (wt[shortest] < 0)
               wt[shortest] = 0;
         }
         // Increment time
         t++;
   }
}
// Function to calculate average time
void findavgTime(Process proc[], int n) {
   int wt[n], tat[n], total_wt = 0,
   total_tat = 0;
   // Function to find waiting time of all
   // processes
   findWaitingTime(proc, n, wt);
   // Function to find turn around time for
   // all processes
   findTurnAroundTime(proc, n, wt, tat);
   cout << "Processes " << " Burst time " << " Waiting time " << " Turn around time\n";
   for (int i = 0; i < n; i++) {
      total_wt = total_wt + wt[i];
      total_tat = total_tat + tat[i];
      cout << " " << proc[i].pid << "\t\t" << proc[i].bt << "\t\t " << wt[i] << "\t\t " << tat[i] << endl;
   }
   cout << "\nAverage waiting time = " << (float)total_wt / (float)n; cout << "\nAverage turn around time = " << (float)total_tat / (float)n;
}
// main function
int main() {
   Process proc[] = { { 1, 5, 1 }, { 2, 3, 1 }, { 3, 6, 2 }, { 4, 5, 3 } };
   int n = sizeof(proc) / sizeof(proc[0]);
   findavgTime(proc, n);
   return 0;
}

Đầu ra

Lập lịch chương trình C ++ cho công việc ngắn nhất đầu tiên (SJF) (ưu tiên)