进程的优先调度算法的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();
        
}


 

 

   

进程优先(Shortest Job First, SJF)调度算法是一种抢占式的非剥夺式作业调度策略,它倾向于优先执行剩余运行时间最短的任务。在C语言实现SJF调度,我们可以模拟一个简单的任务队列结构,并在每个时间段内选择当前执行时间最短的任务。 首先,你需要定义一个结构体来表示任务,包含任务ID、运行时间和CPU执行指针等字段: ```c typedef struct { int task_id; int runtime; int *cpu_time; // 指向运行时间的指针 } Task; ``` 然后,创建一个任务队列: ```c Task queue[QUEUE_SIZE]; // 队列大小 int front = -1, rear = -1; // 前后指针 ``` 接下来是调度函数的核心部分,每次循环检查是否有新任务到达并更新任务执行顺序: ```c void sjf_schedule() { while (true) { // 添加新任务到队列 if (add_task()) { continue; } // 如果队列非空,找到运行时间最短的任务 if (front != -1 && front < rear) { Task shortest = queue[front]; for (int i = front + 1; i <= rear; ++i) { if (queue[i].runtime < shortest.runtime) { shortest = queue[i]; } } // 更新CPU时间并移动任务到执行位置 *shortest.cpu_time += current_time; if (*shortest.cpu_time >= shortest.runtime) { execute_task(shortest.task_id); update_queue(front++, rear); // 移除已执行完的任务 } else { break; // 如果还有时间未完成,则跳出循环 } } else { break; // 队列为空或只有一个任务,直接结束 } } } // 其他辅助函数如添加任务、执行任务和更新队列... ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值