1. 程式人生 > >程序的優先排程演算法的c語言實現

程序的優先排程演算法的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();
        
}

相關推薦

先來先服務和高響應比優先排程演算法C語言實現

#include <stdio.h> #include <stdlib.h> #include <string.h> #define WAIT "Wait"//就緒狀態 #define RUN "Run"//執行狀態 #define FINISH "Finish"//完

磁碟排程演算法C語言實現

最短尋道時間優先(SSTF)演算法。要求訪問的磁軌,與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短。掃描排程(SCAN)演算法。該演算法不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮的是磁頭當前的移動方向。例如,當磁頭正在自裡向外移動時,SCAN演算法所考慮的下一

處理機排程演算法C語言實現(註釋得當!!)

/* created by herbert on 10 Nov */ #include <iostream> #include <queue> #include <algorithm> #include <c

作業排程之先來先服務演算法C語言實現

程式碼如下 /*    @author WellsLiu    @url liuyanzhao.com*/#include"stdio.h"#include"stdlib.h"typedef st

SHA-1演算法C語言實現

> 程式碼轉載自:https://blog.csdn.net/testcs_dn/article/details/25771377?locationNum=13&fps=1 > 感謝博主分享 #include<stdio.h> void creat_w(uns

頁面置換演算法——最近最久未使用演算法(c語言實現)

作業系統實驗:用C語言程式設計實現最近最久未使用置換演算法(LRU) 最近最久未使用置換演算法(LRU),全稱Least Recently Used,是一種頁面置換演算法。 對於在記憶體中但又不用的資料塊(記憶體塊)叫做LRU,作業系統會根據哪些資料屬於LRU而將其移出記憶體而騰出空間來載入另外

建立雙向連結串列的演算法——C語言實現

建立雙向連結串列的演算法——C語言實現 雙向連結串列也叫雙鏈表,是連結串列的一種,它的每個節點包含兩個指標,分別指向直接後繼和直接前驅(頭節點的前驅指空,尾節點的後繼指空)。所以,從雙向連結串列中的任意一個非前驅非後繼節點開始,都能很方便地訪問它的前驅和後繼節點。 實際上如果熟練掌握了單向連

差分進化演算法 C語言實現

之前的一篇中貼出了自己研究生期間C實現的基本粒子群演算法,執行速度顯然要比其他的高階語言快,這也是各個程式語言之間的差別,現在對於曾經輝煌過的差分進化演算法進行C語言實現。變異策略採用DE/rand/1,這個是最常見的。有錯誤之處請之處。 /***************D

氣泡排序演算法C語言實現

第一部分   排序方法介紹 常用的排序方法:氣泡排序,選擇排序,插入排序及希爾排序等。        氣泡排序是常用的一種排序方法,其基本方法就是逐次比較。即一次比較兩個數,若它們的順序錯誤,則交換;重複進行,知道沒有需要交換為止。 以升序排序為例:        1.

MD5加密演算法C語言實現

md5.h #ifndef MD5_H #define MD5_H typedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffe

【作業系統】磁碟排程演算法 C++具體實現 (FCFS&SSFT&SCAN&C-SCAN&LOOK&C-LOOK)

先宣告一下全域性變數int initPosition,maxSize,numTrack;//磁頭所在位置,磁碟所能盛放的最大磁軌數目,要訪問的磁軌數 int cost;//磁頭總移動距離 vector<int> Track;//要訪問的磁軌們 vector<

非常值得一看—九種濾波演算法C語言實現

關注“嵌入式軟體開發學習圈”免費獲取更多學習教程 今天帶著大家學習濾波演算法c語言(九種濾波演算法)實現,以及程式碼,大家可以學習瞭解下。。。。 1.限幅濾波演算法(程式判斷濾波演算法) 方法解析: 根據經驗判斷,確定兩次取樣允許的最

CPU排程演算法C++模擬實現——(FCFS,SJF,RR)

FisrtComeFirstServe——先到先服務演算法按照程序進入就緒佇列的順序,來執行程序。用一個佇列維護即可。ShortestJobFirst——短作業優先演算法我實現的是非搶佔式SJF,可以通過優先佇列來判斷已ready且cpu burst最短的程序,但我不太熟,就

最短路徑之Dijkstra演算法 C語言實現

Dijkstra演算法(單源點路徑演算法,要求:圖中不存在負權值邊): 步驟: a.  初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即: U={其餘頂點},若v與U中頂點u有邊,則u的距離設定為相應的權值,若u v之間不存在邊,則    

SHA-256演算法 C語言實現

#include <stdio.h> #include <stdlib.h> #define SHA256_ROTL(a,b) (((a>>(32-b))&(0x7fffffff>>(31-b)))|(a<<

哈夫曼壓縮演算法C語言實現——步驟,詳細註釋原始碼

哈夫曼壓縮演算法的詳細實現步驟: 1、定義哈夫曼樹節點,用結構體。 2、利用C語言檔案讀寫,統計字元個數。 3、根據字元個數建立哈夫曼樹(不懂haffman資料結構的自己查下資料,我這裡就不再重複了) 4、根據哈夫曼樹為每個出現的字元編碼 5、壓縮:這裡涉及到位操作,用ch

爐石傳說爆牌魚斬殺演算法C語言實現

#include <stdio.h> int main() {     printf("請輸入敵方血量:\n");     int difangxue;     scanf("%d",&difangxue);     printf("請輸入自己血量:

九大排序演算法-C語言實現及詳解

概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裡說說八大排序就是內部排序。     當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快

Dijkstra演算法 c語言實現

 Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dijk