计算机操作系统课程设计源代码《通用处理机调度演示程序源代码》
计算机操作系统课程设计源代码《处理机调度算法的实现源代码》
《处理机调度算法的实现》源代码#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)是一种基于响应比的非抢占式进程调度算法。
操作系统源代码
}
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 写的源代码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;}}。
(完整版)操作系统进程调度C语言代码.docx
//sun.cpp : 定义控制台应用程序的入口点。
//本算法包含四种调度 :先到先服务,短作业优先,时间片轮转,优先级优先!#include"stdio.h"#define N 50void main(){ void sjp(); voidfcfs();void sjf();void yxj();int a;while(true){printf("\n\n");printf("\t\t/*************************/");printf("\n\t\t/*1、先到先服务调度*/");printf("\n\t\t/*2、短作业优先调度*/");printf("\n\t\t/*3、时间片轮转调度*/");printf("\n\t\t/*4、优先级优先调度*/");printf("\n\t\t/*0、退出*/\n");printf("\t\t/*************************/");printf("\n\n\t 请选择菜单项:\t");scanf("%d",&a);printf("\n");switch(a){case 1: fcfs();break;case 2: sjf();break;case 3: sjp();break;case 4: yxj();break;default: break;}if(a<0&&a>4) break;}}void sjp(){int i,j,n,min,px,sjp,time;float sum1,sum2;bool flag=true;printf("\t请输入有n 个进程 (0<n<=50):\t");scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n\n");printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sjp);while(sjp<=0){printf("n\t请重新输入:");scanf("%d",&sjp);}struct Gzuo{int id;// 进程名字int dt;// 到达时刻int st;// 服务时间int wct;// 完成时刻int st2; // 标志是否完成float zt;// 周转时间float dczt; // 带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}for(j=n -1;j>=0;j --){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].st2;a[i].st2=a[i+1].st2;a[i+1].st2=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}time = a[0].dt;//printf(" 赋值后 TIME 值为: %d\n",time);min = 0;while(min<n){flag = true;for(i = 0;i<n;i++){if(a[i].st2>0&&a[i].dt<=time)flag = false;}for(i=0;i<n;i++){if(a[i].st2 > 0 ){if(a[i].dt<=time){//printf(" 当前 a[%d].st2 值为: %d\n",i,a[i].st2);a[i].st2 = a[i].st2 - sjp;//printf(" 运算后当前a[%d].st2 值为: %d\n",i,a[i].st2);//printf(" 当前 TIME 值为: %d\n",time);time = time + sjp;//printf(" 增加之后TIME 值为: %d\n",time);if(a[i].st2<=0){a[i].wct = time + a[i].st2;a[i].zt=(float)(a[i].wct -a[i].dt);a[i].dczt=a[i].zt/a[i].st;min++;}}else if(flag){for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt>time){time = a[i].dt;break;}}}}}}printf("\t1 、按 id 号依次输出 \n");printf("\t2 、按完成顺序依次输出\n");printf("\n\t 请选择输出顺序:\t");scanf("%d",&px);printf("\nid :到达时间 \t 服务时间 \t 完成时间 \t 周转时间 \t 带权周转时间\n"); sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}void fcfs(){int i,j,n,min,px;float sum1,sum2;printf("\t请输入有n 个进程 (0<n<=50):\t");scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n\n");struct Gzuo{int id; int dt; int st;// 进程名字// 到达时刻// 服务时间int wct; float zt; float dczt;// 完成时刻// 周转时间// 带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}for(j=n -1;j>=0;j --){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[i -1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i -1].wct+a[i].st;a[i].zt=(float)(a[i].wct -a[i].dt);a[i].dczt=a[i].zt/a[i].st;}}printf("\t1 、按 id 号依次输出 \n");printf("\t2 、按完成顺序依次输出\n");printf("\n\t 请选择输出顺序:\t");scanf("%d",&px);printf("\nid :到达时间 \t 服务时间 \t 完成时间 \t 周转时间 \t 带权周转时间 \n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}void sjf(){int i,j,n,min,px;int b=0,z;float sum1,sum2;printf("\n\t\t 请输入有n 个进程 (0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");struct Gzuo{int id; // 进程名字int dt; // 到达时刻int st; // 服务时间int wct;// 完成时刻float zt;// 周转时间float dczt; // 带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}min=a[0].dt;for(j=n -1;j>=0;j --){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b=b+1;}for(j=b -1;j>=1;j --){for(i=1;i<j;i++){if(a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i -1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i -1].wct+a[i].st;a[i].zt=(float)(a[i].wct -a[i].dt);a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b -1;j>=i;j --){for(z=i;z<j;z++){if(a[z].st>a[z+1].st){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n\t 请选择输出顺序\n");printf("\t1 、按 id 号依次输出 \n");printf("\t2 、按完成顺序依次输出\n");scanf("%d",&px);printf("\nid :到达时间 \t 服务时间 \t 完成时间 \t 周转时间 \t 带权周转时间\n"); sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d : %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}void yxj(){int i,j,n,min,px;int b=0,z;float sum1,sum2;printf("\n\t\t 请输入有n 个进程 (0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");struct Gzuo{int id;// 进程名字int dt;// 到达时刻int st;// 服务时间int yxj; // 优先级int wct;// 完成时刻float zt;// 周转时间float dczt; // 带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\t优先级:");scanf("%d",&a[i].yxj);printf("\n");}min=a[0].dt;for(j=n -1;j>=0;j --){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b++;}for(j=b -1;j>=1;j --){for(i=1;i<j;i++){if(a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i -1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i -1].wct+a[i].st;a[i].zt=(float)(a[i].wct -a[i].dt);a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b -1;j>=i;j --){for(z=i;z<j;z++){if(a[z].yxj<a[z+1].yxj){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n\t 请选择输出顺序\n");printf("\t1 、按 id 号依次输出 \n");printf("\t2 、按完成顺序依次输出\n");scanf("%d",&px);printf("\nid :到达时间 \t 服务时间 \t 优先级 \t 完成时间 \t 周转时间 \t 带权周转时间 \n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d : %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].z t,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d : %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].z t,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}。
操作系统源代码
操作系统源代码一、介绍操作系统是计算机系统中最核心的组成部分,它负责管理和控制计算机硬件资源的分配和调度,为用户提供良好的工作环境。
操作系统的核心部分就是其源代码,它包含了操作系统的核心算法和功能实现的具体代码。
本文将介绍操作系统源代码的基本结构和主要功能。
二、操作系统源代码结构操作系统源代码通常由若干个模块组成,每个模块负责实现特定的功能。
常见的模块包括进程管理、内存管理、文件系统和设备驱动等。
这些模块之间通过调用函数或者传递消息来实现数据的交互与共享。
同时,源代码还包括一些通用的辅助模块,如调度算法和中断处理程序等。
在源代码结构中,通常会有核心代码和外围代码两部分。
核心代码包括操作系统的主要功能实现,如进程调度、内存管理和文件系统等。
外围代码则包括与硬件交互的驱动程序,如磁盘驱动和网卡驱动等。
这些代码通过相应的接口与硬件进行通信,使操作系统能够正常运行。
三、进程管理模块进程管理模块是操作系统中最重要的模块之一,它负责创建、调度和终止进程。
在源代码中,进程管理模块通常包括进程控制块(PCB)的定义和相关的函数实现。
PCB是操作系统中对进程描述的一种数据结构,包含了进程的状态、优先级和资源需求等信息。
通过将PCB插入并维护在进程管理模块中的数据结构中,操作系统能够对进程进行管理和调度。
四、内存管理模块内存管理模块负责为进程分配和管理内存资源,保证进程能够正常运行。
在源代码中,内存管理模块通常包括内存分配和回收的函数实现,并维护一张内存分配表。
这张表记录了内存的使用情况,以便进行分配和回收的决策。
通过合理地分配和回收内存资源,操作系统能够提高内存的利用率,并提供良好的系统性能。
五、文件系统模块文件系统模块负责管理和组织存储在磁盘上的文件和目录。
在源代码中,文件系统模块通常包括文件控制块(FCB)的定义和相关的函数实现。
FCB是操作系统中对文件描述的数据结构,包含了文件的属性、位置和权限等信息。
通过将FCB插入并维护在文件系统模块中的数据结构中,操作系统能够对文件进行管理和访问。
操作系统课程设计进程调度模拟源代码
runqueue->next=NULL;//从就绪队列选一个节点,插入运行队列
runqueue->killtime=timeslice;//计算消耗的时间
runqueue->runedtime=runqueue->runedtime+runqueue->killtime;//计算总共运行时间
return 0;
}
printf("kill name %d, runtime=%d, runedtime=%d,killtime=%d\n"
,runqueue->name,runqueue->runtime,runqueue->runedtime,runqueue->killtime);
n++;
delete(runqueue);
,runqueue->name,runqueue->runtime,runqueue->runedtime,runqueue->killtime);
}
else if(runqueue->runtime<=0){//判断是否结束
runqueue->killtime=0;
runqueue->runtime=0;
else if(top_wait->next!=NULL){//
p=top_wait;
while(p->next!=temp){
p=p->next;
}
if(temp==tail_wait)
tail_wait=p;
p->next=temp->next;
操作系统-课程设计报告-处理机调度程序
操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127 班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:1200002111班内序号:27成绩:日期:2015 年 1 月 6 日、设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。
也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
、设计要求1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法2)可选择进程数量3)本程序包括三种算法,用C 语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。
三、设计思路及算法思想1. 界面菜单选项一级菜单提供2 个选项:① 自动生成进程数量② 手动输入所需进程数量一级菜单选择完毕后进入二级菜单:①重新生成进程②时间片轮转法③短作业优先算法④动态优先级算法⑤退出程序2. 调度算法typedef st ruct char name;mr pri-ority; intrunnirtgrime;"肚先註 "运和时Eint arriveTiflie;"到达时剖int beg in Time;"幵皓时旬int TinishTiJiie: "尧成时列int cyclingTlme;double weigthC/clingTime:kint int >PCB;hadRunTimt;finish:"已经运行呼间/At否完咸程序所用PCB结构体需要用到的进程结构体如上图所示1)时间片轮转法主要是设置一个当前时间变量,curTime和时间片roundTime。
遍历进程组的时候,每运行一个进程,就把curTime += roundTime。
操作系统-课程设计报告-处理机调度程序
操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:11班内序号: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,退出五、心得体会通过这次实验,让我对操作系统的进程调度有了更进一步的了解。
操作系统五种进程调度算法的代码
优点:可以处理不同优先级的进程,提高系统的吞吐量
缺点:需要维护多个队列,增加了系统开销
汇报人:XX
适用场景:适用于多任务、多用户、分时的操作系统,以及对实时性要求较高的系统。
注意事项:在实现优先级调度算法时,需要注意避免优先级反转、优先级过高或过低等问题,以及合理地处理进程的优先级调整和动态变化。
轮转法调度算法是一种最简单的调度算法,它将作业按照到达时间的先后顺序进行排序,然后依次进行调度。
短作业优先(SJF)是一种非抢占式的进程调度算法,根据作业的长度进行调度。
SJF算法将作业按照其所需执行时间从短到长进行排序。
如果一个进程比其他进程短,即使它已经等待了很长时间,它仍然会被优先调度。
短作业优先调度算法(SJF)的代码实现需要考虑作业的到达时间和执行时间,根据优先级进行调度。
在代码中,需要定义作业队列和作业列表,以便对作业进行排序和调度。
实现任务调度函数
实时系统或关键任务调度系统
任务数量较少且优先级可调整的系统
任务优先级明确且相对固定的系统
需要快速响应和高吞吐量的系统
添加标题
添加标题
添加标题
添加标题
缺点:实现较为复杂,需要合理地确定进程的优先级和调度策略,否则可能导致系统性能下降或者某些进程得不到及时处理。
优点:能够根据进程的紧迫程度和优先级进行调度,优先处理紧急和重要的任务,提高了系统的响应速度和吞吐量。
轮转法调度算法的代码实现通常包括一个循环和一个等待队列,循环用于不断从等待队列中取出进程执行,等待队列用于存储待执行的进程。
在代码实现中,需要考虑到进程的到达时间、运行时间、等待时间和周转时间等参数,以便正确地调度进程。
轮转法调度算法的代码实现需要考虑进程的优先级和紧急程度等因素,以便更好地满足系统的需求。
操作系统处理机调度算法的实现c语言源代码
6.运行所设计程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
#include <stdio.h>
#include <stdlib.h>
struct PCB {
char name[10];
int prБайду номын сангаасority,time;
struct PCB *next;
}*k;
struct LinkQueue {
PCB * front;
PCB * rear;
};
//队列初始化
LinkQueue init(){
LinkQueue Q;
PCB * p;
p=(PCB *)malloc(sizeof(PCB));
if(p) {
Q.front=Q.rear=p;
}
LinkQueue input(LinkQueue Q) /*建立进程控制块函数*/
{
int i;
for(i=1;i<=5;i++)
{
printf("\n进程号No.%d:\n",i);
k=(PCB *)malloc(sizeof(PCB));
printf("\n输入进程名:");
scanf("%s",k->name);
temp2=temp1->next;
}
if(temp2->next==NULL && temp2->priority>=p->priority) {
temp2->next=p;
操作系统调度算法源程序
调度算法实验计算机科学与技术学院计081 0813022022 杨文章实验目的:1. 掌握进程控制块的概念,理解基本的进程调度算法。
实验内容:1. FCFS2. 短作业优先算法3. 优先级调度算法4.最高响应比调度算法实验源程序:#include<iostream>#include<iomanip>#include<fstream>using namespace std;class JOB{ //定义作业数据结构体public:int number; //作业个数int reach_time; //作业到达时间int reach_hour;int reach_minite;int need_time; //作业运行时间int privilege; //优先级float excellent;int start_time; //开始时间int wait_time; //等待时间int visited; //已读取次数public:JOB(){number=0;reach_time=0;reach_hour=0;reach_minite=0;need_time=0;privilege=0;excellent=0.0;start_time=0;visited=0;}JOB& Copy(JOB js[]){int i=0;while(js[i].number&&js[i].number>0){i++;}JOB *js2=new JOB[i];for(int j=0;j<i;j++){js2[j].number=js[j].number;js2[j].reach_time=js[j].reach_time;js2[j].reach_hour=js[j].reach_hour;js2[j].reach_minite=js[j].reach_minite;js2[j].need_time=js[j].need_time;js2[j].privilege=js[j].privilege;js2[j].excellent=js[j].excellent;js2[j].start_time=js[j].start_time;js2[j].wait_time=js[j].wait_time;}return *js2;}};//FIFO算法void FIFO(JOB job[],int quantity){JOB *jobs;jobs=(&jobs->Copy (job));int current_hour;int current_minute;int total_time=0;//输出作业流cout<<endl<<"FIFO调度算法:"<<endl;cout.setf(2);cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(12)<<"开始时间:"<<setw(14)<<"周转时间(分):"<<endl;current_hour=jobs[0].reach_hour;current_minute=jobs[0].reach_minite;for(int i=0;i<quantity;i++){jobs[i].start_time=current_hour*100+current_minute;jobs[i].wait_time=(current_hour-jobs[i].reach_hour)*60+(current_minute-jobs[i].reach_minite)+jobs[i ].need_time;cout<<setw(10)<<jobs[i].number<<setw(12)<<jobs[i].reach_time<<setw(12)<<jobs[i].start_time<<setw(14)<<jobs[i].wait_time<<endl;current_hour=current_hour+(jobs[i].need_time+current_minute)/60;current_minute=(jobs[i].need_time+current_minute)%60;total_time+=jobs[i].wait_time;}cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; }//运算时间短的作业优先算法void Shorter(JOB job[],int quantity){JOB *jobs;jobs=(&jobs->Copy (job));int i,j,p;int current_hour;int current_minute;int current_need_time;int total_time=0;//输出作业流cout<<endl;cout<<endl<<"时间短作业优先算法:"<<endl;cout.setf(2);cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"周转时间(分):"<<endl;current_hour=jobs[quantity-1].reach_hour;current_minute=jobs[quantity-1].reach_minite;for(i=0;i<quantity;i++){current_need_time=30000;for(j=0;j<quantity;j++){if((jobs[j].visited==0)&&(jobs[j].need_time<current_need_time)){p=j;current_need_time=jobs[j].need_time;}}jobs[p].start_time=current_hour*100+current_minute;jobs[p].wait_time=(current_hour-jobs[p].reach_hour)*60+(current_minute-jobs[p].reach_minite)+jobs[p ].need_time;cout<<setw(10)<<jobs[p].number<<setw(12)<<jobs[p].reach_time<<setw(14)<<jobs[p].need_time<<setw(12)<<jobs[p].start_time<<setw(14)<<jobs[p].wait_time<<endl;current_hour=current_hour+(jobs[p].need_time+current_minute)/60;current_minute=(jobs[p].need_time+current_minute)%60;jobs[p].visited=1;total_time+=jobs[p].wait_time;}cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; }//优先数调度算法void Privilege(JOB job[],int quantity){JOB *jobs;jobs=(&jobs->Copy (job));int i,j,p;int current_hour;int current_minute;int current_privilege;int total_time=0;//输出作业流cout<<endl;cout.setf(2);cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"优先级:(0>1):"<<setw(12)<<"开始时间:"<<setw(14)<<"周转时间(分):"<<endl;current_hour=jobs[quantity-1].reach_hour;current_minute=jobs[quantity-1].reach_minite;for(i=0;i<quantity;i++){current_privilege=30000;for(j=0;j<quantity;j++){if((jobs[j].visited==0)&&(jobs[j].privilege<current_privilege)){p=j;current_privilege=jobs[j].privilege;}}jobs[p].start_time=current_hour*100+current_minute;jobs[p].wait_time=(current_hour-jobs[p].reach_hour)*60+(current_minute-jobs[p].reach_minite)+jobs[p ].need_time;cout<<setw(10)<<jobs[p].number<<setw(12)<<jobs[p].reach_time<<setw(14)<<jobs[p].privilege<<setw(12)<<jobs[p].start_time<<setw(14)<<jobs[p].wait_time<<endl;current_hour=current_hour+(jobs[p].need_time+current_minute)/60;current_minute=(jobs[p].need_time+current_minute)%60;jobs[p].visited=1;total_time+=jobs[p].wait_time;}cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl; }//响应比最高者优先调度算法void Excellent(JOB job[],int quantity){JOB *jobs;jobs=(&jobs->Copy (job));int i,j,p;int current_hour;int current_minute;float current_excellent;int total_time=0;cout<<endl;cout<<endl<<"响应比高者优先调度算法:"<<endl;cout.setf(2);cout<<setw(10)<<"作业号"<<setw(12)<<"到达时间"<<setw(12)<<"开始时间"<<setw(14)<<"周转时间(分)"<<endl;current_hour=jobs[quantity-1].reach_hour;current_minute=jobs[quantity-1].reach_minite;for(i=0;i<quantity;i++){current_excellent=-1;for(j=0;j<quantity;j++){if(jobs[j].visited==0){jobs[j].wait_time=(current_hour-jobs[j].reach_hour)*60+(current_minute-jobs[j].reach_minite);jobs[j].excellent=(float)(jobs[j].wait_time/jobs[j].need_time);}}for(j=0;j<quantity;j++){if((jobs[j].visited==0)&&(jobs[j].excellent>current_excellent)){p=j;current_excellent=jobs[j].excellent;}}jobs[p].start_time=current_hour*100+current_minute;jobs[p].wait_time=(current_hour-jobs[p].reach_hour)*60+(current_minute-jobs[p].reach_minite)+jobs[p ].need_time;cout<<setw(10)<<jobs[p].number<<setw(12)<<jobs[p].reach_time<<setw(12)<<jobs[p].start_time<<setw(14)<<jobs[p].wait_time<<endl;current_hour=current_hour+(jobs[p].need_time+current_minute)/60;current_minute=(jobs[p].need_time+current_minute)%60;jobs[p].visited=1;total_time+=jobs[p].wait_time;}cout<<endl<<"总周转时间:"<<total_time<<" 平均周转时间:"<<total_time/quantity<<endl;}int main(void){cout<<"**********************调度模拟**************************\n\n\n"<<endl;int quantity=0; //数量JOB jobs[MAXJOB];cout<<"请输入作业数据文件名:\n";FILE *fp;char fname[20];cin>>fname;fp=fopen(fname,"r");//以只读方式打开文件if(!fp){cout<<"打开文件错误!)"<<endl;}else{while(!feof(fp)){fscanf(fp,"%d %d %d %d",&jobs[quantity].number,&jobs[quantity].reach_time,&jobs[quantity].need_time,&jobs[quantity].privilege);jobs[quantity].reach_hour=jobs[quantity].reach_time/100;jobs[quantity].reach_minite=jobs[quantity].reach_time%100;quantity++;}//输出初始作业数据cout<<"初始作业数据:"<<endl;cout.setf(2);cout<<setw(10)<<"作业号:"<<setw(12)<<"到达时间:"<<setw(14)<<"所需时间(分):"<<setw(14)<<"优先级:(0>1)"<<endl;for(int i=0;i<quantity;i++){cout<<setw(10)<<jobs[i].number<<setw(12)<<jobs[i].reach_time<<setw(14)<<jobs[i].need_time<<setw(14)<<jobs[i].privilege<<endl;}}lb: cout<<"请选择调度算法:\n";cout<<"\t\t1---先进先出调度算法\n";cout<<"\t\t2---短作业优先\n";cout<<"\t\t3---优先级调度算法\n";cout<<"\t\t4---响应比最高调度算法"<<endl;int flag=0;la: cin>>flag;switch (flag){case 1:FIFO(jobs,quantity); break;//先进先出调度算法case 2:Shorter(jobs,quantity);break;//短作业优先case 3:Privilege(jobs,quantity);break; //优先级调度算法case 4:Excellent(jobs,quantity);break; //响应比最高调度算法default:cout<<"请输入1-4之间的数"<<endl;goto lb;}goto la;return 0;}数据文件:data.txt1 700 40 12 723 32 23 821 25 34 823 21 45 900 15 66 912 10 4总结及程序简介:1.首先将数据存在data.txt文件中,在主函数中读入数据存入数组jobs[]中2.定义类JOB包含属性:int number; //作业个数int reach_time; //作业到达时间int reach_hour;int reach_minite;int need_time; //作业运行时间int privilege; //优先级float excellent;int start_time; //开始时间int wait_time; //等待时间int visited; //已读取次数方法:构造函数JOB()复制函数Copy()实现一个对象2.分别实现调度算法,然后在主函数中依次调用调试结果:word格式-可编辑-感谢下载支持。
操作系统源代码
}#include<stdio.h> #include<time.h>#include<stdlib.h> int memoryStartAddress = -1; int memorySize = -1; struct jobList /* 作业 ID */int size; /* 作业大小(需要的存储空间大小) */ int status; /* 作业状态 0 : new job ,1 : in the memory , 2 : finished . *//* 分区起始地址 */ /* 分区中存放作业 ID */ /* 分区链表指针 *//*出现严重错误时显示信息并结束程序{printf("\n\tError !\a"); printf("\nPress any key toexit !"); getch(); exit(1);}void openFile(FILE **fp,char *filename,char *mode)/* 以要求的方式打开文件 */{if((*fp = fopen(filename,mode)) == NULL){printf("\nCan't open %s in mode %s.",filename,mode); errorMessage();int id;struct jobList *next; }; struct freeList/* 作业链表指针 */ {int startAddress; /* 分区起始地址 */int size; struct freeList*next; }; struct usedList/* 分区大小 */ /* 分区链表指针 */{int startAddress;int jobID;struct usedList *next; };void errorMessage(void)*/}void makeFreeNode(struct freeList **empty,int startAddress,int size)/* 根据参数startAddress、size 创建空闲节点,由empty 指针返回*/ {if((*empty = malloc(sizeof(struct freeList))) == NULL){ printf("\nNot enough to allocate for the free node ."); errorMessage();}(*empty)->startAddress = startAddress;(*empty)->size = size;(*empty)->next = NULL;}void iniMemory(void) /* 初始化存储空间起始地址、大小*/{char MSA[10],MS[10];printf("\nPlease input the start address of the memory !"); scanf("%s",MSA); memoryStartAddress = atoi(MSA); printf("\nPlease input the size of the memory !");scanf("%s",MS);memorySize = atoi(MS);}char selectFitMethod(void) /* 选择适应算法*/{FILE *fp;char fitMethod;do{ printf("\n\nPlease input a char as fallow to select the fit method !\ \n 1 (Best fit) \\n 2 (Worst fit) \\n 3 (First fit) \\n 4 (Last fit)\n"); fitMethod = getche();}while(fitMethod < '1' || fitMethod > '4'); openFile(&fp,"d:\\result.cl","a"); switch(fitMethod) {case '1': fprintf(fp,"\n\n\n\n\tBest fit");fprintf(fp,"\n **********************************************");break;case '2':fprintf(fp,"\n\n\n\n\tWorst fit");fprintf(fp,"\n **********************************************");break;case '3':fprintf(fp,"\n\n\n\n\tFirst fit"); fprintf(fp,"\nbreak;case '4': fprintf(fp,"\n\n\n\n\tLast fit");break;}fclose(fp);return fitMethod;}void inputJob(void) /* 从键盘输入作业到 D 盘的 JOB 文件 */ { int /*id,size, */status = 0,jobnum = 0; FILE *fp;char id[10],size[10]; openFile(&fp,"d:\\job.cl","w"); fprintf(fp,"job_ID\tsize\tstatus"); printf("\n\n\n\nPlease input the jobs as fallow !\\nEnter a integer smaller than 1 to quit .\njob_ID\tsize\n"); do{ /* scanf("%d%d",&id,&size); */ scanf("%s\t%s",id,size); if(atoi(id) > 0 &&atoi(size) > 0) {fprintf(fp,"\n%s\t%s\t%d",id,size,status);/* fprintf(fp,"\n%d\t%d\t%d",id,size,status); */ jobnum++;}else break; }while(1);if(jobnum) printf("\nFinished to input the jobs !"); else{printf("\nNo job was given ."); errorMessage();}fclose(fp);}int makeJobList(struct jobList **jobs)/* 从 JOB 文件中读出作业并创建作业链表 */ {char jobID[10],size[10],status[10]; struct jobList *rear; FILE *fp;);fprintf(fp,"\n **********************************************H );openFile(&fp,"d:\\job.cl","r"); fscanf(fp,"%s%s%s",jobID,size,status);if((*jobs = malloc(sizeof(struct jobList))) == NULL){ printf("\nNot enough to allocate for the job ."); fclose(fp);errorMessage();}rear = *jobs;(*jobs)->next = NULL; while(!feof(fp)){struct jobList *p; fscanf(fp,"%s%s%s",jobID,size,status);if((p = malloc(sizeof(struct jobList))) == NULL) {printf("\nNot enough to allocate for the job ."); fclose(fp);errorMessage();} p -> next = rear -> next; rear -> next = p; rear = rear -> next; rear -> id = atoi(jobID);rear -> size = atoi(size);rear -> status = atoi(status);}fclose(fp);return 0;}int updateJobFile(struct jobList *jobs) /* 更新作业链表中作业的状态*/{FILE *fp;struct jobList *p;openFile(&fp,"d:\\job.cl","w"); fprintf(fp,"job_ID\tsize\tstatus"); for(p = jobs -> next;p;p = p -> next)fprintf(fp,"\n%d\t%d\t%d",p->id,p->size,p->status);fclose(fp);return 0;}int showFreeList(struct freeList *empty) /* 空闲分区队列显示*/{FILE *fp;struct freeList *p = empty -> next;int count = 0; openFile(&fp,"d:\\result.cl","a");fprintf(fp,"\n\nNow show the free list..."); printf("\n\nNow show the free list...");if(p){ fprintf(fp,"\nnumber\tsize\tstartAddress"); printf("\nnumber\tsize\tstartAddress");for(;p;p = p -> next){fprintf(fp,"\n%d\t%d\t%d",++count,p -> size,p -> startAddress);printf("\n%d\t%d\t%d",count,p -> size,p -> startAddress);}fclose(fp);return 1;}elsefprintf(fp,"\nThe memory was used out !");printf("\nThe memory was used out !"); fclose(fp);return 0;} } void getJobInfo(struct jobList *jobs,int id,int *size,int *status)/* 获取作业的信息*/ {struct jobList *p = jobs->next; while(p && p->id != id) p = p->next;if(p == NULL){ printf("\nCan't find the job which id is : %d .",id); errorMessage();}else{*size = p -> size; *status = p -> status;}}void updateJobStatus(struct jobList **jobs,int id,int status){struct jobList *p = (*jobs)->next; while(p && p->id != id) p = p->next;if(p == NULL){ printf("\nCan't find the job which id is : %d .",id); errorMessage();}else p -> status = status;}int showUsedList(struct jobList *jobs,struct usedList *used)/* 作业占用链表显示*/{FILE *fp;struct usedList *p = used -> next;int count = 0,size,status; openFile(&fp,"d:\\result.cl","a"); fprintf(fp,"\n\nNow show the used list..."); printf("\n\nNow show the used list...");if(p){ fprintf(fp,"\nnumber\tjobID\tsize\tstartAddress");printf("\nnumber\tjobID\tsize\tstartAddress"); for(;p;p = p -> next){ getJobInfo(jobs,p -> jobID,&size,&status);fprintf(fp,"\n%d\t%d\t%d\t%d",++count,p->jobID,size,p-> startAddress);printf("\n%d\t%d\t%d\t%d",count,p->jobID,size,p-> startAddress);} fclose(fp); return 1;}else{fprintf(fp,"\nNo job in the memory ! You should input some jobs to it.");printf("\nNo job in the memory ! You should input some jobs to it."); fclose(fp);return 0;}}int showJobList(struct jobList *jobs) /* 显示作业链表*/{struct jobList *p; p = jobs->next; if(p == NULL) {printf("\nNo job in the list ! Try again next time."); return 0;} printf("\n\nThe job list is as fallow :\njob_ID\tsize\tstatus"); while(p) { printf("\n%d\t%d\t%d",p->id,p->size,p->status); p = p->next;}return 1;}void moveFragment(struct jobList *jobs,struct freeList **empty,struct usedList **used) {int size,status;struct usedList *p;int address = memoryStartAddress;/* 全局变量,初始化时分配存储空间始址*/if((*empty)->next == NULL) /* 空闲分区链表为空,提示并返回*/{printf("\nThe memory was used out at all.\nMay be you should finish some jobs first or press any key to try again !");getch();return;}for(p = (*used) -> next;p;p = p-> next)/* 循环的修改占用分区的始址*/{p -> startAddress = address; getJobInfo(jobs,p -> jobID,&size,&status);/* 由作业ID 获得作业大小*/ address += size;}(*empty)->next->startAddress = address;/* 修改空闲分区的首节点始址、大小*/(*empty) -> next -> size = memorySize - (address - memoryStartAddress);(*empty) -> next -> next = NULL;/* 删除首节点后的所有节点*/}void order(struct freeList **empty,int bySize,int inc){struct freeList *p,*q,*temp;int startAddress,size;for(p = (*empty) -> next;p;p = p -> next){ /* 按bySize 和inc 两个参数寻找合适的节点,用temp 指向它*/ for(temp = q = p;q;q = q -> next)switch(bySize){{{case 0 : switch(inc){case 0:if(q->size < temp->size) temp = q;break;default:if(q->size > temp->size) temp = q;break;} break; default:switch(inc){case 0:if(q->startAddress < temp->startAddress) temp =q;break;default:if(q->startAddress > temp->startAddress) temp =q;break;} break;}} /* 交换节点的成员值*/ if(temp != p){ startAddress = p->startAddress; size = p->size;p->startAddress = temp->startAddress; p->size = temp->size;temp->startAddress = startAddress; temp->size = size;}}}int allocate(struct freeList **empty,int size)/* 为作业分配存储空间、状态必须为0*/{struct freeList *p,*prep;int startAddress = -1;p = (*empty) -> next; while(p && p->size < size) p = p -> next; if(p != NULL)if(p -> size > size){startAddress = p -> startAddress;p -> startAddress += size;p -> size -= size;}else{startAddress = p -> startAddress;prep = *empty; while(prep -> next != p) prep = prep -> next;prep -> next = p -> next;free(p);}}else printf("\nMay be you should move the fragment together ."); /* Unsuccessful ! */ return startAddress;}void insertUsedNode(struct usedList **used,int id,int startAddress) /* 插入释放的空间到USed链表中(作业号为id , StartAddreSS由函数13返回)*/{StrUct USedLiSt *q,*r,*prer;if((q = malloc(Sizeof(StrUct USedLiSt))) == NULL){printf("\nNot enoUgh to allocate for the USed node .");errorMeSSage();}q -> StartAddreSS = StartAddreSS;q -> jobID = id;prer = *USed;r = (*USed) -> next;while(r && r->StartAddreSS < StartAddreSS){prer = r;r = r -> next;}q -> next = prer -> next;prer -> next = q;}int finiShJob(StrUct USedLiSt **USed,int id,int *StartAddreSS)/* 结束一个作业号为id 的作业,释放存储空间(由*startAddress 返回空间的起始地址) */ {struct usedList *p,*prep;prep = *used;p = prep -> next;while(p && p -> jobID != id){prep = p; p = p -> next;}if(p == NULL){ printf("\nThe job which id is : %d is not in the memory !",id); return 0;}else{ *startAddress = p->startAddress; prep -> next = p -> next; free(p); return 1;}}void insertFreeNode(struct freeList **empty,int startAddress,int size)/* 插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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("程序没有找到。