大家可以参考以下内容,好好的去理解以下这两个操作系统的算法哦,第一次开始写文章,初衷就是想要记录下自己做过的一些东西,并且发布出来和大家一起讨论一起进步,如果可以的话,希望大家可以点点赞点点关注啊!!!
一、实验要求
1、 设计一个进程控制块PCB
包括:进程名、进程优先数、进程所占CPU时间、还需要CPU时间、进程状态、下一列指针
2、 建立进程就绪队列:要求按照不同调度算法建立就绪队列
3、 编制两个调度算法,进程数由用户从键盘输入
(1)时间片轮转法(时间片为2)
(2)优先数算法 (优先数高优先级高)
初始优先数 = 50 - 运行时间
每运行一次优先数减3。
二、数据结构设计说明
时间片轮转算法:num:进程数 s:时间片大小 name:进程名 cputime 为CPU已运行的时间单位数 needtime 为进程还需要运行的时间单位数 count为已经运行的轮数 round为被分配的时间片数量 state中R代表运行,W代表等待 process[100]表示一个进程的数组,里面包含相关的信息
优先数算法:name[10]:进程名 cputime:CPU已运行的时间单位数 needtime:进程还需要运行的时间单位数 count:已经运行的轮数 pri:进程优先数 state:进程状态 counter:进程个数 time:时间片大小 countf:执行完成个数
三、代码
1.时间片算法代码
#includeint num; int s; struct PCB{ int cputime; int needtime; int count; int round; int flag; int p; char Name[300]; char state[200]; }process[100]; void input(){ int i=0; printf("input name and needtime:"); printf("\nname\tneedtime"); printf("\n"); while(i<=num-1) { scanf("%s %d",process[i].Name,&process[i].needtime); i++; } } int count() { int a=0,i; for (i=0;i<=num-1;i++) { if (process[i].p==0) { a+=1; } } return a; } void start(){ int i=0; for (i=0;i<=num-1;i++) { process[i].cputime=0; process[i].count=0; process[i].round=s; process[i].p=1; strcpy(process[i].state,"W"); } strcpy(process[0].state,"R"); } void flag(){ if (process[0].p==1) { if (process[0].needtime-s<=0) { process[0].cputime=process[0].cputime+process[0].needtime; process[0].needtime=0; process[0].p=0; process[0].count++; strcpy(process[0].state,"F"); } else { process[0].cputime=process[0].cputime+s; process[0].needtime=process[0].needtime-s; process[0].count++; strcpy(process[0].state,"W"); } } else { strcpy(process[0].state,"F"); } } void exchange_1() { int i=0,j=0,r=0,x; int k,l,y,m; char c[50],b[50]; r=count(); for(i=0;i<=num-2-r;i++) { if (r==num-1) { break; } k=process[i].cputime; process[i].cputime=process[i+1].cputime; process[i+1].cputime=k; l=process[i].needtime; process[i].needtime=process[i+1].needtime; process[i+1].needtime=l; y=process[i].count; process[i].count=process[i+1].count; process[i+1].count=y; m=process[i].p; process[i].p=process[i+1].p; process[i+1].p=m; strcpy(c,process[i].Name); strcpy(process[i].Name,process[i+1].Name); strcpy(process[i+1].Name,c); strcpy(b,process[i].state); strcpy(process[i].state,process[i+1].state); strcpy(process[i+1].state,b); } } void exchange_2() { int i=0,j=0,r=0,x; int k,l,y,m; char c[50],b[50]; r=count(); if (process[num-1-r].p==0&&r>=1&&r<=num-1) { for (i=num-1-r;i 0;i--) { printf("%s",process[num-i].Name); } } void main() { printf("请输入进程数:"); scanf("%d",&num); printf("请输入时间片:"); scanf("%d",&s); int x=0; input(); start(); while(x!=num) { output(); flag(); x=count(); exchange_1(); exchange_2(); } output(); }
2.优先数算法代码
#include#include #include #define MAX 200 struct PCB//用结构体来表示进程控制块PCB { char name[10];//进程名 int cputime;//CPU已运行的时间单位数 int needtime;//进程还需要运行的时间单位数 int count;//已经运行的轮数 int pri;//进程优先数 char state;//进程状态 }; struct PCB task[MAX];//定义结构体数组 int counter;//进程个数 int time;//时间片大小 int countf=0;//执行完成个数 void putin();//输入进程个数、时间片大小、进程 void process();//进程处理函数 void putout();//输出函数 void change1();//进程轮换函数1(将已经运行完的进程置底) void change2();//根据进程优先数再对进程顺序进行一个轮换 int main() { int i; putin(); while(1) { if(countf==counter) break; else process(); } putout(); system("pause"); return 0; } void putin() { int i=0; printf("input the number of tasks:"); scanf("%d",&counter); printf("input the time:"); scanf("%d",&time); printf("input name and needtime:\n"); for(i=0;i time) { task[i].needtime-=time; task[i].count++; task[i].cputime+=time; task[i].pri-=3; task[i].state='W'; change1(); } else { task[i].cputime+=task[i].needtime; task[i].needtime=0; task[i].count++; //task[i].pri-=3; task[i].state='F'; change1(); countf++; } } void putout() { printf("\nName cputime needtime count pri state\n"); int i=0; for(i=0;i =0;i--) { if(task[i].state=='F') printf("%s ",task[i].name); } printf("\n"); }