日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

模拟进程调度

發(fā)布時(shí)間:2023/12/13 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟进程调度 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

功能

data.h

#ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define OK 1 #define ERROR 0 #define TimeSlice 1 #define Infinity 10 //INT_MAX#define NAME_MAXSIZE 20 typedef enum {Ready,Running,Block }ProState;typedef enum {FCFS, SPF //先來先服務(wù),短進(jìn)程優(yōu)先 }PriorityRule;typedef struct {char Name[NAME_MAXSIZE]; //進(jìn)程名int Priority; //優(yōu)先數(shù)int ArrivalTime; //到達(dá)時(shí)間 以時(shí)間片為單位int NeedRunningTime; //運(yùn)行時(shí)間 以時(shí)間片為單位int StartTime; //開始執(zhí)行時(shí)間int FinishTime; //完成時(shí)間int TimeUsedCPU; //已用CPU時(shí)間 以時(shí)間片為單位ProState ProcessState; //進(jìn)程狀態(tài) }PCB;typedef struct Node {ElemType data;struct Node * Next; }LNode,*LinkList;#endif

?ChainList.h

#ifndef _ChainList_h_ #define _ChainList_h_#include "Data.h"//功能:鏈表初始化 Status Init(LinkList *L);//功能:賦值運(yùn)算,將e2賦值給e1 void Assignment(ElemType *e1, ElemType e2);//功能:獲取第i個(gè)結(jié)點(diǎn)元素 Status GetElemt_L(LinkList L,int i,ElemType *e);//功能:鏈表根據(jù)優(yōu)先級(jí)插入元素 Status ListInsert_L(LinkList L,ElemType e);//功能:鏈表刪除頭結(jié)點(diǎn) Status ListDelete_L(LinkList L,ElemType *e);#endif

ProPCB.h

#ifndef _ProPCB_h_ #define _ProPCB_h_#include "ChainList.h"//功能:將e插入鏈表Q Status GetProcess(LinkList Q,ElemType e); //上就緒隊(duì)列//功能:根據(jù)不同的優(yōu)先級(jí)規(guī)則,返回優(yōu)先數(shù) int GetPriority(ElemType *e, PriorityRule PR); //根據(jù)不同的規(guī)則PR 設(shè)置優(yōu)先數(shù)//功能:將鏈表Q的頭結(jié)點(diǎn)數(shù)據(jù)放到e指向的內(nèi)存,并刪除 Status OutProsess(LinkList Q,ElemType *e); //下就緒隊(duì)列//功能:CPU運(yùn)行pcb指向的進(jìn)程,并輸出所有進(jìn)行進(jìn)程狀態(tài) Status CPURunPro(LinkList Q, PCB *pcb); //CPU運(yùn)行PCB//功能:打印所有PCB信息 void PrintProQueue(LinkList Q, PCB *pcb); //打印運(yùn)行后PCB信息//功能:當(dāng)一個(gè)進(jìn)程結(jié)束,打印進(jìn)程信息 void PrintProResult(PCB *pcb);#endif

實(shí)現(xiàn)

#include "ChainList.h"extern int CPUUsedTime;//功能:鏈表初始化 Status Init(LinkList *L) {*L = (LinkList)malloc(sizeof(LNode));(*L)->data.NeedRunningTime = -1;(*L)->Next = NULL;return OK; }//功能:賦值運(yùn)算,將e2賦值給e1 void Assignment(ElemType *e1, ElemType e2) {e1->ArrivalTime = e2.ArrivalTime;strcpy(e1->Name,e2.Name);e1->Priority = e2.Priority;e1->ProcessState = e2.ProcessState;e1->FinishTime = e2.FinishTime;e1->StartTime = e2.StartTime;e1->NeedRunningTime = e2.NeedRunningTime;e1->TimeUsedCPU = e2.TimeUsedCPU; }//鏈表中按照優(yōu)先級(jí):從大到小排序插入 Status ListInsert_L(LinkList L,ElemType e) //這樣修改應(yīng)該不對(duì) p = *L出錯(cuò) {LinkList p = L->Next, pre = L, s;while (p && e.Priority <= p->data.Priority) {pre = p;p = p->Next;}s = (LinkList)malloc(sizeof(LNode));Assignment(&s->data, e);s->Next = pre->Next;pre->Next = s;return OK; } //鏈表中頭部刪除 Status ListDelete_L(LinkList L,ElemType *e) {LinkList p = L, q;q = p->Next;if(!q)return ERROR;p->Next = q->Next;Assignment(e, q->data);free(q);return OK; } #include "ProPCB.h"extern int CPUUsedTime;//功能:將e插入鏈表Q Status GetProcess(LinkList Q,ElemType e) {return ListInsert_L(Q, e); }//功能:根據(jù)不同的優(yōu)先級(jí)規(guī)則,返回優(yōu)先數(shù) int GetPriority(ElemType *e, PriorityRule PR) {if(PR == FCFS)return Infinity - e->ArrivalTime;else if(PR == SPF)return Infinity - e->NeedRunningTime;elseprintf("GetPriority Function ERROR!\n");return ERROR; }//功能:將鏈表Q的頭結(jié)點(diǎn)數(shù)據(jù)放到e指向的內(nèi)存,并刪除 Status OutProsess(LinkList Q,ElemType *e) {return ListDelete_L(Q ,e); }//上一次CPU運(yùn)行時(shí)間增加1個(gè)時(shí)間片 Status CPURunPro(LinkList Q,PCB *pcb) {if(pcb->StartTime == -1)pcb->StartTime = CPUUsedTime;pcb->ProcessState = Running;//PrintProQueue(Q, pcb);pcb->TimeUsedCPU += TimeSlice;return OK; }//功能:打印所有PCB信息 void PrintProQueue(LinkList Q, PCB *pcb) {LinkList p = Q->Next;printf("進(jìn)程名 優(yōu)先數(shù) 到達(dá)時(shí)間 運(yùn)行時(shí)間 已用CPU時(shí)間 完成時(shí)間 進(jìn)程狀態(tài)\n");if(pcb)printf(" %4s %2d %4d %4d %3d(+1) %3d %4s \n",pcb->Name,pcb->Priority,pcb->ArrivalTime,pcb->NeedRunningTime,pcb->TimeUsedCPU, pcb->FinishTime,pcb->ProcessState == Ready ? "就緒" : "運(yùn)行");while (p){printf(" %4s %2d %4d %4d %3d %3d %4s \n",p->data.Name,p->data.Priority,p->data.ArrivalTime,p->data.NeedRunningTime,p->data.TimeUsedCPU,p->data.FinishTime, p->data.ProcessState == Ready ? "就緒" : "運(yùn)行");p = p->Next;}printf("-------------------------------------------------------------------------------\n"); }//功能:當(dāng)一個(gè)進(jìn)程結(jié)束,打印進(jìn)程信息 void PrintProResult(PCB *pcb) {printf("進(jìn)程名 到達(dá)時(shí)刻 運(yùn)行時(shí)間 開始時(shí)刻 完成時(shí)刻 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間 進(jìn)程狀態(tài)\n");if(pcb)printf(" %2s %3d %4d %4d %3d %4d %5.2lf %4s \n",pcb->Name,pcb->ArrivalTime,pcb->NeedRunningTime,pcb->StartTime,pcb->FinishTime,pcb->FinishTime-pcb->ArrivalTime,((pcb->FinishTime - pcb->ArrivalTime)*1.0)/pcb->NeedRunningTime,"完成");printf("-------------------------------------------------------------------------------\n"); }

main:

#include "ProPCB.h"/**************************** * 實(shí)驗(yàn)01: 非搶占式靜態(tài)優(yōu)先權(quán) * * ① 優(yōu)先權(quán)始終保持不變 * * ② 一旦進(jìn)入CPU便運(yùn)行到結(jié)束 * * ③ FCFS只考慮到達(dá)時(shí)間進(jìn)CPU * * ④ SPF認(rèn)為到達(dá)時(shí)間相同 * ****************************/int CPUUsedTime = 0;void InputData(LinkList * pPCBdata, PriorityRule PR) {ElemType e = {{0},-1,-1,-1,-1,-1,0,Ready};e.ArrivalTime = 0;e.ProcessState = Ready;e.TimeUsedCPU = 0;strcpy(e.Name,"A");e.NeedRunningTime = 1;e.Priority = GetPriority(&e, PR);if(PR == SPF) e.ArrivalTime = 0;GetProcess(*pPCBdata,e);e.ArrivalTime = 1;e.ProcessState = Ready;e.TimeUsedCPU = 0;strcpy(e.Name,"B");e.NeedRunningTime = 100;e.Priority = GetPriority(&e, PR);if(PR == SPF) e.ArrivalTime = 0;GetProcess(*pPCBdata,e);e.ArrivalTime = 2;e.ProcessState = Ready;e.TimeUsedCPU = 0;strcpy(e.Name,"C");e.NeedRunningTime = 1;e.Priority = GetPriority(&e, PR);if(PR == SPF) e.ArrivalTime = 0;GetProcess(*pPCBdata,e);e.ArrivalTime = 3;e.ProcessState = Ready;e.TimeUsedCPU = 0;strcpy(e.Name,"D");e.NeedRunningTime = 100;e.Priority = GetPriority(&e, PR);if(PR == SPF) e.ArrivalTime = 0;GetProcess(*pPCBdata,e);}//void InputData1(LinkList * pPCBdata, PriorityRule PR) //{ // ElemType e = {{0},-1,-1,-1,-1,-1,0,Ready}; // e.ArrivalTime = 0; // e.ProcessState = Ready; // e.TimeUsedCPU = 0; // strcpy(e.Name,"A"); // e.NeedRunningTime = 4; // e.Priority = GetPriority(&e, PR); // if(PR == SPF) e.ArrivalTime = 0; // GetProcess(*pPCBdata,e); // // e.ArrivalTime = 1; // e.ProcessState = Ready; // e.TimeUsedCPU = 0; // strcpy(e.Name,"B"); // e.NeedRunningTime = 3; // e.Priority = GetPriority(&e, PR); // if(PR == SPF) e.ArrivalTime = 0; // GetProcess(*pPCBdata,e); // // e.ArrivalTime = 2; // e.ProcessState = Ready; // e.TimeUsedCPU = 0; // strcpy(e.Name,"C"); // e.NeedRunningTime = 5; // e.Priority = GetPriority(&e, PR); // if(PR == SPF) e.ArrivalTime = 0; // GetProcess(*pPCBdata,e); // // e.ArrivalTime = 3; // e.ProcessState = Ready; // e.TimeUsedCPU = 0; // strcpy(e.Name,"D"); // e.NeedRunningTime = 2; // e.Priority = GetPriority(&e, PR); // if(PR == SPF) e.ArrivalTime = 0; // GetProcess(*pPCBdata,e); // // e.ArrivalTime = 4; // e.ProcessState = Ready; // e.TimeUsedCPU = 0; // strcpy(e.Name,"E"); // e.NeedRunningTime = 4; // e.Priority = GetPriority(&e, PR); // if(PR == SPF) e.ArrivalTime = 0; // GetProcess(*pPCBdata,e); //}int main(void) {LinkList PCBQueue; //InitPCBdata里面存放PCB初始數(shù)據(jù)ElemType e = {{0},-1,-1,-1,-1,-1,0,Ready};ElemType *pcb = NULL;PriorityRule PR;PR = FCFS; // SPF or FCFS//*********** 初始化就緒隊(duì)列 *************//Init(&PCBQueue);InputData(&PCBQueue, PR);printf("初始數(shù)據(jù)如下:\n");PrintProQueue(PCBQueue, pcb);//*********** 進(jìn)程根據(jù)優(yōu)先級(jí)上CPU *************//printf("\n進(jìn)程運(yùn)行信息如下:\n");while (OutProsess(PCBQueue, &e)){//一次性運(yùn)行完畢while(e.TimeUsedCPU < e.NeedRunningTime) //上完CPU的進(jìn)程是否完畢{CPURunPro(PCBQueue, &e); //上CPU++CPUUsedTime; //CPU時(shí)間增加}//*********** 當(dāng)進(jìn)程執(zhí)行完畢時(shí)打印輸出 *************//e.FinishTime = CPUUsedTime;PrintProResult(&e);}getchar();return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的模拟进程调度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。