`

CPU调度算法

阅读更多

两种进程调度算法:1)优先数调度;2)循环轮转调度

 

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

②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

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

对于遇到优先数一致的情况,采用FIFO策略解决。

 

 

#include<stdio.h>

#include <dos.h>

#include<stdlib.h>

#include<conio.h>

#include<iostream.h>

#define P_NUM 5

#define P_TIME 50

enum state{

       ready,

       execute,

       block,

       finish

};

 

struct pcb{

       char name[4];

       int priority;

       int cputime;

       int needtime;

       int count;

       int round;

       state process;

       pcb * next;

};

pcb * get_process();

pcb * get_process(){

       pcb *q;

       pcb *t;

       pcb *p;

       int i=0;

       cout<<"input name and time"<<endl;

 

       while (i<P_NUM){

              q=(struct pcb *)malloc(sizeof(pcb));

              cin>>q->name;

              cin>>q->needtime;

              q->cputime=0;

              q->priority=P_TIME-q->needtime;

              q->process=ready;

              q->next=NULL;

              if (i==0){

                     p=q;

                     t=q;

              }

              else{

                     t->next=q;

                     t=q;

              }

              i++;

       }  //while

       return p;

}

void  display(pcb *p){

       cout<<"name"<<"    "<<"cputime"<<"    "<<"needtime"<<"    "<<"priority"<<"    "<<"state"<<endl;

       while(p){

              cout<<p->name;

              cout<<"        ";

              cout<<p->cputime;

              cout<<"          ";

              cout<<p->needtime;

              cout<<"          ";

              cout<<p->priority;

              cout<<"          ";

              switch(p->process){

                     case ready:cout<<"ready"<<endl;break;

                     case execute:cout<<"execute"<<endl;break;

                     case block:cout<<"block"<<endl;break;

                     case finish:cout<<"finish"<<endl;break;

              }

              p=p->next;

       }

}

 

int process_finish(pcb *q){

       int bl=1;

       while(bl&&q){

              bl=bl&&q->needtime==0;

              q=q->next;

       }

       return bl;

}

 

void cpuexe(pcb *q){

       pcb *t=q;

       int tp=0;

       while(q){

              if (q->process!=finish){

                     q->process=ready;

                     if(q->needtime==0){

                            q->process=finish;

                     }

              }

              if(tp<q->priority&&q->process!=finish){

                     tp=q->priority;

                     t=q;

              }

              q=q->next;

       }

       if(t->needtime!=0){

              t->priority-=3;

              t->needtime--;

              t->process=execute;

              t->cputime++;

       }

}

 

void priority_cal(){

       pcb * p;

       clrscr();

       p=get_process();

       int cpu=0;

       clrscr();

       while(!process_finish(p)){

              cpu++;

              cout<<"cputime:"<<cpu<<endl;

              cpuexe(p);

              display(p);

              sleep(2);

              clrscr();

       }

       printf("All processes have finished,press any key to exit");

       getch();

}

 

void display_menu(){

       cout<<"CHOOSE THE ALGORITHM:"<<endl;

       cout<<"1 PRIORITY"<<endl;

       cout<<"2 ROUNDROBIN"<<endl;

       cout<<"3 EXIT"<<endl;

}

pcb * get_process_round(){

       pcb *q;

       pcb *t;

       pcb *p;

       int i=0;

       cout<<"input name and time"<<endl;

 

       while (i<P_NUM){

              q=(struct pcb *)malloc(sizeof(pcb));

              cin>>q->name;

              cin>>q->needtime;

              q->cputime=0;

              q->round=0;

              q->count=0;

              q->process=ready;

              q->next=NULL;

              if (i==0){

                     p=q;

                     t=q;

              }

              else{

                     t->next=q;

                     t=q;

              }

              i++;

       }  //while

       return p;

}

 

void cpu_round(pcb *q){

       q->cputime+=2;

       q->needtime-=2;

       if(q->needtime<0) {

              q->needtime=0;

       }

       q->count++;

       q->round++;

       q->process=execute;

 

}

 

pcb * get_next(pcb * k,pcb * head){

       pcb * t;

       t=k;

       do{

        t=t->next;

       }

       while (t && t->process==finish);

 

 

       if(t==NULL){

              t=head;

 

              while (t->next!=k && t->process==finish){

                     t=t->next;

              }

       }

       return t;

}

void set_state(pcb *p){

       while(p){

              if (p->needtime==0){

                     p->process=finish;

 

              }

              if (p->process==execute){

                     p->process=ready;

              }

              p=p->next;

       }

}

void display_round(pcb *p){

       cout<<"NAME"<<"  "<<"CPUTIME"<<"  "<<"NEEDTIME"<<"  "<<"COUNT"<<"  "<<"ROUND"<<"  "<<"STATE"<<endl;

       while(p){

              cout<<p->name;

              cout<<"      ";

              cout<<p->cputime;

              cout<<"     ";

              cout<<p->needtime;

              cout<<"         ";

              cout<<p->count;

              cout<<"        ";

              cout<<p->round;

              cout<<"       ";

              switch(p->process){

                     case ready:cout<<"ready"<<endl;break;

                     case execute:cout<<"execute"<<endl;break;

                     case finish:cout<<"finish"<<endl;break;

              }

              p=p->next;

       }

}

 

void round_cal(){

       pcb * p;

       pcb * r;

       clrscr();

       p=get_process_round();

       int cpu=0;

       clrscr();

       r=p;

       while(!process_finish(p)){

              cpu+=2;

              cpu_round(r);

              r=get_next(r,p);

              cout<<"cpu "<<cpu<<endl;

              display_round(p);

              set_state(p);

              sleep(5);

              clrscr();

       }

}

 

void main(){

       display_menu();

       int k;

       scanf("%d",&k);

       switch(k){

                     case 1:priority_cal();break;

                     case 2:round_cal();break;

                     case 3:break;

                     display_menu();

                     scanf("%d",&k);

       }

       }

 

 

分享到:
评论

相关推荐

    关于CPU调度算法源码 C++

    本项目聚焦于CPU调度算法的实现,采用C++编程语言,并在Visual Studio 2005环境下编译运行。这里我们将深入探讨四种常见的调度算法:非抢占式短进程优先(Non-preemptive Shortest Process Next, SPN)、优先级调度...

    CPU调度算法的模拟实现课程设计.doc

    CPU 调度算法的模拟实现课程设计 本课程设计旨在通过编写程序语言,模拟实现四种 CPU 调度算法:先到先服务算法(FCFS)、非抢占最短作业优先算法(SJF)、可抢占优先权调度算法(PRIOR)和时间片轮转算法(RR)。...

    CPU_Scheduling_cpu调度算法_

    本项目基于Java Swing实现了一个CPU调度算法的模拟器,旨在帮助学习者直观理解各种CPU调度策略的工作原理。以下是关于CPU调度算法的详细介绍: 1. **调度目标**:CPU调度的主要目标包括提高系统吞吐量、降低平均...

    CPU调度算法(操作系统实验)

    本实验将探讨和模拟几种常见的CPU调度算法,通过C++编程语言来实现。以下是这些算法的详细介绍: 1. **先来先服务(FCFS)调度算法**:这种最简单的调度算法按照进程到达的顺序进行服务。它易于实现,但可能导致短...

    cpu调度算法c++实现(超简洁)

    本项目涉及四种常见的CPU调度算法的C++实现,包括先来先服务(FCFS)、短作业优先(SJF)、抢占式优先级算法以及时间片轮转(RR)算法。 1. **先来先服务(FCFS)算法**: FCFS是最简单的调度策略,按照进程到达的顺序进行...

    CPU 调度算法实现

    本主题将深入探讨CPU调度算法的实现,特别是时间片调度算法和优先级调度算法。 时间片调度算法,也称为轮转调度,是将所有就绪进程按一定顺序放入一个队列中,然后为每个进程分配一个固定的时间片(如10毫秒或100...

    cpu调度算法的设计与实现课件

    CPU调度算法是操作系统核心部分的关键技术之一,它决定了如何有效地分配处理器资源给多个并发进程。在本课件中,我们将探讨CPU调度算法的设计与实现,包括基础的数据结构——结构体和链表,以及它们在CPU调度算法中...

    CPU.rar_cpu调度 _cpu调度算法_优先级调度

    本文将深入探讨标题和描述中提到的几种CPU调度算法:先来先服务(FCFS)、时间片轮转(RR)、短作业优先(SJF)以及优先级调度。 1. 先来先服务(FCFS)算法: FCFS是最简单的CPU调度算法,其工作原理是按照进程...

    操作系统实验 cpu调度算法

    在多任务环境中,CPU调度算法扮演着至关重要的角色,它决定了哪个进程可以在何时获得CPU执行权。本实验旨在深入理解操作系统中的CPU调度,通过编写和运行C++程序来模拟不同的调度算法。 CPU调度算法主要包括以下几...

    Linux课程设计 模拟cpu调度算法

    本项目“Linux课程设计 模拟cpu调度算法”聚焦于这一核心领域,通过C语言实现了几种经典的CPU调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及抢占式调度算法。 首先,我们来了解一下...

    操作系统CPU调度算法之优先级调度算法

    这是操作系统中的调度问题,调度策略是动态优先级调度,仅是模拟

    CPU调度算法.pdf

    CPU调度算法是操作系统核心功能之一,它决定了操作系统如何在多任务环境下有效地分配处理器资源。本文主要探讨了三种常见的CPU调度算法:FCFS(先来先服务)、非抢占式SJF(短作业优先)和可抢占优先权调度。 1. ...

    cpu调度算法.pdf

    CPU调度算法是操作系统核心功能之一,用于决定如何在多任务环境下分配处理器资源。本文将深入探讨两种常见的CPU调度算法:优先数调度和循环轮转调度,并结合给出的代码进行解析。 1. **优先数调度**: - 优先数...

    cpu调度算法程序设计(java)

    cpu调度算法程序设计(java)cpu调度算法程序设计(java)cpu调度算法程序设计(java)

    CPU调度算法1

    本文将深入探讨几种常见的单处理器CPU调度算法,旨在帮助理解这些算法如何工作以及它们各自的特点。 首先,我们来看看"先到先服务"(First-Come, First-Served, FCFS)调度算法。这种算法非常直观,它按照进程到达...

    OS课设之CPU调度算法的模拟实现.pdf

    CPU调度算法的目的是有效地分配处理器资源,以提高系统的效率和响应性。本课设旨在通过模拟实现几种基本的CPU调度算法,帮助学生深入理解这些算法的工作原理及其性能指标。 首先,我们要讨论的是四种常见的CPU调度...

    CPU调度算法之彩票调度(Lottery Scheduling)

    彩票调度算法(Lottery Scheduling)是一种基于概率的任务调度策略,用于操作系统和计算机系统中的任务管理。该算法通过为每个任务分配一定数量的“彩票”,并通过随机抽取彩票的方式来决定哪个任务将获得CPU资源。...

    cpu调度算法.docx

    在本文中,我们将深入探讨两种常见的CPU调度算法:优先数调度和循环轮转调度。 首先,优先数调度(Priority Scheduling)是基于优先级的算法,其中进程的优先级决定了它们获取CPU执行的机会。在这个程序中,优先级...

Global site tag (gtag.js) - Google Analytics