国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

操作系統(tǒng)動態(tài)內(nèi)存分配算法【C語言實現(xiàn)】

這篇具有很好參考價值的文章主要介紹了操作系統(tǒng)動態(tài)內(nèi)存分配算法【C語言實現(xiàn)】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  1. 課程設計題目與內(nèi)容

  1. 題目:采用五個算法,各自作業(yè)在1024kB空間上分配情況。
  1. 內(nèi)存可變分區(qū)分配仿真算法:首次適應,下次適應,最佳適應,最壞適應和快速分配。

使用的結構體數(shù)組表示起始地址,內(nèi)存塊大小,內(nèi)存塊狀態(tài)(0空閑,1占用)

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define L 10                        //宏定義,即把N的值定義為10

struct Info
{
    int startadress;
    int size;
    int state;

};
typedef struct Lnode{                //定義了一個Lnode結構體,其中包括起始地址,大小,狀態(tài);i
    int startaddress;                //起始地址
    int size;                        //內(nèi)存塊大小
    int state;                        //內(nèi)存塊狀態(tài)
        }LNode;                        // typedef把struct Lnode這個結構體類型名字重新定義為Lnode
LNode P[L]={{0,100,0},{100,200,0},{300,300,0},{600,400,0}};                //
LNode K[L]={{0,100,0},{100,200,0},{300,300,0},{600,400,0}};                //定義兩個是為了最壞適應算法 
int N=4;                                                                    //定義N的起始值為4

void bubbleprint(struct Info info[])函數(shù)是為了內(nèi)存塊大小從小到大排序,就可以用循環(huán)的方法更好地查找到作業(yè)所需要的內(nèi)存大小。也為了輸出屏幕看到的內(nèi)存數(shù)列有序。

void print()函數(shù)就是打印當前內(nèi)存分配情況。

void bubbleprint(struct Info info[]) //內(nèi)存從小到大排序,就可以用循環(huán)的方法
{
    int i,s;
    Info a[1];
        for(i=0;i<21;i++)
        {
            for(s=0;s<21-i;s++)
            {
                if(info[s].startadress>info[s+1].startadress&&s<20) 
                {
                    a[0]=info[s];
                    info[s]=info[s+1];
                    info[s+1]=a[0];
                }
            }
        }
        printf("Startaddress\tsize\tstate\n");
        for(i=0;i<21;i++)
        {
            if(info[i].size!=0)
            {
                printf("%3d\t  %8d\t%4d\n",info[i].startadress,info[i].size,info[i].state);
            }
        }
}

void print()
{                                                    //定義一個print()函數(shù),打印空間狀態(tài) 
    int i ,size;
    LNode j[10];int s=0;
    for(i=0;i<N;i++)
    {
        for(s=0;s<N-i;s++)
        {
            if(P[s].startaddress>P[s+1].startaddress&&s<N-1) 
            {
                j[0]=P[s];
                P[s]=P[s+1];
                P[s+1]=j[0];

            }
        }
    }
    for(i=0;i<N;i++)
    {
        int x=0;
        printf("%d",P[i].startaddress);
        for(size=P[i].size;size>0;size=size-100)
        {
            
            if( P[i].state == 1)
                {
                x+=1;
                printf("\t1111111111\t已占用\n");
                }

            else
                printf("\t~~~~~~~~~~\n");
                
        }
    }
    printf("Startaddress\tsize\tstate\n");                //在屏幕上打印Startaddress size state并換行
    for(i=0;i<N;i++)                                        //用for循環(huán),顯示內(nèi)存塊的分配狀況
    {
        printf("%3d\t  %8d\t%4d\n",P[i].startaddress,P[i].size,P[i].state);
    }
}
  1. 算法原理

  1. 首次適應分配算法

最先適應(first fit)分配算法。該算法順序查找未分配區(qū)表或鏈表,直至找到第一個能滿足長度要求的空閑區(qū)為止,分割此分區(qū),一部分分配給作業(yè),另一部分仍為空閑區(qū)(若有)。采用這一分配算法時,未分配區(qū)表或鏈表中的空閑區(qū)通常按地址從小到大排列。這樣,為進程分配內(nèi)存空間時從低地址部分的空閑區(qū)開始查找,可使高地址部分盡可能少用,以保持一個大空閑區(qū),有利于大作業(yè)裝入;但這樣做會使內(nèi)存低地址和高地址兩端的分區(qū)利用不均衡,也將給回收分區(qū)帶來麻煩,需要搜索未分配區(qū)表或鏈表來確定它在表格或鏈表中的位置且要移動相應登記項。

優(yōu)點:優(yōu)先利用內(nèi)存中低址部分的空閑分區(qū),從而保留了高址部分的大空閑區(qū),這為以后到達的大作業(yè)分配大的內(nèi)存空間創(chuàng)造了條件。

缺點:低址部分不斷被劃分,會留下許多難以利用的,很小的空閑分區(qū),稱為碎片。而每次查找又都是從低址部分開始的,這無疑又會增加查找可用空閑分區(qū)時的開銷。

以下是首次適應算法函數(shù):

void First(){                                                    //定義一個FirstO函數(shù){
    int i,l=0,m;                                                    //li用于循環(huán)內(nèi)存塊的塊數(shù);1為標識符,用于顯示分配成功; m為要分配的內(nèi)存大小
    printf("Please input the memory size:");
    scanf("%d",&m);                                        //輸入要分配的內(nèi)存大小
    for(i=0;i<N;i++)                                                //用循環(huán)依次尋找內(nèi)存塊的大小是否滿足輸入要分配的內(nèi)存大小{/遍歷是否滿足內(nèi)存塊的大小大于所輸入的要分配的內(nèi)存大小
    {
        if(P[i].size<m) continue;                    //如果小于的話,跳到下一次的循環(huán);直到找到大于等于為止,不然就退出該循環(huán)
        else if (P[i].size==m&&P[i].state!=1){                                        //如果內(nèi)存塊的大小等于所輸入要分配的內(nèi)存大小,則將
            P[i].state=1;                                                //該塊的內(nèi)存塊的狀態(tài)修改為1;
            l=1;                                            
            break;                                                        //退出循環(huán),直接跳到if (1==1||i<N)處
                }                            
        else if(P[i].size>m&&P[i].state!=1)                                       //如果該內(nèi)存塊的大小大于所輸入要分配的內(nèi)存大小
        {
            P[N].startaddress=P[i].startaddress+m;        //該內(nèi)存塊的起始地址與要輸入的分配的內(nèi)存塊天小之和的值賦予N塊的起始地址    
            P[N].size=P[i].size-m;                        //該內(nèi)存塊的起始地址減去要輸入的分配的內(nèi)存塊大小所得的值賦N塊的內(nèi)存夫小
            P[i].size=m;                                //把所輸入的分配的內(nèi)存塊大小的值賦給該塊的內(nèi)存大小
            P[i].state=1;                                //該塊的內(nèi)存塊狀態(tài)設置為1
            l=1;                                        //l設置為1
            N++;                                        //將N個地址塊變?yōu)镹+1個地址塊的塊號
            break;                                        //退出循環(huán),直接跳到if (1==1||i<N)處
        }                                
    }

    if(l==1||i<N)                        //如果 
    {
        printf("Address allocate successful\n\n");
        printf("state!!!!!!!!!!\n");
        print(); 
    }
    else printf("No used memory space!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
  1. 下次適應分配算法

下次適應(next fit)分配算法。該算法總是從未分配區(qū)的上次掃描結束處順序查找未分配區(qū)表或鏈表,直至找到第一個能滿足長度要求的空閑區(qū)為止,分割這個未分配區(qū),一部分分配給作業(yè),另一部分仍為空閑區(qū)(若有)。這一算法是最先適應分配算法的變種,能夠縮短平均查找時間,且存儲空間利用率更加均衡,不會導致小空閑區(qū)集中于內(nèi)存一端。

特點:能使內(nèi)存中的空閑區(qū)分布得較均勻。

以下是下次適應分配算法函數(shù):

void Next()
{
    int i=0,t=0,l=0,m,s,n;
    LNode j[10],Max[1]={0,0,0};
    printf("\n Plase input the size\n");
    scanf("%d",&n);
    m=n;
    for(i=0;i<N;i++)                //找出最大的內(nèi)存的容量 
    {
        if(Max[0].size<K[i].size)
            Max[0].size=K[i].size;
    }
    for(i=0;i<N;i++)
    {
        if(K[i].size<m)
        {
            if(K[i].state==0&&Max[0].size>m)
                {
                    for(int x=i;x<N-1;x++)            //把狀態(tài)為0的內(nèi)存后移 
                    {
                        j[0]=K[x];
                        K[x]=K[x+1];
                        K[x+1]=j[0];
                    }
                    i--;
                }
            else continue;
        }
            
        else if(K[i].size==m&&K[i].state!=1)
        {
            K[i].state=1;                                                //該塊的內(nèi)存塊的狀態(tài)修改為1;
            l=1;                                            
            break;
        }
        else if(K[i].size>m&&K[i].state!=1)
        {
            K[N].startaddress=K[i].startaddress+m;        //該內(nèi)存塊的起始地址與要輸入的分配的內(nèi)存塊天小之和的值賦予N塊的起始地址    
            K[N].size=K[i].size-m;                        //該內(nèi)存塊的起始地址減去要輸入的分配的內(nèi)存塊大小所得的值賦N塊的內(nèi)存夫小
            K[N].state=0;
            K[i].size=m;                                //把所輸入的分配的內(nèi)存塊大小的值賦給該塊的內(nèi)存大小
            K[i].state=1;                                //該塊的內(nèi)存塊狀態(tài)設置為1
            l=1;                                        //l設置為1
            N++;                                        //將N個地址塊變?yōu)镹+1個地址塊的塊號
            for(int min=N-1;min>i+1;min--)
            {
                j[0]=K[min];
                K[min]=K[min-1];
                K[min-1]=j[0];
             }
            break;    
        }
    }
    
    if(l==1||i<N)                        //如果 
    {
        printf("Address allocate successful\n\n");
        printf("state!!!!!!!!!!\n");
    }
    else printf("No used memory space!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
    
    memcpy(P,K,sizeof(K));
}
  1. 最優(yōu)適應分配算法

最優(yōu)適應(best fit)分配算法。該算法掃描整個未分配區(qū)表或鏈表,從空閑區(qū)中挑選一個能滿足用戶進程要求的最小分區(qū)進行分配。此算法保證不會分割一個更大的區(qū)域,使得裝入大作業(yè)的要求容易得到滿足,同時,通常把空閑區(qū)按長度遞增順序排列,查找時總是從最小一個空閑區(qū)開始,直至找到滿足要求的分區(qū)為止,這時最優(yōu)適應分配算法等同于最先適應分配算法。此算法的內(nèi)存利用率好,所找出的分區(qū)如果正好滿足要求則是最合適的;如果比所要求的分區(qū)略大則分割后會使剩下的空閑區(qū)很小,難以利用,其查找時間也是最長的。

優(yōu)點:每次分配給文件的都是最合適該文件大小的分區(qū)。

缺點:內(nèi)存中留下許多難以利用的小的空閑區(qū)(外碎片)

以下是最優(yōu)適應算法函數(shù):

void Best()
{
    int i,t=0,l=0,m,s;
    LNode j[10],a[10];
    printf("\n Plase input the size\n");
    scanf("%d",&m);
    for(i=0;i<N;i++)
    {
        j[i]=P[i];
    }

    for(i=0;i<N;i++)
    {
        for(s=0;s<N-i;s++)
        {
            if(j[s].size>j[s+1].size&&s<N-1) 
            {
                a[0]=j[s];
                j[s]=j[s+1];
                j[s+1]=a[0];

            }
        }
    }
    for(i=0;i<N;i++)
    {
        if(j[i].size<m) 
            continue;
        else if(j[i].size>=m&&j[i].state!=1)
        {
            j[i].state=1;
            for(int p=0;p<N;p++)
            {
                if(P[p].startaddress==j[i].startaddress)
                    P[p].state=1;
            }
            if(j[i].size>m)
            {
                P[N].startaddress=j[i].startaddress+m;        //該內(nèi)存塊的起始地址與要輸入的分配的內(nèi)存塊天小之和的值賦予N塊的起始地址    
                P[N].size=j[i].size-m;                        //該內(nèi)存塊的起始地址減去要輸入的分配的內(nèi)存塊大小所得的值賦N塊的內(nèi)存夫小
                j[i].size=m;                                //把所輸入的分配的內(nèi)存塊大小的值賦給該塊的內(nèi)存大小
                for(int p=0;p<N;p++)
                {
                    if(P[p].startaddress==j[i].startaddress)
                        P[p].size=m;
                }                            
                l=1;                                        //l設置為1
                N++;                                        //將N個地址塊變?yōu)镹+1個地址塊的塊號
            }
            l=1;
            break;
        } 
        
    }

    if(l==1||i<N)                         
    {
        printf("Address allocate successful\n\n");
        printf("state!!!!!!!!!!\n");
    }
    else printf("No used memory space!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
  1. 最壞適應分配算法

最壞適應(worst fit)分配算法。該算法掃描整個未分配區(qū)表或鏈表,總是挑選一個最大的空閑區(qū)分割給作業(yè)使用,其優(yōu)點是使剩下的空閑區(qū)不致過小,對中小型作業(yè)有利。采用此分配算法可把空閑區(qū)按長度遞減順序排列,查找時只需看第一個分區(qū)能否滿足進程要求,這樣使最壞適應分配算法的查找效率很高,此時,最壞適應分配算法等同于最先適應分配算法。

特點:盡可能的分配大的分區(qū)。

缺點:使得內(nèi)存缺乏大分區(qū),可能使得后續(xù)到來的大作業(yè)無法裝入內(nèi)存。

以下是最壞適應算法函數(shù):

void Worst()
{
    int i,t=0,l=0,m,s;
    LNode j[10],a[10];
    printf("\n Plase input the size\n");
    scanf("%d",&m);
    for(i=0;i<N;i++)
    {
        j[i]=P[i];
    }

    for(i=0;i<N;i++)
    {
        for(s=0;s<N-i;s++)
        {
            if(j[s].size<j[s+1].size&&s<N-1) 
            {
                a[0]=j[s];
                j[s]=j[s+1];
                j[s+1]=a[0];

            }
        }
    }
    for(i=0;i<N;i++)
    {
        if(j[i].size<m) 
            continue;
        else if(j[i].size>=m&&j[i].state!=1)
        {
            j[i].state=1;
            for(int p=0;p<N;p++)
            {
                if(P[p].startaddress==j[i].startaddress)
                    P[p].state=1;
            }
            if(j[i].size>m)
            {
                P[N].startaddress=j[i].startaddress+m;        //該內(nèi)存塊的起始地址與要輸入的分配的內(nèi)存塊天小之和的值賦予N塊的起始地址    
                P[N].size=j[i].size-m;                        //該內(nèi)存塊的起始地址減去要輸入的分配的內(nèi)存塊大小所得的值賦N塊的內(nèi)存夫小
                j[i].size=m;                                //把所輸入的分配的內(nèi)存塊大小的值賦給該塊的內(nèi)存大小
                for(int p=0;p<N;p++)
                {
                    if(P[p].startaddress==j[i].startaddress)
                        P[p].size=m;
                }
                l=1;                                        //l設置為1
                N++;                                        //將N個地址塊變?yōu)镹+1個地址塊的塊號
            }
            l=1;
            break;
        } 
        
    }

    if(l==1||i<N)                         
    {
        printf("Address allocate successful\n\n");
        printf("state!!!!!!!!!!\n");
    }
    else printf("No used memory space!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
  1. 快速適應分配算法

快速適應(quick fit)分配算法。該算法為那些經(jīng)常用到的長度的空閑區(qū)設立單獨的空閑區(qū)鏈表。例如,有一個n項的表,此表第一項是指向長度為2KB的空閑區(qū)鏈表表頭的指針,第二項是指向長度為4KB的空閑區(qū)鏈表表頭的指針,第三項是指向長度為8KB的空閑區(qū)鏈表表頭的指針,依此類推。像9KB這樣的空閑區(qū)既可放在8KB的鏈表中也可放在一個特殊的空閑區(qū)鏈表中。此算法查找十分快速,只要按進程長度直接搜索能容納它的最小空閑區(qū)鏈表并取第一塊分配,但歸還內(nèi)存空間時與相鄰空閑區(qū)的合并既復雜又費時。

優(yōu)點:該算法在分配時,不會對任何分區(qū)產(chǎn)生分割,所以能保留大的分區(qū),也不會產(chǎn)生內(nèi)存碎片。

缺點:在分區(qū)歸還主存時算法復雜,系統(tǒng)開銷較大。在分配空閑分區(qū)時是以進程為單位,一個分區(qū)只屬于一個進程,存在一定的浪費。空間換時間。

以下是快速適應分配算法的初始化函數(shù),本函數(shù)是1024kb內(nèi)存初始化,因為快速適應算法類似于二分法,剩余內(nèi)存取決于第一個作業(yè)的大小且都是2的冪(1,2,4,8,16.....)。

void init(struct Info info[] , int num)//本函數(shù)是1024kb內(nèi)存初始化,因為快速適應算法類似于二分法。 
{
int i,j;
for(i=0; i<11; i++)
{
if(pow(2,9)<=num && num<pow(2,10))
{
info[i].size = 1024;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 1024 - num;
info[i+1] .startadress = info[i].size;
info[i+1].state = 0;
i=1;
break;
}
if(pow(2,8)<=num && num<pow(2,9))//300
{
info[i].size = 512;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 512;
info[i+1] .startadress = 512;
info[i+1].state = 0;
i=2;
break;
}
if(pow(2,7)<=num && num<pow(2,8))
{
info[i].size = 256;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 256;
info[i+1] .startadress = 256;
info[i+1].state = 0;
info[i+2].size = 512;
info[i+2] .startadress =512;
info[i+2].state = 0;
i=3;
break;
}
if(pow(2,6)<=num && num<pow(2,7))
{
info[i].size = 128;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 128;
info[i+1] .startadress = 128;
info[i+1].state = 0;
info[i+2].size = 256;
info[i+2] .startadress = 256;
info[i+2].state = 0;
info[i+3].size = 512;
info[i+3] .startadress = 512;
info[i+3].state = 0;
i=4;
break;
}
if(pow(2,5)<=num && num<pow(2,6))
{
info[i].size = 64;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 64;
info[i+1] .startadress = 64;
info[i+1].state = 0;
info[i+2].size = 128;
info[i+2] .startadress = 128;
info[i+2].state = 0;
info[i+3].size = 256;
info[i+3] .startadress = 256;
info[i+3].state = 0;
info[i+4].size = 512;
info[i+4] .startadress = 512;
info[i+4].state = 0;
i=5;
break;
}
if(pow(2,4)<=num && num<pow(2,5))
{
info[i].size = 32;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 32;
info[i+1] .startadress = 32;
info[i+1].state = 0;
info[i+2].size = 64;
info[i+2] .startadress = 64;
info[i+2].state = 0;
info[i+3].size = 128;
info[i+3] .startadress = 128;
info[i+3].state = 0;
info[i+4].size = 256;
info[i+4] .startadress = 256;
info[i+4].state = 0;
info[i+5].size = 512;
info[i+5] .startadress = 512;
info[i+5].state = 0;
i=6;
break;
}
if(pow(2,3)<=num && num<pow(2,4))
{
info[i].size = 16;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 16;
info[i+1] .startadress = 16;
info[i+1].state = 0;
info[i+2].size = 32;
info[i+2] .startadress = 32;
info[i+2].state = 0;
info[i+3].size = 64;
info[i+3] .startadress = 64;
info[i+3].state = 0;
info[i+4].size = 128;
info[i+4] .startadress = 128;
info[i+4].state = 0;
info[i+5].size = 256;
info[i+5] .startadress = 256;
info[i+5].state = 0;
info[i+6].size = 512;
info[i+6] .startadress = 512;
info[i+6].state = 0;
i=7;
break;
}
if(pow(2,2)<=num && num<pow(2,3))
{
info[i].size = 8;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 8;
info[i+1] .startadress = 8;
info[i+1].state = 0;
info[i+2].size = 16;
info[i+2] .startadress = 16;
info[i+2].state = 0;
info[i+3].size = 32;
info[i+3] .startadress = 32;
info[i+3].state = 0;
info[i+4].size = 64;
info[i+4] .startadress = 64;
info[i+4].state = 0;
info[i+5].size = 128;
info[i+5] .startadress = 128;
info[i+5].state = 0;
info[i+6].size = 256;
info[i+6] .startadress =256;
info[i+6].state = 0;
info[i+7].size = 512;
info[i+7] .startadress = 512;
info[i+7].state = 0;
i=8;
break;
}
if(2<num && num<=4)
{
info[i].size = 4;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 4;
info[i+1] .startadress = 4;
info[i+1].state = 0;
info[i+2].size = 8;
info[i+2] .startadress = 8;
info[i+2].state = 0;
info[i+3].size = 16;
info[i+3] .startadress = 16;
info[i+3].state = 0;
info[i+4].size = 32;
info[i+4] .startadress = 32;
info[i+4].state = 0;
info[i+5].size = 64;
info[i+5] .startadress = 64;
info[i+5].state = 0;
info[i+6].size = 128;
info[i+6] .startadress = 128;
info[i+6].state = 0;
info[i+7].size = 256;
info[i+7] .startadress = 256;
info[i+7].state = 0;
info[i+8].size = 512;
info[i+8] .startadress = 512;
info[i+8].state = 0;
i=9;
break;
}
if(num==2)
{
info[i].size = 2;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 2;
info[i+1] .startadress = 2;
info[i+1].state = 0;
info[i+2].size = 4;
info[i+2] .startadress = 4;
info[i+2].state = 0;
info[i+3].size = 8;
info[i+3] .startadress =8;
info[i+3].state = 0;
info[i+4].size = 16;
info[i+4] .startadress = 16;
info[i+4].state = 0;
info[i+5].size = 32;
info[i+5] .startadress = 32;
info[i+5].state = 0;
info[i+6].size = 64;
info[i+6] .startadress = 64;
info[i+6].state = 0;
info[i+7].size = 128;
info[i+7] .startadress = 128;
info[i+7].state = 0;
info[i+8].size = 256;
info[i+8] .startadress = 256;
info[i+8].state = 0;
info[i+9].size = 512;
info[i+9] .startadress = 512;
info[i+9].state = 0;
i=10;
break;
}
if(num==1)
{
info[i].size = 1;
info[i] .startadress = 0;
info[i].state = 1;
info[i+1].size = 1;
info[i+1] .startadress = 1;
info[i+1].state = 0;
info[i+2].size = 2;
info[i+2] .startadress = 2;
info[i+2].state = 0;
info[i+3].size = 4;
info[i+3] .startadress = 4;
info[i+3].state = 0;
info[i+4].size = 8;
info[i+4] .startadress =8;
info[i+4].state = 0;
info[i+5].size = 16;
info[i+5] .startadress = 16;
info[i+5].state = 0;
info[i+6].size = 32;
info[i+6] .startadress = 32;
info[i+6].state = 0;
info[i+7].size = 64;
info[i+7] .startadress = 64;
info[i+7].state = 0;
info[i+8].size = 128;
info[i+8] .startadress = 128;
info[i+8].state = 0;
info[i+9].size = 256;
info[i+9] .startadress = 256;
info[i+9].state = 0;
info[i+10].size = 512;
info[i+10] .startadress = 512;
info[i+10].state = 0;
i=11;
break;
}
}
struct Info q[10];int s=0,size;
for(int j=0;j<i;j++)
{
int x=0;
printf("%d",info[j].startadress);
for(size=info[j].size;size>0;size=size-100)
{
if( info[j].state == 1)
{
x+=1;
printf("\t1111111111\t已占用\n");
}
elseprintf("\t~~~~~~~~~~\n");
}
}
printf("Startaddress\tsize\tstate\n");
for(int j=0;j<i;j++)//用for循環(huán),顯示內(nèi)存塊的分配狀況
{
printf("%3d\t  %8d\t%4d\n",info[j].startadress,info[j].size,info[j].state);
}
}

以下是快速適應分配算法函數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-775592.html

void buddy(struct Info info[], int num)
{
    int i, j, k,n;
    for(i=0; i<21; i++)
    {
        if( info[i].size >= num&&info[i].state == 0&&info[i].size/2 <num)
        {
            info[i].state=1;
            break;
        }
        else if(num>info[i].size)
        {
            continue;
        }
        else if(info[i].size >= num&&info[i].state == 0&&info[i].size/2 >=num)
        {
            for(int y=0;info[i].size/2>=num;y++)
            {
                if(info[i].size/2>=num)
                {
                    info[i].size/=2;
                    info[i].state=1;
                    for(int l=0;l<21;l++)
                    {
                        if(info[l].size==0)
                        {
                        info[l].startadress=info[i].startadress+info[i].size;
                        info[l].size=info[i].size;
                        break;
                        }
                    }
                }
            }
        break;
        }
    }
}

主函數(shù)代碼塊:

int main()    
{                                //主函數(shù)main()
    int k=0;                                //定義一個整型變量k,用于選擇方法與退出
    printf("Please choose the method\n");
    while(k!=6)                                //當k不等于3時
    {
        printf("\n~~~~~~~~~~~~~Memorymethods~~~~~~~~~~~~~~~~");
        printf("\nl.First method\n2.Best method\n3.Worst method\n4.Next method\n5.Buddy method");//第一種方法是最先適應內(nèi)存分配法,第二種方法是最優(yōu)適應內(nèi)存分配法
        printf("\n6.Exit\n");//3為退出程序
        printf("Please choose the method!");//提示輸入數(shù)字選擇哪種方法或退出程序
        scanf("%d",&k);//輸入k的值
        switch(k)
        {
            case 1:
                while(1)
                {
                    printf("\n Initialization(~~~~~~~表示內(nèi)存):\n");//打印此字符串,用于提示內(nèi)存初始化
                    print();
                    First();
                    if(getchar()=='e')
                    {
                        return 0;
                    }
                }
                break;
            case 2:
                while(1)
                {
                    printf("\n Initialization(~~~~~~~表示內(nèi)存):\n");//打印此字符串,用于提示內(nèi)存初始化
                    print();
                    Best();
                    if(getchar()=='e')
                    {
                        return 0;
                    }
                }
                break;            
            case 3:
                while(1)
                {
                    printf("\n Initialization(~~~~~~~表示內(nèi)存):\n");//打印此字符串,用于提示內(nèi)存初始化
                    print();
                    Worst();
                    if(getchar()=='e')
                    {
                        return 0;
                    }
                }
                break;
            case 4:
                while(1)
                {
                    printf("\n Initialization(~~~~~~~表示內(nèi)存):\n");//打印此字符串,用于提示內(nèi)存初始化
                    print();
                    Next();
                    if(getchar()=='e')
                    {
                        return 0;
                    }
                }
                break;
                continue;
            case 5:
                {
                int num,x=0;
                struct Info info[21]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};                    
                printf("|1024|");
                printf("\nPlease input the size:");
                scanf("%d", &num);
                x+=num;
                init(info, num);
                while(1)
                {
                    printf("\nPlease input a num:");
                    scanf("%d", &num);
                    x+=num;
                    fflush(stdin);
                    if(x > 1023) 
                    {
                        printf("The num is too big , try littler\n");
                        break;
                    }
                    else buddy(info,num);
                    bubbleprint(info);
                }
                system("pause");
                
                }            
            case 6:
                break;                
            default:printf("Choose error\n");
        } 
    }
}

運行結果:

首次適應算法給作業(yè)分配內(nèi)存的算法c語言,c語言,Powered by 金山文檔

到了這里,關于操作系統(tǒng)動態(tài)內(nèi)存分配算法【C語言實現(xiàn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 編寫C語言程序,模擬實現(xiàn)首次/最佳/最壞適應算法的內(nèi)存塊分配和回收,要求每次分配和回收后顯示出空閑分區(qū)和已分配分區(qū)的情況。假設初始狀態(tài)下,可用的內(nèi)存空間為640KB。(江西師范大學軟件學院 操作系統(tǒng))

    為了實現(xiàn)動態(tài)分區(qū)分配,通常將系統(tǒng)中的空閑分區(qū)鏈接成一個鏈。所謂順序查找是指依次搜索空閑分區(qū)鏈上的空閑分區(qū),去尋找一個大小能滿足要求的分區(qū)。 --------計算機操作系統(tǒng)(第四版) 可變分區(qū)也稱動態(tài)分區(qū),在指作業(yè)裝入內(nèi)存時,從可用的內(nèi)存中劃出一塊連續(xù)的區(qū)域

    2024年02月08日
    瀏覽(22)
  • 【操作系統(tǒng)】基于動態(tài)優(yōu)先級的進程調度算法-C語言實現(xiàn)(有代碼)

    【操作系統(tǒng)】基于動態(tài)優(yōu)先級的進程調度算法-C語言實現(xiàn)(有代碼)

    本文章將會介紹如何編寫動態(tài)優(yōu)先級的進程調度算法,并使用從語言實現(xiàn)。 一、什么是動態(tài)優(yōu)先級的調度算法 ? ? ? ?進程運行一個時間片后,如果進程已占用 CPU時間已達到所需要的運行時間,則撤消該進程;如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行

    2024年02月06日
    瀏覽(29)
  • c語言:通訊錄管理系統(tǒng)(動態(tài)分配內(nèi)存版)

    c語言:通訊錄管理系統(tǒng)(動態(tài)分配內(nèi)存版)

    前言: 本通訊錄管理系統(tǒng)一共三個版本,除此文章以外還有如下倆個版本,大家可以根據(jù)需求自取: 基礎增刪查改功能版本 :c語言:通訊錄管理系統(tǒng)(增刪查改)_luming.02的博客-CSDN博客 文件保存版本 :c語言:通訊錄管理系統(tǒng)(文件版本)-CSDN博客 ????????本文是在基

    2024年02月08日
    瀏覽(104)
  • 虛擬內(nèi)存頁面置換算法(操作系統(tǒng))

    虛擬內(nèi)存頁面置換算法(操作系統(tǒng))

    通過這次實驗,加深對虛擬內(nèi)存頁面置換概念的理解,進一步掌握先進先出FIFO、最佳置換OPI和最近最久未使用LRU頁面置換算法的實現(xiàn)方法。 問題描述: 設計程序模擬先進先出FIFO、最佳置換OPI和最近最久未使用LRU頁面置換算法的工作過程。假設內(nèi)存中分配給每個進程的最小物

    2024年02月04日
    瀏覽(22)
  • 【操作系統(tǒng)】虛擬內(nèi)存相關&分段分頁&頁面置換算法

    【操作系統(tǒng)】虛擬內(nèi)存相關&分段分頁&頁面置換算法

    【進程地址空間=虛擬地址空間=C/C++程序地址空間就是那個4G的空間】 虛擬內(nèi)存是操作系統(tǒng)內(nèi)核為了對進程地址空間進行管理,而設計的一個邏輯意義上的內(nèi)存空間概念。在程序運行過程中,虛擬內(nèi)存中需要被訪問的部分會被映射到物理內(nèi)存空間中, CPU 通過將虛擬地址翻譯成

    2024年02月12日
    瀏覽(23)
  • 【操作系統(tǒng)筆記04】操作系統(tǒng)之內(nèi)存管理方式(分頁、分段、段頁式)、虛擬存儲技術、頁面置換算法

    這篇文章,主要介紹操作系統(tǒng)之內(nèi)存管理方式(分頁、分段、段頁式)、虛擬存儲技術、頁面置換算法。 目錄 一、操作系統(tǒng) 1.1、基地址變換機構 1.2、具有快表的地址變換機構

    2023年04月21日
    瀏覽(25)
  • C語言嵌入式系統(tǒng)編程注意事項之內(nèi)存操作

    C語言嵌入式系統(tǒng)編程注意事項之內(nèi)存操作

    在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力 數(shù)據(jù)指針 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言

    2024年02月09日
    瀏覽(25)
  • 【進階C語言】動態(tài)內(nèi)存分配

    【進階C語言】動態(tài)內(nèi)存分配

    本章大致內(nèi)容介紹: 1.malloc函數(shù)和free函數(shù) 2.calloc函數(shù) 3.realloc函數(shù) 4.常見錯誤案例 5.筆試題詳解 6.柔性數(shù)組 1.malloc函數(shù) (1)函數(shù)原型 函數(shù)參數(shù): 根據(jù)用戶的需求需要開辟多大的字節(jié)空間,為無符號的字節(jié)。 返回值: malloc函數(shù)成功開辟內(nèi)存后,會返回該內(nèi)存的起始地址,可

    2024年02月07日
    瀏覽(18)
  • 內(nèi)存動態(tài)分區(qū)分配算法

    內(nèi)存動態(tài)分區(qū)分配算法

    所謂動態(tài)分區(qū)分配,就是指 內(nèi)存在初始時不會劃分區(qū)域,而是會在進程裝入時,根據(jù)所要裝入的進程大小動態(tài)地對內(nèi)存空間進行劃分,以提高內(nèi)存空間利用率,降低碎片的大小 動態(tài)分區(qū)分配算法有以下四種: 1. 首次適應算法(First Fit) 空閑分區(qū)以 地址遞增的次序鏈接 。分

    2024年02月11日
    瀏覽(26)
  • 詳解C語言—動態(tài)內(nèi)存分配(二)

    詳解C語言—動態(tài)內(nèi)存分配(二)

    目錄 前言: 幾個經(jīng)典的例題題 例一: 例二: 例三: 例四: 例五:? ?C/C++程序的內(nèi)存開辟 柔性數(shù)組 柔性數(shù)組的特點: 柔性數(shù)組的使用:? 柔性數(shù)組的代替: 柔性數(shù)組的優(yōu)勢: 小結: 希望在復習完詳解C語言—動態(tài)內(nèi)存分配(一)???????,閱讀此篇文章會進一步提升

    2024年02月08日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包