实验三 进程调度模拟程序

1. 目的和要求

实验目的

用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

实验要求

设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序。

进程调度算法:“时间片轮转法”调度算法对N个进程进行调度。 

 

2. 实验内容

完成两个算法(简单时间片轮转法、多级反馈队列调度算法)的设计、编码和调试工作,完成实验报告。

 

1) 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 

2) 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。

3) 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。

4) 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,应把它插入就绪队列等待下一次调度。

5) 每进行一次调度,程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。   

6) 重复以上过程,直到所要进程都完成为止。

3. 实验原理及核心算法 

“轮转法”有简单轮转法、多级反馈队列调度算法。

(1). 简单轮转法的基本思想是:

所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。

 

(2). 多级反馈队列调度算法的基本思想是:

将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。

系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。

当进程第一次就绪时,进入第一级队列。

 

4.实现代码

#include<stdio.h>
#define heap_size 5


void min_heapify(int *array,int i){
int heap_size=array[0];
int l=0;
int r=0;
int least=0;
//此处不使用递归节约时间;
while(i>0){
l=2*i;
r=2*i+1;
if(l<=heap_size&&array[l]<array[i])
least=l;
else
least=i;
if(r<=heap_size&&array[r]<array[least])
least=r;
if(least!=i){
int temp;
temp=array[i];
array[i]=array[least];
array[least]=temp;}
i/=2;
}

}

void build_min_heap(int* array){
int heap_size=array[0];
for(int i=(heap_size/2);i>0;i--)
min_heapify(array,i);
}

int heap_extract_min(int*array){
int min;
int heap_size=array[0];
if(heap_size<1)
printf("heap underflow\n");
min=array[1];
array[1]=array[heap_size];
array[0]-=1;
min_heapify(array,1);
return min;
}

void heap_prior_increase(int*array,int i,int key){
if(key>array[i]&&key<0){
printf("the prior you want to increse cann't be relize\n");
return ;}
array[i]=key;
while(i>1&&array[i/2]>array[i]){
int temp;
temp=array[i];
array[i]=array[i/2];
array[i/2]=temp;
i/=2;}
}

void min_heap_insert(int*array,int key){
int heap_size;
array[0]+=1;
heap_size=array[0];
array[heap_size]=-2;
heap_prior_increase(array,heap_size,key);
}
int main(){
printf("\n welcome\n\n");
int test;
int heap_array[heap_size+1]={3,2,1,4,-1,-1};//此处的第一个元素是堆的大小;
build_min_heap(heap_array);
heap_prior_increase(heap_array,3,3);
printf("\nheap_array:");
for(int i=0;i<6;i++)
printf(" %d ",heap_array[i]);
min_heap_insert(heap_array,6);
printf("\nheap_array:");
for(int i=0;i<6;i++)
printf(" %d ",heap_array[i]);
min_heap_insert(heap_array,2);
printf("\nheap_array:");
for(int i=0;i<6;i++)
printf(" %d ",heap_array[i]);
test=heap_extract_min(heap_array);
printf("\nheap_extract_min=%d \n",test) ;
printf("\n welcome \n");
getchar();

}

 

5. 总结

这次的作业让我了解了进程调度模拟程序的代码编写,我也经过了不少的查阅才最终完成自己的编程,通过这次的编写,我对C语言的运用又有了一些提高,希望在接下来的日子能够学的更好。

转载于:https://www.cnblogs.com/georgechou666/p/5050772.html

1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参数 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格式显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值