কম্পিউটার টিউটোরিয়াল

প্রায়োরিটি শিডিউলিং (Priority Scheduling) C++ প্রোগ্রাম


n সংখ্যক প্রসেস (P1, P2, P3, ..., Pn) তাদের burst time এবং priority দিয়ে দেওয়া আছে। কাজ হলো প্রায়োরিটি CPU শিডিউলিং অ্যালগরিদম ব্যবহার করে গড় ওয়েটিং টাইম, গড় টার্নআরাউন্ড টাইম এবং প্রসেস এক্সিকিউশন সিকোয়েন্স বের করা।

ওয়েটিং টাইম এবং টার্নআরাউন্ড টাইম কী?

টার্নআরাউন্ড টাইম হলো প্রসেস সাবমিশন থেকে কমপ্লিশন পর্যন্ত সময় अन्तর।

টার্নআরাউন্ড টাইম = প্রসেস কমপ্লিশন - প্রসেস সাবমিশন

ওয়েটিং টাইম হলো টার্নআরাউন্ড টাইম এবং burst time-এর পার্থক্য।

ওয়েটিং টাইম = টার্নআরাউন্ড টাইম - burst time

প্রায়োরিটি শিডিউলিং কী?

প্রায়োরিটি শিডিউলিং-এ প্রতিটি প্রসেসের সাথে একটি প্রায়োরিটি থাকে ০-১০ পর্যন্ত, যেখানে ০ ন্যূনতম প্রায়োরিটি এবং ১০ সর্বোচ্চ। প্রায়োরিটি দুইভাবে ডিফাইন করা যায়: ইন্টারনালি এবং এক্সটার্নালি। প্রায়োরিটি শিডিউলিং প্রি-এম্পটিভ বা নন-প্রি-এম্পটিভ হতে পারে।

প্রি-এম্পটিভ প্রায়োরিটি শিডিউলিং-এ, নতুন প্রসেসের প্রায়োরিটি এক্সিকিউট হচ্ছে প্রসেসের চেয়ে বেশি হলে শিডিউলার CPU প্রি-এম্পট করে।

নন-প্রি-এম্পটিভ প্রায়োরিটি শিডিউলিং-এ, নতুন প্রসেস রেডি কিউর হেডে কিউ করা হয়।

প্রায়োরিটি শিডিউলিং-এর অসুবিধা হলো ইনডিফিনাইট ব্লকিং বা স্টারভেশন। লো প্রায়োরিটি প্রসেস হাই প্রায়োরিটি প্রসেসের কারণে অনিশ্চিতকাল ধরে রিসোর্স পাওয়া যাবে না।

উদাহরণ

৪টি প্রসেস P1, P2, P3, P4 এবং তাদের burst time ও priority:

প্রসেস বার্স্ট টাইম প্রায়োরিটি
P1 15 2
P2 13 0
P3 10 4
P4 11 1

গ্যান্ট চার্ট দিয়ে এক্সিকিউশন সিকোয়েন্স:

প্রায়োরিটি শিডিউলিং (Priority Scheduling) C++ প্রোগ্রাম

অ্যালগরিদম

শুরু
ধাপ ১ -> Process স্ট্রাকচার তৈরি pid, bt, priority সহ
ধাপ ২ -> bool compare(Process a, Process b) ফাংশনে
    return (a.priority > b.priority)
ধাপ ৩ -> waitingtime(Process pro[], int n, int wt[]) ফাংশনে
    wt[0] = 0 সেট
    লুপ i = 1 থেকে i < n এবং i++
        wt[i] = pro[i-1].bt + wt[i-1] সেট
    শেষ
ধাপ ৪ -> turnarround(Process pro[], int n, int wt[], int tat[]) ফাংশনে
    লুপ i = 0 থেকে i < n এবং i++
        tat[i] = pro[i].bt + wt[i] সেট
    শেষ
ধাপ ৫ -> avgtime(Process pro[], int n) ফাংশনে
    wt[n], tat[n], total_wt = 0, total_tat = 0 ঘোষণা
    waitingtime(pro, n, wt) কল
    turnarround(pro, n, wt, tat) কল
    "Processes, Burst time, Waiting time, Turn around time" প্রিন্ট
    লুপ i=0 থেকে i

উদাহরণ

#include<bits/stdc++.h>
using namespace std;
struct Process {
    int pid; // প্রসেস আইডি
    int bt;  // CPU বার্স্ট টাইম
    int priority; // প্রসেস প্রায়োরিটি
};
// প্রায়োরিটি অনুযায়ী প্রসেস সর্ট
bool compare(Process a, Process b) {
    return (a.priority > b.priority);
}
void waitingtime(Process pro[], int n, int wt[]) {
    // প্রসেসের ইনিশিয়াল ওয়েটিং টাইম ০
    wt[0] = 0;
    // ওয়েটিং টাইম ক্যালকুলেট
    for (int i = 1; i < n; i++)
        wt[i] = pro[i-1].bt + wt[i-1];
}
// টার্ন আরাউন্ড টাইম ক্যালকুলেট
void turnarround(Process pro[], int n, int wt[], int tat[]) {
    for (int i = 0; i < n; i++)
        tat[i] = pro[i].bt + wt[i];
}
// গড় টাইম ক্যালকুলেট
void avgtime(Process pro[], int n) {
    int wt[n], tat[n], total_wt = 0, total_tat = 0;
    waitingtime(pro, n, wt);
    turnarround(pro, n, wt, tat);
    cout << "\nProcesses " << " 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 << " " << pro[i].pid << "\t\t" << pro[i].bt << "\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;
}
void scheduling(Process pro[], int n) {
    sort(pro, pro + n, compare);
    cout << "Order in which processes gets executed \n";
    for (int i = 0; i < n; i++)
        cout << pro[i].pid << " ";
    avgtime(pro, n);
}
// মেইন ফাংশন
int main() {
    Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}};
    int n = sizeof pro / sizeof pro[0];
    scheduling(pro, n);
    return 0;
}

আউটপুট

Order in which processes gets executed
1 3 2
Processes  Burst time  Waiting time  Turn around time
1           10         0              10
3           8          10             18
2           5          18             23
Average waiting time = 9.33333
Average turn around time = 17

  1. প্রায়োরিটি শিডিউলিং (Priority Scheduling) C++ প্রোগ্রাম

  2. C++ প্রোগ্রাম: হেক্সাডেসিমেল থেকে ডেসিমেল কনভার্সন

  3. C++-এ পিরামিডের ভলিউম বের করার প্রোগ্রাম

  4. C++-এ কুইকসর্ট (QuickSort) প্রোগ্রাম