进程的优先调度算法的c语言实现

在进程中实现优先级算法可以使用最小堆排列来实现。

一般在优先级调度算法中要实现的操作

1.从后备作业队列中选择一个优先级最高的作业将他们调入内存,分配必要的资源。此处的优先级越高关键字越小

2.创建进程并且放入到后备作业队列中

3,。改变一个进程的优先级重新排列后备作业队列的顺序

此处的c语言实现仅仅使用一个数组代表关键字,

若再真实的操作系统中,真可以使用结构体数组来代替示例中的简单数组。

 

struct Process
{
int key;
int* pointer;//指向进程的入口代码
//更多的其他信息
}process


 

#include<stdio.h>
#define HEAP_SIZE 5//定义堆的大小,记住此时的大小不包含堆数组的0号元素,0号元素储存的是 堆的大小;
//================Min_heapify==================
/*
此函数的作用是使以i为根的堆成为最小堆;
 
*/ 
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;
             }
                    
}
//=================Build_min_heap===============
/*
此函数是建立以数组array的最小堆; 
*/ 
void Build_min_heap(int* array){
     int heap_size=array[0];
     for(int i=(heap_size/2);i>0;i--)
             Min_heapify(array,i);
}
//============= Heap_extract_min=============
/*
此函数是返回最小堆的最小的关键字 
*/
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;          
}
//=========== Heap_prior_increase===============
/*
此函数的作用是增加堆中某个元素的优先值,优先级高的关键字小; 
*/
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;}                 
}
//=========== Min_heap_insert=====================
/*
此函数的作用是插入元素; 
*/
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 to wuhan university^_^\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 to wuhan university^_^\n\n");  
    getchar();
        
}


 

 

   

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
进程优先调度算法(Shortest Job First,简称SJF)是一种非抢占式的进程调度算法,它根据每个进程的执行时间来选择优先级实现SJF调度算法可以使用如下的C语言代码: ```c #include <stdio.h> #define MAX 10 //最大进程数 //进程结构体 typedef struct process { int pid; //进程ID int burstTime; //进程执行时间 } process; int main() { int n, i, j; float avgWaitingTime = 0, avgTurnaroundTime = 0; //平均等待时间和平均周转时间 process p[MAX], temp; printf("请输入进程数:"); scanf("%d", &n); //输入进程信息 for(i = 0; i < n; i++) { printf("请输入第%d个进程的ID和执行时间:", i + 1); scanf("%d%d", &p[i].pid, &p[i].burstTime); } //按进程执行时间从小到大排序 for(i = 0; i < n - 1; i++) { for(j = i + 1; j < n; j++) { if(p[i].burstTime > p[j].burstTime) { temp = p[i]; p[i] = p[j]; p[j] = temp; } } } //计算等待时间和周转时间 int waitingTime[MAX] = {0}, turnaroundTime[MAX] = {0}; waitingTime[0] = 0; for(i = 1; i < n; i++) { waitingTime[i] = waitingTime[i - 1] + p[i - 1].burstTime; turnaroundTime[i] = waitingTime[i] + p[i].burstTime; avgWaitingTime += waitingTime[i]; avgTurnaroundTime += turnaroundTime[i]; } avgWaitingTime /= n; avgTurnaroundTime /= n; //输出结果 printf("进程ID\t执行时间\t等待时间\t周转时间\n"); for(i = 0; i < n; i++) { printf("%d\t%d\t\t%d\t\t%d\n", p[i].pid, p[i].burstTime, waitingTime[i], turnaroundTime[i]); } printf("平均等待时间:%.2f\n平均周转时间:%.2f", avgWaitingTime, avgTurnaroundTime); return 0; } ``` 上述代码中,我们使用结构体 `process` 来存储每个进程的ID和执行时间。首先输入进程数和每个进程的ID和执行时间,然后按照执行时间从小到大排序,接着计算每个进程的等待时间和周转时间,并统计平均等待时间和平均周转时间,最后输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值