আমাদেরকে প্রসেসের n সংখ্যা দেওয়া হয়েছে যেমন P1, P2, P3,......, Pn তাদের সংশ্লিষ্ট বিস্ফোরণের সময় এবং প্রতিটি প্রক্রিয়ার সাথে যুক্ত অগ্রাধিকার। কাজটি হল অগ্রাধিকার CPU শিডিউলিং অ্যালগরিদম ব্যবহার করে গড় অপেক্ষার সময়, গড় পরিবর্তনের সময় এবং প্রক্রিয়া সম্পাদনের ক্রম খুঁজে বের করা।
অপেক্ষার সময় এবং টার্নরাউন্ড টাইম কি?
টার্নরাউন্ড টাইম একটি প্রক্রিয়া জমা দেওয়া এবং তার সমাপ্তির মধ্যে সময়ের ব্যবধান।
টার্নরাউন্ড টাইম =একটি প্রক্রিয়ার সমাপ্তি - একটি প্রক্রিয়া জমা দেওয়া
অপেক্ষার সময় টার্নআরাউন্ড টাইম এবং বার্স্ট টাইমের মধ্যে পার্থক্য হল
অপেক্ষার সময় =টার্নঅ্যারাউন্ড সময় – বিস্ফোরণের সময়
অগ্রাধিকার শিডিউলিং কি?
অগ্রাধিকার নির্ধারণে, প্রতিটি প্রক্রিয়া 0-10 পর্যন্ত অগ্রাধিকারের সাথে যুক্ত যেখানে, পূর্ণসংখ্যা 0 সর্বনিম্ন অগ্রাধিকারের প্রতিনিধিত্ব করে এবং 10 সর্বোচ্চ অগ্রাধিকারের প্রতিনিধিত্ব করে। অগ্রাধিকার দুটি উপায়ে সংজ্ঞায়িত করা যেতে পারে যেমন অভ্যন্তরীণ এবং বাহ্যিকভাবে। এছাড়াও, অগ্রাধিকারের সময়সূচী হয় অগ্রিম বা অপ্রত্যাশিত হতে পারে।
অগ্রাধিকারের সময়সূচীতে, নতুন আগত প্রক্রিয়ার অগ্রাধিকার যদি কার্যকরী প্রক্রিয়ার অগ্রাধিকারের চেয়ে বেশি হয় তবে শিডিউলার CPU-কে অগ্রাধিকার দেবে।
অপ্রত্যাশিত অগ্রাধিকার সময়সূচীতে, সময়সূচী প্রস্তুত সারির মাথায় নতুন প্রক্রিয়াটিকে সারিবদ্ধ করবে৷
অগ্রাধিকার শিডিউলিং অ্যালগরিদম ব্যবহার করার অসুবিধা অনির্দিষ্টকালের অবরোধ বা অনাহার। একটি কম অগ্রাধিকার প্রক্রিয়া থাকবে যারা উচ্চ অগ্রাধিকার প্রক্রিয়ার কারণে সম্পদের জন্য অনির্দিষ্টকালের জন্য অপেক্ষা করতে হতে পারে যা অনাহার সমস্যার দিকে পরিচালিত করবে।
উদাহরণ
ধরা যাক 4টি প্রসেস আছে P1, P2, P3 এবং P4 তাদের সংশ্লিষ্ট বিস্ফোরণের সময় এবং প্রতিটি প্রক্রিয়ার সাথে যুক্ত অগ্রাধিকার যেখানে 0 সর্বনিম্ন অগ্রাধিকার এবং 10 সর্বোচ্চ অগ্রাধিকার প্রতিনিধিত্ব করে।
প্রক্রিয়া | বার্স্ট টাইম | অগ্রাধিকার |
---|---|---|
P1 | 15 | 2 |
P2 | 13 | 0 |
P3 | 10 | 4 | ৷
P4 | 11 | 1 | ৷
নীচে দেওয়া গ্যান্ট চার্ট ব্যবহার করে একাধিক প্রক্রিয়া চালানোর ক্রম উপস্থাপন করা হবে
অ্যালগরিদম
Start Step 1-> Make a structure Process with variables pid, bt, priority Step 2-> In function bool compare(Process a, Process b) Return (a.priority > b.priority) Step 3-> In function waitingtime(Process pro[], int n, int wt[]) Set wt[0] = 0 Loop For i = 1 and i < n and i++ Set wt[i] = pro[i-1].bt + wt[i-1] End Step 4-> In function turnarround( Process pro[], int n, int wt[], int tat[]) Loop For i = 0 and i < n and i++ Set tat[i] = pro[i].bt + wt[i] End Loop Step 5-> In function avgtime(Process pro[], int n) Declare and initialize wt[n], tat[n], total_wt = 0, total_tat = 0 Call function waitingtime(pro, n, wt) Call function turnarround(pro, n, wt, tat) Print “Processes, Burst time, Waiting time, Turn around time" Loop For i=0 and i<n and i++ Set total_wt = total_wt + wt[i] total_tat = total_tat + tat[i] End Loop Print values of “Processes, Burst time, Waiting time, Turn around time" Print Average waiting time, Average turn around time Step 6-> In function scheduling(Process pro[], int n) Call function sort(pro, pro + n, compare) Loop For i = 0 and i < n and i++ Print the order. End Loop Call function avgtime(pro, n) Step 7-> In function int main() Declare and initialize Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}} Declare and initialize n = sizeof pro / sizeof pro[0] Call function scheduling(pro, n) Stop
উদাহরণ
#include<bits/stdc++.h> using namespace std; struct Process { int pid; // Process ID int bt; // CPU Burst time required int priority; // Priority of this process }; // sorting the Process acc. to the priority bool compare(Process a, Process b) { return (a.priority > b.priority); } void waitingtime(Process pro[], int n, int wt[]) { // Initial waiting time for a process is 0 wt[0] = 0; // calculating waiting time for (int i = 1; i < n ; i++ ) wt[i] = pro[i-1].bt + wt[i-1] ; } // Function to calculate turn around time void turnarround( Process pro[], int n, int wt[], int tat[]) { // calculating turnaround time by adding // bt[i] + wt[i] for (int i = 0; i < n ; i++) tat[i] = pro[i].bt + wt[i]; } //Function to calculate average time void avgtime(Process pro[], int n) { int wt[n], tat[n], total_wt = 0, total_tat = 0; //Function to find waiting time of all processes waitingtime(pro, n, wt); //Function to find turn around time for all processes turnarround(pro, n, wt, tat); //Display processes along with all details cout << "\nProcesses "<< " Burst time " << " Waiting time " << " Turn around time\n"; // Calculate total waiting time and total turn // around time 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 processes by priority 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); } // main function 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