操作系統原理與實驗——實驗三優先級進程調度

實驗指南

運行環境:

Dev c++

算法思想:?

本實驗是模擬進程調度中的優先級算法,在先來先服務算法的基礎上,只需對就緒隊列到達時間進行一次排序。第一個到達的進程首先進入CPU,將其從就緒隊列中出隊后。若此后隊首的進程的到達時間大于上一個進程的完成時間,則該進程進入CPU,其開始時間即到達時間;否則如果上一個進程完成后,已經有多個進程到達,則需從已到達的進程中尋找到優先級最高的進程,并將其取出,進入CPU執行。直到所有進程執行完畢。

核心數據結構:

typedef struct data{

????? int hour;

????? int minute;

}time;

typedef struct node{

?????

????? int id;//進程編號

????? char name[20];//進程名

????? int good;//優先級

????? time arrive;//到達就緒隊列的時間

????? int zx;//執行時間

????? time start;//開始執行時間

????? time finish;//執行完成時間

????? int zz;//周轉時間=執行完成時間-到達就緒隊列時間

????? float zzxs;//帶權周轉時間=周轉時間/執行時間

????? struct node* next;

?????

}Node;

typedef struct Queue{

?????

????? Node* front = NULL;

????? Node* tail = NULL;

?????

}Queue;

程序主體框架:

#include <iostream>

#include <stdio.h>

#include <malloc.h>

#include <string.h>

using namespace std;

typedef struct data{

??? int hour;

??? int minute;

}time;

typedef struct node{

???

??? int id;//進程編號

??? char name[20];//進程名

??? int good;//優先級

??? time arrive;//到達就緒隊列的時間

??? int zx;//執行時間

??? time start;//開始執行時間

??? time finish;//執行完成時間

??? int zz;//周轉時間=執行完成時間-到達就緒隊列時間

??? float zzxs;//帶權周轉時間=周轉時間/執行時間

??? struct node* next;

???

}Node;

typedef struct Queue{

???

??? Node* front = NULL;

??? Node* tail = NULL;

???

}Queue;

Queue* init(){

???

??? Queue* p = (Queue*)malloc(sizeof(Queue));

??? p->front = NULL;

??? p->tail = NULL;

??? return p;

???

}

//函數名:timecompare()????????? 參數:tt 當前時間, p 進程到達時間

bool timecompare(time tt,time p){//tt<p(時間沒到) false??? tt >= p true

??? //函數功能:比較進程到達時間和當前時間,若小于則返回false,否則返回true

???

}

//函數名:timecompare2()????????? 參數:tt 當前時間, p 進程到達時間

bool timecompare2(time tt,time p){//tt<=p(時間沒到) false??? tt > p true

??? //函數功能:比較進程到達時間和當前時間,若小于等于則返回false,否則返回true

???

}

//函數名:Levelcompare()????????? 參數:p,q 進程

bool Levelcompare(Node* p,Node* q){

??? //函數功能:比較p,q的優先級,p的優先級高則返回true,低則返回false,否則比較到達時間,p先或同時到達則返回true,反之則false

???

}

//函數名:LevelSorted()????????? 參數:que 進程隊列指針

void LevelSorted(Queue* que){

//函數功能:對進程隊列按優先級排序

???

}

//函數名:ComputeTime()??? 參數:tt 當前時間的指針,q 當前進程的指針

time ComputeTime(time* tt,Node* q){

???

//函數功能:更新當前時間和進程的各項時間

??????????

}

//函數名:priority()??? 參數:que進程隊列指針,tt當前時間 n 進程數

Queue* priority(Queue *que,time tt,int n){

???

//函數功能:進行優先級進程調度,并同時更新當前時間。

???

}

//函數名:Print()??? 參數:que進程隊列指針, n 進程數

void Print(Queue* que,int n){

??? //函數功能:打印輸出進程優先進程調度結果

???

}

//函數名:ScanIn()??? 參數:wait進程隊列指針, n 進程數

time ScanIn(Queue* wait,int n){

???

??? //函數功能:輸入進程信息,返回最早的進程到達時間

??????????

}

int main(){

???

??? Queue* wait;

??? wait = init();

??? int flag,n;

??? time earlytime;

???

??? while(1){

?????? printf("請輸入操作:(1:開始進程;0:結束進程):");

?????? scanf("%d",&flag);

?????? if(flag == 0){

?????????? printf("\n操作結束!\n");

?????????? break;

?????? }

?????? else{

?????????? printf("請輸入進程數量:");

?????????? scanf("%d",&n);

?????????? earlytime = ScanIn(wait,n);

??????????

?????????? LevelSorted(wait);

?????????? wait = priority(wait,earlytime,n);

?????????? Print(wait,n);

?????????? wait = init();

??????????

?????? }

??? }

???

??? return 0;

}

????

測試數據

/*

1001 p1 1 9:40 20
1004 p4 4 10:10 10
1005 p5 3 10:05 30
1002 p2 3 9:55 15
1003 p3 2 9:45 25

*/

/*

5001 p1 1 14:40 20
5002 p4 2 10:10 10
5003 p5 3 10:05 30
5004 p2 4 9:55 15
5005 p3 5 9:45 25
5006 p6 6 10:40 20
5007 p8 7 11:10 10?
5008 p9 8 12:05 30
5009 p10 9 13:55 15
5010 p7 10 7:15 15

*/

關鍵代碼

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
using namespace std;typedef struct data{int hour;int minute;
}time;typedef struct node{int id;//進程編號 char name[20];//進程名 int good;//優先級 time arrive;//到達就緒隊列的時間 int zx;//執行時間 time start;//開始執行時間 time finish;//執行完成時間 int zz;//周轉時間=執行完成時間-到達就緒隊列時間 float zzxs;//帶權周轉時間=周轉時間/執行時間 struct node* next;}Node;typedef struct Queue{Node* front = NULL;Node* tail = NULL;}Queue;
void Print(Queue* que,int n);
Queue* init(){Queue* p = (Queue*)malloc(sizeof(Queue));p->front = NULL;p->tail = NULL;return p;} 
//函數名:timecompare()          參數:tt 當前時間, p 進程到達時間
bool timecompare(time tt,time p){//tt<p(時間沒到) false    tt >= p true //函數功能:比較進程到達時間和當前時間,若小于則返回false,否則返回true if((tt.hour<p.hour)||((tt.hour==p.hour)&&(tt.minute<p.minute)))return false;elsereturn true;
}
//函數名:timecompare2()          參數:tt 當前時間, p 進程到達時間
bool timecompare2(time tt,time p){//tt<=p(時間沒到) false    tt > p true //函數功能:比較進程到達時間和當前時間,若小于等于則返回false,否則返回trueif((tt.hour<p.hour)||((tt.hour==p.hour)&&(tt.minute<p.minute||tt.minute==p.minute)))return false;elsereturn true;
}
//函數名:Levelcompare()          參數:p,q 進程
bool Levelcompare(Node* p,Node* q){//函數功能:比較p,q的優先級,p的優先級高則返回true,低則返回false,否則比較到達時間,p先或同時到達則返回true,反之則falseif(p->good>q->good)return true;else if(p->good<q->good)return false;else{if((p->arrive.hour<q->arrive.hour)||(p->arrive.hour==q->arrive.hour&&p->arrive.minute<=q->arrive.minute))return true;elsereturn false;}}
//函數名:LevelSorted()          參數:que 進程隊列指針
void LevelSorted(Queue* que){//函數功能:對進程隊列按優先級排序	Node *bl,*head=NULL,*pre=NULL,*q=NULL,*p,*c;bl=que->front;while(bl!=NULL){Node *p=(Node *)malloc(sizeof(Node));*p=*bl;//重點:指針的應用 p->next=NULL;if(head==NULL){head=p;q=p;}else{q=head;pre=NULL;while(q!=NULL){if(Levelcompare(p,head)){p->next=head;head=p;q=head;break;}else if(!Levelcompare(p,q)&&q->next==NULL){q->next=p;break;}else if(Levelcompare(p,q)){p->next=q;pre->next=p;break;}pre=q;q=q->next;}}bl=bl->next;}que->front=head;que->tail=pre;}//函數名:ComputeTime()    參數:tt 當前時間的指針,q 當前進程的指針
time ComputeTime(time* tt,Node* q){//函數功能:更新當前時間和進程的各項時間q->start.hour=tt->hour;q->start.minute=tt->minute;q->finish.minute=(q->start.minute+q->zx)%60;q->finish.hour=q->start.hour+(q->start.minute+q->zx)/60;q->zz=q->finish.hour*60+q->finish.minute-q->arrive.hour*60-q->arrive.minute;q->zzxs=q->zz*1.0/q->zx;tt->hour=q->finish.hour;tt->minute=q->finish.minute;}
//函數名:priority()    參數:que進程隊列指針,tt當前時間 n 進程數
Queue* priority(Queue *que,time tt,int n){//函數功能:進行優先級進程調度,并同時更新當前時間。
int count=n;Node *pre=NULL,*p=NULL,*head=NULL,*q=NULL,*Head;Head=que->front;p=Head;while(1){if((p->arrive.hour==tt.hour)&&(p->arrive.minute==tt.minute)){break;}pre=p;p=p->next;}	Node *N=(Node *)malloc(sizeof(Node));*N=*p;N->next=NULL;head=N;q=head;if(p==Head){Head=Head->next;free(p);count--;}else{pre->next=p->next;free(p);count--;}ComputeTime(&tt,N);while(count){p=Head;pre=NULL;while(p!=NULL){if(timecompare2(tt,p->arrive)==true)//提前到達 {Node *N=(Node *)malloc(sizeof(Node));*N=*p;N->next=NULL;q->next=N;q=q->next;if(p==Head){Head=Head->next;free(p);count--;}else{pre->next=p->next;free(p);count--;}ComputeTime(&tt,N);break;}pre=p;p=p->next;}if(p==NULL)//按到達時間先后 {Node *l,*r;l=Head;r=Head;while(r!=NULL){if(timecompare2(l->arrive,r->arrive)){l=r;}r=r->next;}//找到最小到達時間 tt.hour=l->arrive.hour;tt.minute=l->arrive.minute;Node *N=(Node *)malloc(sizeof(Node));*N=*l;N->next=NULL;q->next=N;q=q->next;pre=Head;if(l==Head){Head=Head->next;free(l);count--;}else{while(pre->next!=l){pre=pre->next;}pre->next=l->next;free(l);count--;}ComputeTime(&tt,N);}}que->front=head;return que;
}
//函數名:Print()    參數:que進程隊列指針, n 進程數
void Print(Queue* que,int n){//函數功能:打印輸出進程優先進程調度結果float pz=0,px=0;Node *p;p=que->front;printf("模擬進程優先進程調度過程輸出結果\n  id號    名字\t優先級\t到達時間  執行時間(分鐘)\t開始時間\t完成時間  周轉時間(分鐘)  帶權周轉系數\n"); while(p!=NULL){printf("%6d %6s %6d %6d:%02d %10d %17d:%02d %12d:%02d %10d(分鐘) %12.2f\n",p->id,p->name,p->good,p->arrive.hour,p->arrive.minute,p->zx,p->start.hour,p->start.minute,p->finish.hour,p->finish.minute,p->zz,p->zzxs);pz=pz+p->zz;px=px+p->zzxs;p=p->next;} printf("系統平均周轉時間為:\t\t\t\t\t\t\t\t\t%.2f\n",pz/n);printf("系統平均帶權周轉系數為:        \t\t\t\t\t\t\t\t\t\t%.2f\n",px/n);
}
//函數名:ScanIn()    參數:wait進程隊列指針, n 進程數
time ScanIn(Queue* wait,int n){//函數功能:輸入進程信息,返回最早的進程到達時間int count; count=n;time N;Node *q;q=wait->tail;printf("請輸入進程的參數:\nid號 名字 優先級 到達時間 執行時間(分鐘):\n");while(count--){Node *p=(Node *)malloc(sizeof(Node));p->next=NULL;scanf("%d %s %d %d:%d %d",&p->id,&p->name,&p->good,&p->arrive.hour,&p->arrive.minute,&p->zx);if(wait->front==NULL&&wait->tail==NULL){wait->front=p;q=p;N.hour=p->arrive.hour;N.minute=p->arrive.minute;}else{q->next=p;q=p;wait->tail=p;if((p->arrive.hour<N.hour)||((p->arrive.hour==N.hour)&&(p->arrive.minute<N.minute))){N.hour=p->arrive.hour;N.minute=p->arrive.minute;}}}return N;
}int main(){Queue* wait;wait = init();int flag,n;time earlytime;while(1){printf("請輸入操作:(1:開始進程;0:結束進程):");scanf("%d",&flag);if(flag == 0){printf("\n操作結束!\n");break; } else{printf("請輸入進程數量:");scanf("%d",&n);earlytime = ScanIn(wait,n);//函數功能:輸入進程信息,返回最早的進程到達時間LevelSorted(wait);//函數功能:對進程隊列按優先級排序wait = priority(wait,earlytime,n);//函數功能:進行優先級進程調度,并同時更新當前時間。Print(wait,n);//函數功能:打印輸出進程優先進程調度結果wait = init();}}return 0;}

運行結果

實驗總結

1、在開始實驗之前必須有正確的設計思路

2、理解了優先級的進程調度,當時間和優先級沖突時,首先考慮優先級

3、如果有兩個Node *p,q;則p=q和*p=*q的含義是不同的,前者表示兩者指向同一個結點,后者表示賦值

4、單鏈表的創建和應用還不是很熟練,還得多加練習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多租戶 TransmittableThreadLocal 線程安全問題

在一個多租戶項目中&#xff0c;用戶登錄時,會在自定義請求頭攔截器AsyncHandlerInterceptor將該用戶的userId,cstNo等用戶信息設置到TransmittableThreadLocal中,在后續代碼中使用.代碼如下: HeaderInterceptor 請求頭攔截器 public class HeaderInterceptor implements Asyn…

阿里云國際云服務器全局流量分析功能詳細介紹

進行全局流量分析時&#xff0c;內網DNS解析會作為一個整體模塊&#xff0c;其他模塊的邊緣虛框顏色會置灰&#xff0c;示意作為一個整體進行全局分析&#xff0c;左側Region可以展開/匯總&#xff0c;也可以單獨選中某個Region模塊進行分析&#xff08;這時其他Region的流量線…

【Java面試題】Redis的用途

以下是一些常見的用途 1.緩存 Redis 可以用作緩存系統&#xff0c;&#xff0c;將頻繁訪問的數據存儲在內存中&#xff0c;從而加快數據訪問速度&#xff0c;減少對數據庫的訪問壓力。 2.消息隊列 Redis 支持發布/訂閱模式和列表數據結構&#xff0c;可以用作消息隊列系統的…

道可云元宇宙每日資訊|廈門首個元宇宙辦稅大廳啟用

道可云元宇宙每日簡報&#xff08;2024年3月1日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 中國軍號元宇宙發布會即將舉行 近日&#xff0c;解放軍新聞傳播中心中國軍號即將正式上線。中國軍號元宇宙發布會也將在“云端”與您見面。全方位展現解放軍新聞傳播…

加密與安全_探索簽名算法

文章目錄 概述應用常用數字簽名算法CodeDSA簽名ECDSA簽名小結 概述 在非對稱加密中&#xff0c;使用私鑰加密、公鑰解密確實是可行的&#xff0c;而且有著特定的應用場景&#xff0c;即數字簽名。 數字簽名的主要目的是確保消息的完整性、真實性和不可否認性。通過使用私鑰加…

云服務器購買教程

在購買云服務器之前&#xff0c;建議仔細評估自身需求和預算&#xff0c;并與多個云服務提供商進行比較&#xff0c;以確保選擇到最適合的解決方案。購買云服務器的具體步驟可能因所選云服務提供商而異。以下以實際操作的方式介紹如何購買一款云服務器。 云服務器購買常見問題…

【數倉】zookeeper軟件安裝及集群配置

相關文章 【數倉】基本概念、知識普及、核心技術【數倉】數據分層概念以及相關邏輯【數倉】Hadoop軟件安裝及使用&#xff08;集群配置&#xff09;【數倉】Hadoop集群配置常用參數說明 一、環境準備 準備3臺虛擬機 Hadoop131&#xff1a;192.168.56.131Hadoop132&#xff…

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之基于類型的轉換器 一、自定義轉換二、轉換器消歧(Disambiguation)三、基于類型的轉換器3.1 寫轉換3.2 讀轉換3.3 注冊轉換器 一、自定義轉換 下面的Spring Converter實現示例將String對象轉換為自定義Email值對象: R…

藍橋杯_定時器的綜合應用實例

一 工程 代碼 在單片機訓練平臺上&#xff0c;利用定時器T0&#xff0c;數碼管模塊和2個獨立按鍵&#xff08;J5的2&#xff0c;3短接&#xff09;&#xff0c;設計一個秒表&#xff0c;具有清零&#xff0c;暫停&#xff0c;啟動功能。 顯示模式&#xff1a;分-秒-0.05秒&…

Linux進程——信號詳解(上)

文章目錄 信號入門生活角度的信號技術應用角度的信號用kill -l命令可以察看系統定義的信號列表信號處理常見方式概述 產生信號通過鍵盤進行信號的產生&#xff0c;ctrlc向前臺發送2號信號通過系統調用異常軟件條件 信號入門 生活角度的信號 你在網上買了很多件商品&#xff0…

前端面試練習24.3.2-3.3

HTMLCSS部分 一.說一說HTML的語義化 在我看來&#xff0c;它的語義化其實是為了便于機器來看的&#xff0c;當然&#xff0c;程序員在使用語義化標簽時也可以使得代碼更加易讀&#xff0c;對于用戶來說&#xff0c;這樣有利于構建良好的網頁結構&#xff0c;可以在優化用戶體…

vue3項目中如何一個vue組件中的一個div里面的圖片鋪滿整個屏幕樣式如何設置

在Vue 3項目中&#xff0c;要使一個div內的圖片鋪滿整個屏幕&#xff0c;你需要確保幾個關鍵點&#xff1a;div元素和圖片元素的樣式設置正確&#xff0c;以及確保它們能夠覆蓋整個視口&#xff08;viewport&#xff09;。以下是一個簡單的步驟和代碼示例&#xff0c;幫助你實現…

代碼隨想錄算法訓練營第四八天 | 買股票

目錄 只買賣一次可買賣多次 LeetCode 121. 買賣股票的最佳時機 LeetCode 122. 買賣股票的最佳時機II 只買賣一次 給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某…

瀏覽器輸入URL到頁面渲染經歷了哪些過程?

瀏覽器輸入URL到頁面渲染的過程可以分為以下幾個步驟&#xff1a; 解析URL&#xff1a;當用戶在瀏覽器的地址欄輸入URL后&#xff0c;瀏覽器會首先解析這個URL&#xff0c;判斷其是否合法。查找緩存&#xff1a;瀏覽器會查看自己的緩存&#xff0c;判斷是否有之前訪問過的這個U…

論文閱讀--Diffusion Models for Reinforcement Learning: A Survey

一、論文概述 本文主要內容是關于在強化學習中應用擴散模型的綜述。文章首先介紹了強化學習面臨的挑戰&#xff0c;以及擴散模型如何解決這些挑戰。接著介紹了擴散模型的基礎知識和在強化學習中的應用方法。然后討論了擴散模型在強化學習中的不同角色&#xff0c;并對其在多個…

【JavaSE】實用類——String、日期等

目錄 String類常用方法String類的equals()方法String中equals()源碼展示 “”和equals()有什么區別呢&#xff1f; StringBuffer類常用構造方法常用方法代碼示例 面試題&#xff1a;String類、StringBuffer類和StringBuilder類的區別&#xff1f;日期類Date類Calendar類代碼示例…

leetcode169. 多數元素的四種解法

leetcode169. 多數元素 題目描述 給定一個大小為 n 的數組 nums &#xff0c;返回其中的多數元素。多數元素是指在數組中出現次數 大于? n/2 ? 的元素。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 1.哈希 class Solution { public:int majority…

【vue3】命令式組件封裝,message封裝示例;(函數式組件?)

僅做代碼示例&#xff1b;當然改進的地方還是不少的&#xff0c;僅作為該類組件封裝方式的初步啟發&#xff1b; 理想大成肯定是想要像 餓了么 這些組件庫一樣。 有的人叫這函數式組件&#xff0c;有的人叫這命令式組件&#xff0c;我個人還是偏向于命令式組件的稱呼。因為以vu…

Django配置靜態文件

Django配置靜態文件 目錄 Django配置靜態文件靜態文件配置調用方法 一般我們將html文件都放在默認templates目錄下 靜態文件放在static目錄下 static目錄大致分為 js文件夾css文件夾img文件夾plugins文件夾 在瀏覽器輸入url能夠看到對應的靜態資源&#xff0c;如果看不到說明…

向爬蟲而生---Redis 探究篇4<Redis主從復制(2)>

前言: 繼續上一篇向爬蟲而生---Redis 探究篇4&#xff1c;Redis主從復制(1)&#xff1e;-CSDN博客 正文: 讀寫操作和一致性保證 主節點和從節點對讀寫操作的不同處理方式 在Redis主從復制中&#xff0c;主節點和從節點對讀寫操作有不同的處理方式&#xff1a; 主節點&…