搶佔式優先權調度演算法是什麼意思
系統把處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要又出現了另一個其優先權更高的進程,進程調度程序就立即停止當前進程(原優先權最高的進程)的執行,重新將處理機分配給新到的優先權最高的進程。
本教學操作環境:windows7系統、C 17版本、Dell G3電腦。
搶佔式優先權調度演算法
在這種方式下,系統把處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要又出現了另一個其優先權更高的進程,進程調度程序就立即停止當前進程(原優先權最高的進程)的執行,重新將處理機分配給新到的優先權最高的進程。因此,在採用此調度演算法時,是每當系統中出現一個新的就緒流程i 時,就將其優先權Pi與正在執行的流程j 的優先權Pj進行比較。如果Pi≤Pj,原進程Pj便繼續執行;但如果是Pi>Pj,則立即停止Pj的執行,做進程切換,使i 進程投入執行。顯然,這種搶佔式的優先權調度演算法能更好地滿足緊迫作業的要求,故而常用於要求比較嚴格的即時系統中,以及對效能要求較高的批次和分時系統中。
具體程式碼:
#include <iostream>#include <string>#include <vector>using namespace std;using std::cout;struct PCB { // 进程名 string name; // 到达时间 int arrivetime; // 运行时间 int runtime; // 仍需运行时间 int resttime; // 开始时间 int starttime; // 完成时间 int endtime; // 运行次数 int runcount; // 周转时间 int zhouzhuangtime; // 带权周转时间(周转时间/运行时间) double weightzhouzhuangtime; // 优先级(静态) int priority; PCB *next; };// 进程数int num_process;// 记录所有进程的总时间int totaltime;// 记录所有进程的总带权周转时间double weighttotaltime; PCB *createPCB() { int i; // 定义队首、队尾 PCB *head, *rear; // 初始化 head = rear = NULL; // 临时指针变量 PCB *p; cout<<"请输入进程数量:"; cin>>num_process; for(i = 0; i < num_process; i++) { // 初始化一个空间给进程 p = new PCB; cout<<"请依次输入第"<<i+1<<"个进程的信息(进程名、优先级、到达时间、运行时间):"<<endl; cin>>p->name>>p->priority>>p->arrivetime>>p->runtime; p->resttime = p->runtime; p->runcount = 1; totaltime += p->runtime; p->starttime = 0; p->endtime = 0; p->zhouzhuangtime = 0; p->weightzhouzhuangtime = 0; p->next = NULL; // 存入链表中 if(rear == NULL) { head = p; rear = p; } else { rear->next = p; rear = p; } } return head; }// 链表插入排序PCB *insertSort(PCB *head) { /* 1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点; 2、从待定节点中取节点,插入到有序链表中相应位置; 3、实际上只有一条链表,在排序中,实际只增加了一个用于指向剩下需要排序节点的头指针。 */ PCB *first;// 为原链表剩下用于直接插入排序的节点头指针 PCB *t; // 临时指针变量:要插入的节点 PCB *p; // 临时指针变量:要插入的位置 PCB *q; // 临时指针变量:指向原链表 first = head->next; head->next = NULL; // 只含有一个节点的链表的有序链表 while(first != NULL) // 遍历剩下的无序链表 { // 无序节点在有序链表中找插入位置p for(t = first, q = head; (q != NULL) && (q->arrivetime < t->arrivetime); p = q, q = q->next); // 无序链表中的节点离开,以便插入到有序链表中 first = first->next; if(q == head)// 插入在第一个节点之前 { head = t; } else// p是q的前驱 { p->next = t; } t->next = q;// 完成插入动作 } return head; }// 获取当前时间段内的进程数量int getCurrentNumOfProcess(PCB *head, int time) { int count = 0; PCB *t;// 临时指针变量,指向链表 t = head; while(t != NULL && t->arrivetime <= time) { count++; t = t->next; } return count; }// 删除当前节点PCB* deletePCB(PCB *head, PCB *t) { PCB *p, *q; p = head; q = p->next; // 删除节点是头节点 if(t == head) { head = head->next; } else { while(q != t)// 跳出循环之后q为该节点,p为前一节点 { p = p->next; q = p->next; } if(t->next == NULL)// 删除节点是尾节点 p->next = NULL; else p->next = q->next; } // 删除 free(t); return head; }// 在头节点后的count个节点中选择优先数最大的返回PCB *findMaxPriority(PCB *head, int count) { int max; PCB *p, *q, *f; q = head; max = q->priority; f = q; while(count > 0) { if(q->priority > max) { max = q->priority; f = q; } count--; q =q->next; } return f; }/* 输出a时间内的特定输出格式,当某一时间段内没有进程工作时,进程名称为0 进程名称.进程工作时间,进程与进程间以|分隔 输入:1 3 2 8 2 2 1 7 3 6 3 12 输出:[0.1|2.1|1.1|3.12|1.7|2.6|0.172] */void print(vector<PCB> vec_output, int a) { for(int i = 0; i < vec_output.size(); i++) { cout<<"******************************************"<<endl; cout<<"进程名:"<<vec_output[i].name<<endl; cout<<"到达时间:"<<vec_output[i].arrivetime<<endl; cout<<"开始运行时间: "<<vec_output[i].starttime<<endl; cout<<"结束运行时间: "<<vec_output[i].endtime<<endl; cout<<"此次运行时间:"<<vec_output[i].endtime - vec_output[i].starttime<<endl; cout<<"******************************************"<<endl; cout<<endl; cout<<endl; } // 输出周转时间信息,只有进程结束了才输出 int i; for(i = 0; i < vec_output.size()-1; i++) { bool flag = true; for(int j = i+1; j < vec_output.size(); j++) { if(vec_output[j].name == vec_output[i].name) { flag = false; break; } } if(flag) { cout<<"进程"<<vec_output[i].name<<"的周转时间为:"<<vec_output[i].zhouzhuangtime<<endl; cout<<"进程"<<vec_output[i].name<<"的带权周转时间为: "<<vec_output[i].weightzhouzhuangtime<<endl; cout<<endl; cout<<endl; } } cout<<"进程"<<vec_output[i].name<<"的周转时间为:"<<vec_output[i].zhouzhuangtime<<endl; cout<<"进程"<<vec_output[i].name<<"的带权周转时间为: "<<vec_output[i].weightzhouzhuangtime<<endl; cout<<endl; cout<<endl; // 输出平均周转时间信息 cout<<"平均周转时间:"<<totaltime/(double)num_process<<endl; cout<<"平均带权周转时间:"<<weighttotaltime/(double)num_process<<endl; cout<<endl; cout<<endl; cout<<a<<"个时间单位内的执行顺序为:"<<endl; cout<<"["; if(vec_output[0].starttime > 0) { cout<<"0."<<vec_output[0].starttime<<"|"; } if(vec_output[vec_output.size() - 1].endtime < a) { for(int i = 0; i < vec_output.size(); i++) { cout<<vec_output[i].name<<"."<<vec_output[i].endtime - vec_output[i].starttime<<"|"; // 补全从开始到结束之间没有进程运行项 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) { cout<<"0."<<vec_output[i+1].starttime - vec_output[i].endtime<<"|"; } } cout<<"0."<<a-vec_output[vec_output.size()-1].endtime<<"]"<<endl; } else if(vec_output[vec_output.size() - 1].endtime == a) { for(int i = 0; i < vec_output.size()-1; i++) { cout<<vec_output[i].name<<"."<<vec_output[i].endtime - vec_output[i].starttime<<"|"; // 补全从开始到结束之间没有进程运行项 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) { cout<<"0."<<vec_output[i+1].starttime - vec_output[i].endtime<<"|"; } } cout<<vec_output[vec_output.size()-1].name<<"."<<vec_output[vec_output.size()-1].endtime - vec_output[vec_output.size()-1].starttime<<"]"<<endl; } else { for(int i = 0; i < vec_output.size(); i++) { if(vec_output[i].endtime <= a) { cout<<vec_output[i].name<<"."<<vec_output[i].endtime - vec_output[i].starttime<<"|"; // 补全从开始到结束之间没有进程运行项 if(i+1 < vec_output.size() && vec_output[i].endtime != vec_output[i+1].starttime) { cout<<"0."<<vec_output[i+1].starttime - vec_output[i].endtime<<"|"; } } else { cout<<vec_output[i].name<<"."<<a - vec_output[i].starttime<<"]"<<endl; return; } } } }void PCB_MAIN(PCB *head) { head = insertSort(head); int time = 0;// 模拟时间变量 int count;// 当前时间内运行的进程数量 PCB *q; vector<PCB> vec_out;//输出 PCB temp; while(head != NULL) { count = getCurrentNumOfProcess(head, time); if(count == 0) time++; else { /************************************************************************/ /* 抢占式 */ /************************************************************************/ // 找出优先数最大的线程 q = findMaxPriority(head, count); if(q->runcount == 1)// 该进程第一次运行 { q->starttime = time; // 输出信息 temp = *q; temp.endtime = 0; temp.next = NULL; if(vec_out.size() != 0 && vec_out[vec_out.size()-1].endtime == 0) { vec_out[vec_out.size()-1].endtime = temp.starttime; } vec_out.push_back(temp); } ++time; ++q->runcount; --q->resttime; if(q->resttime == 0)// 该进程运行结束 { // 记录结束时间 q->endtime = time; // 计算周转时间 q->zhouzhuangtime = time - q->arrivetime; // 计算带权周转时间 q->weightzhouzhuangtime = q->zhouzhuangtime/(double)q->runtime; weighttotaltime += q->weightzhouzhuangtime; // 输出信息 temp = *q; temp.starttime = 0; temp.next = NULL; if(vec_out[vec_out.size()-1].name == temp.name) { vec_out[vec_out.size()-1].endtime = temp.endtime; vec_out[vec_out.size()-1].zhouzhuangtime = temp.zhouzhuangtime; vec_out[vec_out.size()-1].weightzhouzhuangtime = temp.weightzhouzhuangtime; } else { temp.starttime = vec_out[vec_out.size()-1].endtime; vec_out.push_back(temp); } // 删除该进程 //deletePCB(q); head = deletePCB(head, q); } } } // 输出200时间单位内的执行顺序 print(vec_out, 200); }int main() { PCB *head = NULL; head = createPCB(); PCB_MAIN(head); return 0; }
輸出實例
輸入:
輸出:
推薦教學:《C#》
以上是搶佔式優先權調度演算法是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。
