计算机操作系统课程设计源代码《通用处理机调度演示程序源代码》

合集下载

计算机操作系统课程设计源代码《处理机调度算法的实现源代码》

计算机操作系统课程设计源代码《处理机调度算法的实现源代码》

《处理机调度算法的实现》源代码#include "stdio.h"#include <stdlib.h>#include "time.h"#include <math.h>typedef struct{int id;int reach;float service;int prior;int finish;float turnover;float cum_turnover;}process;process p[20];int sort[20];int wait[20];int n;int alltime=0;char c;void in(){printf("请输入要建立的进程数:\n");scanf("%d",&n);int i;int j;int temp;srand(time(0));for(i=0;i<n;i++){printf("\n进程%d号:\n",i);printf("进程uid:");scanf("%d",&p[i].id);p[i].reach=rand()%10+1;printf("到达时间:%d\n",p[i].reach);p[i].service=rand()%10+1;printf("服务时间:%f\n",p[i].service);if(c=='c'){p[i].prior=rand()%10+1;printf("优先权:%d\n",p[i].prior);}else p[i].prior=0;p[i].finish=0;p[i].turnover=p[i].service;p[i].cum_turnover=p[i].prior;sort[i]=i;alltime=alltime+p[i].service;}for(i=1;i<n;i++){for(j=0;j<n-1;j++){if(p[sort[j]].reach>p[sort[j+1]].reach){temp=sort[j];sort[j]=sort[j+1];sort[j+1]=temp;}}}alltime=alltime+p[sort[0]].reach;}void out(){int i;if(c=='c'){printf("进程uid\t到达时间\t服务时间\t优先权\t完成时间\t周转时间\t带权周转时间\n");for(i=0;i<n;i++)printf("%d\t%d\t\t%f\t%d\t%d\t\t%f\t%f\n",p[i].id,p[i].reach,p[i].service,p[i].prior,p[i].finish,p[i].turnover,p[i].cum_turnover );}else {printf("进程uid\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");for(i=0;i<n;i++)printf("%d\t%d\t\t%f\t%d\t\t%f\t%f\n",p[i].id,p[i].reach,p[i].service,p[i].finish,p[i].turnover,p[i].cum_turnover);}}void timeslice(){int q;int i;int j;int front=-1;int rear=-1;int t=1;int v;printf("\n请输入时间片:\n");scanf("%d",&q);for(i=0;i<alltime;i++){for(j=0;j<n;j++){if((i==p[sort[j]].reach-1)&&(front!=(rear+1)%20)){rear=(rear+1)%20;wait[rear]=sort[j];sort[j]=-1;}}if((front!=rear)||(front>-1)){if(t==1){front=(front+1)%20;v=wait[front];}if(t<=q){p[v].turnover--;if(p[v].turnover==0){t=0;p[v].finish=i+2;p[v].turnover=p[v].finish-p[v].reach;p[v].cum_turnover=p[v].turnover/p[v].service;if(front==rear){front=-1;rear=-1;}}if((t==q)&&(p[v].turnover!=0)){rear=(rear+1)%20;wait[rear]=v;t=0;}t++;}}}}//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//短作业优先void sjf(){int top=-1;//作用于wait[]int i;int j;int k;int l;int temp;int v=-1;//处理机正在进行处理的进程号for(i=0;i<=alltime;i++){for(j=0;j<n;j++){//将到达的进程放进等待栈if((i==p[sort[j]].reach-1)&&(top<19)){top++;wait[top]=sort[j];for(k=1;k<=top;k++){//将等待栈按进程服务时间从大到小进行排列for(l=0;l<top;l++){if(p[wait[l]].service<p[wait[l+1]].service){temp=wait[l];wait[l]=wait[l+1];wait[l+1]=temp;}//相同服务时间的先到达的先处理if(p[wait[l]].service==p[wait[l+1]].service){if(p[wait[l]].reach < p[wait[l+1]].reach){temp=wait[l];wait[l]=wait[l+1];wait[l+1]=temp;}}}}}}if((v==-1)&&(top>=0)){//出栈一个进程v=wait[top];top--;}if(v>-1){//处理机运行,服务时间自减、这里的"turnover"指的是服务时间p[v].turnover--;if(p[v].turnover==0){p[v].finish=i+2;p[v].turnover=p[v].finish-p[v].reach;p[v].cum_turnover=p[v].turnover/p[v].service;v=-1;}}}} //动态优先级void fpf(){int top=-1;//作用于wait[]int i,j,k,l,temp;int v=-1;//处理机正在进去处理的进程号for(i=0;i<=alltime;i++){//优先权加1if((i>0)&&(top>-1)){for(j=0;j<=top;j++){p[wait[j]].cum_turnover++;}}for(j=0;j<n;j++){//将到达的进程放进等待栈if((i==p[sort[j]].reach-1)&&(top<19)){top++;wait[top]=sort[j];for(k=1;k<=top;k++){//将等待栈按进程优先权从小到大进行排列for(l=0;l<top;l++){if(p[wait[l]].cum_turnover>p[wait[l+1]].cum_turnover){temp=wait[l];wait[l]=wait[l+1];wait[l+1]=temp;}//相同优先权的先到达的先处理if(p[wait[l]].cum_turnover==p[wait[l+1]].cum_turnover){if(p[wait[l]].reach < p[wait[l+1]].reach){temp=wait[l];wait[l]=wait[l+1];wait[l+1]=temp;}}}}}}if((v==-1)&&(top>=0)){//出栈一个进程v=wait[top];top--;}if(v>-1){//处理机运行,服务时间自检,这里的"turnver"指的是服务时间p[v].turnover--;if(p[v].turnover==0){p[v].finish=i+2;p[v].turnover=p[v].finish-p[v].reach;p[v].cum_turnover=p[v].turnover/p[v].service;v=-1;}}}}//主函数int main(){while(1){printf("\n\n请选择调度算法\na:时间片轮法\nb:短作业优先\nc:动态优先级\n");scanf("%s",&c);in();switch(c){case 'a':timeslice();break;case 'b':sjf();break;case 'c':fpf();break;}out();}return 0;}。

处理机调度课程设计模板 操作系统

处理机调度课程设计模板 操作系统
七、参考文献
八、指导教师评语
签名:
年月日
课程设计成绩
附:1、课程设计的填写请按格式要求做;
2、文字内容宋体、五号、1.5倍行距;
3、程序代码字体Times New Roman,五号、1.5倍行距;
《操作系统》课程设计
处理机调度问题实践
系院:计算机科学系
学生姓名:xxxxxxx
学号:xxxxxxxxxxxx
专业:xxxxxxxxxxxx
年级:xxxxxxx
完成日期:xxxx年xx月
指导教师:刘栓
一、课程设计的性质与任务
1、加深对多道程序并发概念的理解,通过编程模拟处理机调度的流程。
2、培养学生能够独立进行知识综合,独立开发较大程序的能力。
2、根据单处理机,多任务的问题特性做好软件实现的需求分析。
3、可根据问题的实际需要,可选择进程数量。
4、当系统运行时,能直观地、动态地反映当前处理机状态及各进程执行的状况。
5、要求在系统安全状态的前提下,兼顾各个进程的公平。
三、课程设计的时间安排
课程设计总时间:8学时
四、课程设计的实验环境
硬件环境:CPU Intel(R) Core™2 Duo E4600 2.40GHz,内存DDR2 1.00GB,
3、培养提高学生软件开发能力和软件的调试技术。
4、培养学生开发大型程序的方法和相互合作的ቤተ መጻሕፍቲ ባይዱ神。
5、培养学生的创新意识。
6、培养学生的算法设计和算法分析能力。
7、培养学生对问题进行文字论述和文字表达的能力。
二、课程设计的内容及其要求
1、可利用先来先服务、短作业优先、响应比高者优先、多级反馈队列模型、时间片轮转法等,来实现处理机的调度。

操作系统进程调度算法代码

操作系统进程调度算法代码

操作系统进程调度算法代码操作系统进程调度算法代码介绍在计算机系统中,进程是指正在执行的程序实例。

当系统中有多个进程需要运行时,操作系统需要对它们进行调度,以保证资源的合理利用和系统的高效运行。

进程调度算法是操作系统中非常重要的一部分,它决定了进程之间的优先级、时间片大小等关键参数,直接影响到系统的性能和用户体验。

本文将介绍常见的几种进程调度算法,并给出相应的代码实现。

1. 先来先服务(FCFS)先来先服务(First-Come, First-Served)是最简单、最直接的进程调度算法。

按照提交时间顺序为进程分配CPU时间片,即先到达CPU请求者先获得CPU使用权。

代码实现:```void FCFS(ProcessList list) {int time = 0; // 当前时间for (int i = 0; i < list.size(); i++) {Process p = list.get(i);p.waitTime = time - p.arrivalTime; // 计算等待时间time += p.burstTime;p.turnaroundTime = time - p.arrivalTime; // 计算周转时间}}```2. 短作业优先(SJF)短作业优先(Shortest Job First)是一种基于作业长度的非抢占式进程调度算法。

按照作业长度为进程分配CPU时间片,即短作业先执行。

代码实现:```void SJF(ProcessList list) {int time = 0; // 当前时间while (!list.isEmpty()) {Process p = list.getShortestJob(); // 获取最短作业p.waitTime = time - p.arrivalTime; // 计算等待时间time += p.burstTime;p.turnaroundTime = time - p.arrivalTime; // 计算周转时间 list.remove(p); // 从列表中删除已经完成的进程}}```3. 高响应比优先(HRRN)高响应比优先(Highest Response Ratio Next)是一种基于响应比的非抢占式进程调度算法。

操作系统源代码

操作系统源代码
return;
}
free_table[t].address=S;
free_table[t].length=L;
free_table[t].sign=1;
}
return;
}//释放内存函数结束
int main( )
{
int i,select;
cin>>task;
reclaim(task);
break;
case 3:
//输出内存空闲表和内存分配表
cout<<endl;
cout<<" ★内存空闲表情况★"<<endl;
cout<<" 起始地址 空间长度 标志"<<endl;
struct
{
float address; //空闲表起始地址
float length; //空闲表长度,单位为字节
int sign; //空闲表登记栏标志,用"0"表示空栏目,用"1"表示未分配
}free_table[m]; //空闲表
struct
{
float address; //分配表起始地址
for(i=0;i<m;i++)
cout<<setw(10)<<free_table[i].address<<setw(10)<<free_table[i].length<<setw(7)<<free_table[i].sign<<endl;
cout<<" ★内存分配表情况★:"<<endl;

操作系统课程设计文档及代码

操作系统课程设计文档及代码

1 设计目的与内容1.1 设计目的通过课程设计, 加深对操作系统对程序执行的理解,掌握操作系统的多程序运行原理,能模拟操作系统设计相应的进程调度算法,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。

1.2 设计内容1、设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。

2、建立进程就绪队列。

对两种不同算法编制入链子程序。

3、编制两种进程调度算法:1)可强占的优先进程调度;2)循环时间片轮转调度4、设计操作系统运行的指令。

2 设计说明2.1 需求分析设计虚拟内核实现进程的调度,实现多道程序的调度。

设计调度算法计算各个进程的优先权限来确定进程执行的次序。

进程调度程序选择一个就绪状态的进程,使之在处理器上运行。

进程的调度采用最高优先数优先的调度算法和先来先服务调度算法相结合的算法,并且采用动态优先数策略,选择进程占用处理器后该进程仅能使用一个时间片,运行完后优先数减1。

2.2 设计思路本程序用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。

为了便于处理,程序中的某进程运行时间以时间片为单位计算。

各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

在优先数算法中,优先数的值为31与运行时间的差值。

进程每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。

设计程序指令,MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。

SUB n //从累加器A的值减去整数n,结果送到累加器A。

MUL n //从累加器A的值乘以整数n,结果送到累加器A。

计算机操作系统课程设计源代码《通用处理机调度演示程序源代码》

计算机操作系统课程设计源代码《通用处理机调度演示程序源代码》

《通用处理机调度演示程序源代码》//短作业优先算法#define MaxNum 100#include <stdio.h>#include <stdlib.h>#include <string.h>struct Process_struct{int Number; //进程编号char Name[MaxNum]; //进程名称int ArrivalTime; //到达时间int ServiceTime; //开始运行时间int FinishTime; //运行结束时间int WholeTime; //运行时间int run_flag; //调度标志int order; //运行次序double WeightWholeTime; //周转时间double AverageWT_FCFS,AverageWT_SJF; //平均周转时间double AverageWWT_FCFS,AverageWWT_SJF; //平均带权周转时间}Process[MaxNum];int N; //实际进程个数int SJF(); //短作业优先int SJF(){ //短作业优先算法int temp_time=0; //当期那时间int i=0,j;int number_schedul,temp_counter; //进程编号,当前已执行进程个数float run_time;run_time=Process[i].WholeTime;j=1;while((j<N)&&(Process[i].ArrivalTime==Process[j].ArrivalTime)) //判断是否有两个进程同时到达{if(Process[j].WholeTime<Process[i].WholeTime){run_time=Process[i].WholeTime;i=j;}j++;}//查找下一个被调度的进程//对找到的下一个被调度的进程求相应的参数number_schedul=i;Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTim e;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime +Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;Process[number_schedul].order=1;temp_counter=1;while(temp_counter<N){for(j=0;j<N;j++){if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag)){run_time=Process[j].WholeTime;number_schedul=j;break;}}for(j=0;j<N;j++){if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag))if(Process[j].WholeTime<run_time){run_time=Process[j].WholeTime;number_schedul=j;}}//查找下一个被调度的进程//对找到的下一个被调度的进程求相应的参数Process[number_schedul].ServiceTime=temp_time;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime +Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;temp_counter++;Process[number_schedul].order=temp_counter;}return 0;}int Pinput(); //进程参数输入int Poutput(); //调度结果输出int Pinput() //进程参数输入{int i;printf("请输入进程个数:\n");scanf("%d",&N);for(i=0;i<N;i++){printf("----------------------------------------\n");printf("请输入一个进程:\n",i+1);printf("请输入进程名称:\n");scanf("%s",Process[i].Name);printf("请输入到达时间:\n");scanf("%d",&Process[i].ArrivalTime);printf("请输入服务时间:\n");scanf("%d",&Process[i].WholeTime);Process[i].ServiceTime=0;Process[i].FinishTime=0;Process[i].WeightWholeTime=0;Process[i].order=0;Process[i].run_flag=0;}return 0;}int Poutput() //调度结果输出{int i;float turn_round_time=0,f1,w=0;printf(" 进程名称到达时间运行时间开始运行时间结束时间执行顺序周转时间带权周转时间\n");for(i=0;i<N;i++){Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;f1=Process[i].WeightWholeTime/Process[i].WholeTime;turn_round_time+=Process[i].WeightWholeTime;w+=f1;printf("时刻%d :",Process[i].ServiceTime,Process[i].Name);printf(" %s %d %d %d %d %d %f %f\n",Process[i].Name,Process[i].ArrivalTime,Process[i].WholeTime,Process[i].Ser viceTime,Process[i].FinishTime,Process[i].order,Process[i].WeightWholeTime,f1);}printf("average_turn_round_timer=%f\n",turn_round_time/N);printf("weight_average_turn_round_timer=%f\n",w/N);return 0;}//时间片轮转算法typedef struct node{char name[20];int round;int cputime;int arrivetime;int needtime;char state;int count;struct node *next;}PCB;PCB *ready=NULL,*run1=NULL,*finish=NULL; int num,i;void GetFirst();void Output();void InsertTime(PCB *in);void InsertFinish(PCB *in);void TimeCreate();void RoundRun();void GetFirst() /*取得第一个就绪队列节点*/ {run1 = ready;if(ready!=NULL){run1 ->state = 'R';ready = ready ->next;run1 ->next = NULL;}void Output() /*输出队列信息*/{PCB *p;p = ready;printf("进程名\tcpu时间\t需要时间\t进程状态\t计数器\n");while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}p = run1;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}}void InsertTime(PCB *in) /*将进程插入到就绪队列尾部*/{PCB *fst;fst = ready;if(ready == NULL){in->next = ready;ready = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/ {PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void TimeCreate() /*时间片输入函数*/{PCB *tmp;int i;printf("输入进程名字到达时间进程所需时间时间片大小:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s %d %d %d",tmp->name,&(tmp->arrivetime),&(tmp->needtime),&(tmp ->round));getchar();tmp ->cputime = 0;tmp ->state ='W';// tmp->prio=0;tmp ->count = 0;InsertTime(tmp);}}void RoundRun() /*时间片轮转调度算法*/{int flag = 1;GetFirst();while(run1 != NULL){Output();while(flag){run1->cputime++ ;run1->needtime--;run1->count++;if(run1->needtime == 0){run1 ->state = 'F';InsertFinish(run1);flag = 0;}else if(run1->count == run1->round){run1->state = 'W';run1->count=0;InsertTime(run1);flag = 0;}}flag = 1;GetFirst();}}//先来先服务算法typedef struct PCB //定义进程控制块{char ID[3]; //进程号char name[10]; //进程名char state; //运行状态int arrivetime; //到达时间int starttime; //进程开始时间int finishtime; //进程结束时间int servicetime; //服务时间float turnaroundtime;//周转时间float weightedturnaroundtime;//带权周转时间struct PCB *next; //指向下个进程}pcb;int time; //计时器int n; //进程个数pcb *head1=NULL,*p,*q; //进程链表指针void run_fcfs(pcb *p1) //运行未完成的进程{time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);time+=p1->servicetime;p1->state='T';p1->finishtime=time;p1->turnaroundtime=p1->finishtime-p1->arrivetime;p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime; printf("ID 到达时间开始时间服务时间完成时间周转时间带权周转时间\n"); printf("%s%6d%10d%10d%8d%10.1f%10.2f\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime, p1->turnaroundtime,p1->weightedturnaroundtime);}void fcfs() //找到当前未完成的进程{int i,j;p=head1;for(i=0;i<n;i++){if(p->state=='F'){q=p; //标记当前未完成的进程run_fcfs(q);}p=p->next;}}void getInfo() //获得进程信息并创建进程{int num;printf("\n作业个数:");scanf("%d",&n);for(num=0;num<n;num++){p=(pcb *)malloc(sizeof(pcb));printf("依次输入:\nID 进程名到达时间服务时间\n");scanf("%s\t%s\t%d\t%d",&p->ID,&p->name,&p->arrivetime,&p->servicetime); if(head1==NULL) {head1=p;q=p;time=p->arrivetime;}if(p->arrivetime < time) time=p->arrivetime;q->next=p;p->starttime=0;p->finishtime=0;p->turnaroundtime=0;p->weightedturnaroundtime=0;p->next=NULL;p->state='F';q=p;}}//静态优先权优先算法int SequenceNumber=1; //进程编号int ProcessAmount; //进程数量int StartCount=0; //调入内存进程计数struct PCB1{ //进程控制块int No; //进程号char name[16]; //进程名int enterMemoryTime;//进入内存时间int serviceTime; //服务时间int priority; //优先级struct PCB1 *next;};struct PCB1 *head,*thisP,*newP; //动态接收进程及详细struct PCB1 *readyHead; //动态存储就绪队列//函数声明int getch();int timeOfData(FILE *);void ListAllPCB();void Menu();void printPCB(struct PCB1 *,int,int,int,double);void printPCBP(struct PCB1 *);void printField();void printFieldP();void release(struct PCB1 *);void releaseR(struct PCB1 *);void setNewPCB(char *,int,int,int);struct PCB1 * runTheProcess();void newPCB(){ //建立PCBnewP=(struct PCB1 *)malloc(sizeof(struct PCB1));if(head==NULL){ //判断头节点是否为空head=newP; //为空,头节点指向新开辟的内存}else{thisP=head;while(thisP->next!=NULL){thisP=thisP->next;}thisP->next=newP; //遍历单链表,找到最后一个元素}thisP=newP;thisP->No=SequenceNumber;SequenceNumber++;printf("进程号%d\n",thisP->No);printf("输入进程名:");scanf("%s",thisP->name);printf("输入优先级:");scanf("%d",&thisP->priority);printf("输入进入内存时间:");scanf("%d",&thisP->enterMemoryTime);printf("输入服务时间:");scanf("%d",&thisP->serviceTime);thisP->next=NULL;}void buildProcess(){ //创建进程int i=0;printf("输入进程数量:");scanf("%d",&ProcessAmount);while(i<ProcessAmount){newPCB();i++;}}void readyList(struct PCB1 *pcb){ //单链表的形式创建就绪队列newP=(struct PCB1 *)malloc(sizeof(struct PCB1));if(readyHead==NULL){readyHead=newP;}else{thisP=readyHead;while(thisP->next!=NULL){thisP=thisP->next;}thisP->next=newP;}thisP=newP;strcpy(thisP->name,pcb->name);thisP->No=pcb->No;thisP->priority=pcb->priority;thisP->enterMemoryTime=pcb->enterMemoryTime;thisP->serviceTime=pcb->serviceTime;thisP->next=NULL;}struct PCB1 * callMemory(){ //调入内存,返回调入内存的链表节点int at; //到达时间struct PCB1 *markP;if(head==NULL){printf("程序没有找到。

操作系统-课程设计报告-处理机调度程序

操作系统-课程设计报告-处理机调度程序

操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:1200002111班内序号:27成绩:日期:2015年1月6日一、设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。

也就是说能运行的进程数大于处理机个数。

为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。

要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。

二、设计要求1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。

2)可选择进程数量3)本程序包括三种算法,用C语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。

三、设计思路及算法思想1.界面菜单选项一级菜单提供2个选项:①自动生成进程数量②手动输入所需进程数量一级菜单选择完毕后进入二级菜单:①重新生成进程②时间片轮转法③短作业优先算法④动态优先级算法⑤退出程序2.调度算法程序所用PCB结构体需要用到的进程结构体如上图所示1)时间片轮转法主要是设置一个当前时间变量,curTime和时间片roundTime。

遍历进程组的时候,每运行一个进程,就把curTime += roundTime。

进程已运行时间加roundTime2)短作业优先算法遍历进程组,找到未运行完成并且运行时间最短的进程,让它一次运行完成,如此往复,直到所有进程都运行完成为止。

3)动态优先级算法做法跟短作业优先算法类似,此处主要是比较进程的优先数,优先级高者,先执行。

直到全部执行完毕。

当一个进程运行完毕后,适当增减其余进程的优先数,以达到动态调成优先级的效果。

3.程序流程图四、运行截图1)启动后输入5,生成5个进程2)输入1,选择时间片轮转法。

自动输出结果,分别是时间片为1和4的结果3)输入2,选择短作业优先算法4)输入3,选择动态优先级算法5)输入0,重新生成进程,再输入3,生成3个进程,选择2.短作业优先算法6)输入q,退出五、心得体会通过这次实验,让我对操作系统的进程调度有了更进一步的了解。

操作系统进程调度用java 写的源代码

操作系统进程调度用java 写的源代码

操作系统进程调度用java 写的源代码package tc;public class Begin{public static void main(String[] args) {new MyFrame();}}package tc;import java.awt.BorderLayout; import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList;import java.util.Iterator;import java.util.Vector;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class MyFrame extends JFrame{int minx = 0;int n;String m;String s;ArrayList<Running> list1 = new ArrayList(); ArrayList<Running> list2 = new ArrayList(); Vector<String> v = new Vector();JPanel jp = new JPanel();JPanel jp1 = new JPanel();JPanel jp2 = new JPanel();JPanel jp3 = new JPanel();JPanel jp4 = new JPanel();JPanel jp5 = new JPanel();JTextArea area1 = new JTextArea(); JTextArea area2 = new JTextArea();JList list = new JList();static JTextField jt1 = new JTextField(5); static JTextField jt2 = new JTextField(5); static JTextField jt3 = new JTextField(5); JTextField jt4 = new JTextField(); JTextField jt5 = new JTextField(); JTextField jt6 = new JTextField();JLabel jl1 = new JLabel("进程名", 0); JLabel jl2 = new JLabel("id", 0);JLabel jl3 = new JLabel("优先数", 0); JButton jb1 = new JButton("就绪"); JButton jb2 = new JButton("优先数轮转法"); JButton jb3 = new JButton("阻塞"); JButton jb4 = new JButton("唤醒"); JButton jb5 = new JButton("创建"); JButton jb6 = new JButton("先来先服务"); JButton jb7 = new JButton("撤销(就绪)"); JButton jb8 = new JButton("撤销(阻塞)");JScrollPane js1 = new JScrollPane(this.list, 22, 30);Toolkit kit = Toolkit.getDefaultToolkit();private final int x = 0;private final int y = 0;private final int width = this.kit.getScreenSize().width / 3 * 2; private final int height = this.kit.getScreenSize().height / 5 * 4;public MyFrame(){super("进程管理系统");setBounds(0, 0, this.width, this.height);add(this.jp1, "Center");this.jp1.setLayout(new GridLayout(2, 2, 20, 0));this.jp1.add(this.jp2);this.jp1.add(this.jp3);this.jp1.add(this.jp4);this.jp1.add(this.jp);this.jp2.setLayout(new BorderLayout());this.jp2.add(this.jt4, "North");this.jt4.setText("进程名\tid\t优先数");this.jt4.setEditable(false);this.jp2.add(this.area1);this.area1.setEditable(false);this.jp3.setLayout(new BorderLayout());this.jp3.add(this.jt5, "North");this.jt5.setText("进程名\tid\t优先数");this.jt5.setEditable(false);this.jp3.add(this.list);this.jp4.setLayout(new BorderLayout());this.jp4.add(this.jt6, "North");this.jt6.setText("进程名\tid\t优先数");this.jt6.setEditable(false);this.jp4.add(this.area2);this.jp.add(this.jb2);this.jp.add(this.jb6);this.jp.add(this.jb3);this.jp.add(this.jb4);this.jp.add(this.jb8);this.jp.setLayout(new FlowLayout());this.jb8.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {String a = (String)MyFrame.this.list.getSelectedValue();MyFrame.this.v.remove(a);MyFrame.this.list.setListData(MyFrame.this.v);}});this.jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){Iterator it2 = MyFrame.this.list2.iterator();if (!it2.hasNext()){int min = 1000;Running r = new Running(1, 1, "a", "b");Iterator it = MyFrame.this.list1.iterator();while (it.hasNext()) {Running re = (Running)it.next();if (re.number <= min){min = re.number;r = re;}}MyFrame.this.list2.add(r);MyFrame.this.area2.append(r.getRecord());MyFrame.this.list1.remove(r);MyFrame.this.area1.setText(null);Iterator it1 = MyFrame.this.list1.iterator();while (it1.hasNext()) {Running re = (Running)it1.next();MyFrame.this.area1.append(re.getRecord());MyFrame.this.area1.append("\n");}}}});this.jb6.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {Iterator it2 = MyFrame.this.list2.iterator();if (!it2.hasNext()){int min = 1000;Running r = new Running(1, 1, "a", "b");Iterator it = MyFrame.this.list1.iterator();while (it.hasNext()) {Running re = (Running)it.next();if (re.i <= min){min = re.i;r = re;}}MyFrame.this.list2.add(r);MyFrame.this.area2.append(r.getRecord());MyFrame.this.list1.remove(r);MyFrame.this.area1.setText(null);Iterator it1 = MyFrame.this.list1.iterator();while (it1.hasNext()) {Running re = (Running)it1.next();MyFrame.this.area1.append(re.getRecord());MyFrame.this.area1.append("\n");}}}});this.jb3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {Iterator it3 = MyFrame.this.list2.iterator();Iterator aa = MyFrame.this.list1.iterator();while ((it3.hasNext() & aa.hasNext())){Running runn = (Running)it3.next();MyFrame.this.v.addElement(runn.getRecord());MyFrame.this.list.setListData(MyFrame.this.v);MyFrame.this.list.setVisibleRowCount(10);MyFrame.this.list2.remove(runn);MyFrame.this.area2.setText(null);Iterator it2 = MyFrame.this.list2.iterator();if (!it2.hasNext()){int min = 1000;Running r = new Running(1, 1, "a", "b");Iterator it = MyFrame.this.list1.iterator();while (it.hasNext()) {Running re = (Running)it.next();if (re.number <= min){min = re.number;r = re;}}MyFrame.this.list2.add(r);MyFrame.this.area2.append(r.getRecord());MyFrame.this.list1.remove(r);MyFrame.this.area1.setText(null);Iterator it1 = MyFrame.this.list1.iterator();while (it1.hasNext()) {Running re = (Running)it1.next();MyFrame.this.area1.append(re.getRecord());MyFrame.this.area1.append("\n");}}}}});this.jb4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String a = (String)MyFrame.this.list.getSelectedValue();MyFrame.this.v.remove(a);MyFrame.this.list.setListData(MyFrame.this.v);Running rr = new Running(MyFrame.this.minx++, Xchange.getThirdString(a), Xchange.getFirstString(a), Xchange.getSecondString(a));MyFrame.this.list1.add(rr);MyFrame.this.area1.setText(null);Iterator it = MyFrame.this.list1.iterator();while (it.hasNext()) {Running re = (Running)it.next();MyFrame.this.area1.append(re.getRecord());MyFrame.this.area1.append("\n");}}});add(this.jp5, "North");this.jp5.add(this.jb5);this.jp5.add(this.jl1);this.jp5.add(jt1);this.jp5.add(this.jl2);this.jp5.add(jt2);this.jp5.add(this.jl3);this.jp5.add(jt3);this.jb5.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){MyFrame.this.n = Integer.parseInt(MyFrame.jt3.getText());MyFrame.this.m = MyFrame.jt1.getText();MyFrame.this.s = MyFrame.jt2.getText();Running run = new Running(MyFrame.this.minx++, MyFrame.this.n, MyFrame.this.m, MyFrame.this.s);MyFrame.this.list1.add(run);MyFrame.this.area1.setText(null);MyFrame.jt1.setText(null);MyFrame.jt2.setText(null);MyFrame.jt3.setText(null);Iterator it = MyFrame.this.list1.iterator();while (it.hasNext()) {Running re = (Running)it.next();MyFrame.this.area1.append(re.getRecord());MyFrame.this.area1.append("\n");}}});setDefaultCloseOperation(3);setVisible(true);}}package tc;public class Running{int number;int i;String name;String id;public Running(int i, int n, String m, String s){this.i = i;this.number = n; = m;this.id = s;}public String getRecord(){String s = + " " + this.id + " " + this.number;return s;}}package tc;public class Xchange{public static String getFirstString(String d){char[] a = new char[50];char[] b = new char[50];char[] c = new char[50];char[] e = new char[50];int t = 0;int acount = 0;int bcount = 0;int ccount = 0;int ecount = 0;int is = 0;for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {a[(acount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {b[(bcount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {c[(ccount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {e[(ecount++)] = d.charAt(i); }}for (int i = 0; a[i] != 0; i++) {is = i + 1;}char[] ax = new char[is];for (int i = 0; i < is; i++) {ax[i] = a[i];}String as = new String(ax); return as;}public static String getSecondString(String d) { char[] a = new char[50];char[] b = new char[50];char[] c = new char[50];char[] e = new char[50];int t = 0;int acount = 0;int bcount = 0;int ccount = 0;int ecount = 0;int is = 0;for (int i = t; i < d.length(); i++) {if (d.charAt(i) != ' ') {a[(acount++)] = d.charAt(i);} else {t = i;break;}}for (int i = t; i < d.length(); i++) {if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {b[(bcount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {c[(ccount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {e[(ecount++)] = d.charAt(i); }}for (int i = 0; b[i] != 0; i++) {is = i + 1;}char[] bx = new char[is];for (int i = 0; i < is; i++) {bx[i] = b[i];}String bs = new String(bx);return bs;}public static int getThirdString(String d) { char[] a = new char[50];char[] b = new char[50];char[] c = new char[50];char[] e = new char[50];int t = 0;int acount = 0;int bcount = 0;int ccount = 0;int ecount = 0;int is = 0;for (int i = t; i < d.length(); i++) {if (d.charAt(i) != ' ') {a[(acount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {b[(bcount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) {if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) { if (d.charAt(i) != ' ') {c[(ccount++)] = d.charAt(i); } else {t = i;break;}}for (int i = t; i < d.length(); i++) { if (d.charAt(i) == ' ')continue;t = i;break;}for (int i = t; i < d.length(); i++) {if (d.charAt(i) != ' ') {e[(ecount++)] = d.charAt(i);}}for (int i = 0; c[i] != 0; i++) {is = i + 1;}char[] cx = new char[is];for (int i = 0; i < is; i++) {cx[i] = c[i];}String cs = new String(cx);int num = Integer.parseInt(cs);return num;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《通用处理机调度演示程序源代码》//短作业优先算法#define MaxNum 100#include <stdio.h>#include <stdlib.h>#include <string.h>struct Process_struct{int Number; //进程编号char Name[MaxNum]; //进程名称int ArrivalTime; //到达时间int ServiceTime; //开始运行时间int FinishTime; //运行结束时间int WholeTime; //运行时间int run_flag; //调度标志int order; //运行次序double WeightWholeTime; //周转时间double AverageWT_FCFS,AverageWT_SJF; //平均周转时间double AverageWWT_FCFS,AverageWWT_SJF; //平均带权周转时间}Process[MaxNum];int N; //实际进程个数int SJF(); //短作业优先int SJF(){ //短作业优先算法int temp_time=0; //当期那时间int i=0,j;int number_schedul,temp_counter; //进程编号,当前已执行进程个数float run_time;run_time=Process[i].WholeTime;j=1;while((j<N)&&(Process[i].ArrivalTime==Process[j].ArrivalTime)) //判断是否有两个进程同时到达{if(Process[j].WholeTime<Process[i].WholeTime){run_time=Process[i].WholeTime;i=j;}j++;}//查找下一个被调度的进程//对找到的下一个被调度的进程求相应的参数number_schedul=i;Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTim e;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime +Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;Process[number_schedul].order=1;temp_counter=1;while(temp_counter<N){for(j=0;j<N;j++){if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag)){run_time=Process[j].WholeTime;number_schedul=j;break;}}for(j=0;j<N;j++){if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].run_flag))if(Process[j].WholeTime<run_time){run_time=Process[j].WholeTime;number_schedul=j;}}//查找下一个被调度的进程//对找到的下一个被调度的进程求相应的参数Process[number_schedul].ServiceTime=temp_time;Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime +Process[number_schedul].WholeTime;Process[number_schedul].run_flag=1;temp_time=Process[number_schedul].FinishTime;temp_counter++;Process[number_schedul].order=temp_counter;}return 0;}int Pinput(); //进程参数输入int Poutput(); //调度结果输出int Pinput() //进程参数输入{int i;printf("请输入进程个数:\n");scanf("%d",&N);for(i=0;i<N;i++){printf("----------------------------------------\n");printf("请输入一个进程:\n",i+1);printf("请输入进程名称:\n");scanf("%s",Process[i].Name);printf("请输入到达时间:\n");scanf("%d",&Process[i].ArrivalTime);printf("请输入服务时间:\n");scanf("%d",&Process[i].WholeTime);Process[i].ServiceTime=0;Process[i].FinishTime=0;Process[i].WeightWholeTime=0;Process[i].order=0;Process[i].run_flag=0;}return 0;}int Poutput() //调度结果输出{int i;float turn_round_time=0,f1,w=0;printf(" 进程名称到达时间运行时间开始运行时间结束时间执行顺序周转时间带权周转时间\n");for(i=0;i<N;i++){Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;f1=Process[i].WeightWholeTime/Process[i].WholeTime;turn_round_time+=Process[i].WeightWholeTime;w+=f1;printf("时刻%d :",Process[i].ServiceTime,Process[i].Name);printf(" %s %d %d %d %d %d %f %f\n",Process[i].Name,Process[i].ArrivalTime,Process[i].WholeTime,Process[i].Ser viceTime,Process[i].FinishTime,Process[i].order,Process[i].WeightWholeTime,f1);}printf("average_turn_round_timer=%f\n",turn_round_time/N);printf("weight_average_turn_round_timer=%f\n",w/N);return 0;}//时间片轮转算法typedef struct node{char name[20];int round;int cputime;int arrivetime;int needtime;char state;int count;struct node *next;}PCB;PCB *ready=NULL,*run1=NULL,*finish=NULL; int num,i;void GetFirst();void Output();void InsertTime(PCB *in);void InsertFinish(PCB *in);void TimeCreate();void RoundRun();void GetFirst() /*取得第一个就绪队列节点*/ {run1 = ready;if(ready!=NULL){run1 ->state = 'R';ready = ready ->next;run1 ->next = NULL;}void Output() /*输出队列信息*/{PCB *p;p = ready;printf("进程名\tcpu时间\t需要时间\t进程状态\t计数器\n");while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}p = run1;while(p!=NULL){printf("%s\t%d\t%d\t\t%c\t\t%d\n",p->name,p->cputime,p->needtime,p->stat e,p->count);p = p->next;}}void InsertTime(PCB *in) /*将进程插入到就绪队列尾部*/{PCB *fst;fst = ready;if(ready == NULL){in->next = ready;ready = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/ {PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void TimeCreate() /*时间片输入函数*/{PCB *tmp;int i;printf("输入进程名字到达时间进程所需时间时间片大小:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s %d %d %d",tmp->name,&(tmp->arrivetime),&(tmp->needtime),&(tmp ->round));getchar();tmp ->cputime = 0;tmp ->state ='W';// tmp->prio=0;tmp ->count = 0;InsertTime(tmp);}}void RoundRun() /*时间片轮转调度算法*/{int flag = 1;GetFirst();while(run1 != NULL){Output();while(flag){run1->cputime++ ;run1->needtime--;run1->count++;if(run1->needtime == 0){run1 ->state = 'F';InsertFinish(run1);flag = 0;}else if(run1->count == run1->round){run1->state = 'W';run1->count=0;InsertTime(run1);flag = 0;}}flag = 1;GetFirst();}}//先来先服务算法typedef struct PCB //定义进程控制块{char ID[3]; //进程号char name[10]; //进程名char state; //运行状态int arrivetime; //到达时间int starttime; //进程开始时间int finishtime; //进程结束时间int servicetime; //服务时间float turnaroundtime;//周转时间float weightedturnaroundtime;//带权周转时间struct PCB *next; //指向下个进程}pcb;int time; //计时器int n; //进程个数pcb *head1=NULL,*p,*q; //进程链表指针void run_fcfs(pcb *p1) //运行未完成的进程{time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);time+=p1->servicetime;p1->state='T';p1->finishtime=time;p1->turnaroundtime=p1->finishtime-p1->arrivetime;p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime; printf("ID 到达时间开始时间服务时间完成时间周转时间带权周转时间\n"); printf("%s%6d%10d%10d%8d%10.1f%10.2f\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime, p1->turnaroundtime,p1->weightedturnaroundtime);}void fcfs() //找到当前未完成的进程{int i,j;p=head1;for(i=0;i<n;i++){if(p->state=='F'){q=p; //标记当前未完成的进程run_fcfs(q);}p=p->next;}}void getInfo() //获得进程信息并创建进程{int num;printf("\n作业个数:");scanf("%d",&n);for(num=0;num<n;num++){p=(pcb *)malloc(sizeof(pcb));printf("依次输入:\nID 进程名到达时间服务时间\n");scanf("%s\t%s\t%d\t%d",&p->ID,&p->name,&p->arrivetime,&p->servicetime); if(head1==NULL) {head1=p;q=p;time=p->arrivetime;}if(p->arrivetime < time) time=p->arrivetime;q->next=p;p->starttime=0;p->finishtime=0;p->turnaroundtime=0;p->weightedturnaroundtime=0;p->next=NULL;p->state='F';q=p;}}//静态优先权优先算法int SequenceNumber=1; //进程编号int ProcessAmount; //进程数量int StartCount=0; //调入内存进程计数struct PCB1{ //进程控制块int No; //进程号char name[16]; //进程名int enterMemoryTime;//进入内存时间int serviceTime; //服务时间int priority; //优先级struct PCB1 *next;};struct PCB1 *head,*thisP,*newP; //动态接收进程及详细struct PCB1 *readyHead; //动态存储就绪队列//函数声明int getch();int timeOfData(FILE *);void ListAllPCB();void Menu();void printPCB(struct PCB1 *,int,int,int,double);void printPCBP(struct PCB1 *);void printField();void printFieldP();void release(struct PCB1 *);void releaseR(struct PCB1 *);void setNewPCB(char *,int,int,int);struct PCB1 * runTheProcess();void newPCB(){ //建立PCBnewP=(struct PCB1 *)malloc(sizeof(struct PCB1));if(head==NULL){ //判断头节点是否为空head=newP; //为空,头节点指向新开辟的内存}else{thisP=head;while(thisP->next!=NULL){thisP=thisP->next;}thisP->next=newP; //遍历单链表,找到最后一个元素}thisP=newP;thisP->No=SequenceNumber;SequenceNumber++;printf("进程号%d\n",thisP->No);printf("输入进程名:");scanf("%s",thisP->name);printf("输入优先级:");scanf("%d",&thisP->priority);printf("输入进入内存时间:");scanf("%d",&thisP->enterMemoryTime);printf("输入服务时间:");scanf("%d",&thisP->serviceTime);thisP->next=NULL;}void buildProcess(){ //创建进程int i=0;printf("输入进程数量:");scanf("%d",&ProcessAmount);while(i<ProcessAmount){newPCB();i++;}}void readyList(struct PCB1 *pcb){ //单链表的形式创建就绪队列newP=(struct PCB1 *)malloc(sizeof(struct PCB1));if(readyHead==NULL){readyHead=newP;}else{thisP=readyHead;while(thisP->next!=NULL){thisP=thisP->next;}thisP->next=newP;}thisP=newP;strcpy(thisP->name,pcb->name);thisP->No=pcb->No;thisP->priority=pcb->priority;thisP->enterMemoryTime=pcb->enterMemoryTime;thisP->serviceTime=pcb->serviceTime;thisP->next=NULL;}struct PCB1 * callMemory(){ //调入内存,返回调入内存的链表节点int at; //到达时间struct PCB1 *markP;if(head==NULL){printf("程序没有找到。

相关文档
最新文档