bestfit算法实现主存的分配与回收

本来想用二分来写 用vector调整边界时遇到了点麻烦
改成了很线性的方法 很好懂(

//cyc
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define mst(a) memset(a,0,sizeof a)
using namespace std;
typedef pair<int,int> pii;
/*
 空を眺めると
    そこには僕が居て
*/
const int maxn=1e4+5;
const int maxp=1e6+5;
int recvis[maxn];//占用
int vis[maxn];//差分数组

//
void overall()
{
    int rec=0;
    for(int i=0;i<maxn;i++){
        rec+=vis[i];
        recvis[i]=rec;
    }
}
int blankcheck(int sz)
{
    int st,ed;
    st=-1;
    int szfit=-1;
    int pos=-1;
    for(int i=0;i<maxn;i++){
        if(!recvis[i]){
            if(st==-1)st=i;

            ed=i;

        }
        else{
            if(st!=-1){
                int len=ed-st+1;
                if(len>=sz){
                    if(szfit==-1){
                        szfit=len-sz;
                        pos=st;
                    }
                    else{
                        if(len-sz<szfit){
                            szfit=len-sz;
                            pos=st;
                        }
                    }
                }


            }
            st=-1;
        }
    }
    return pos;
}
/*
3
1 1000
3000 2000
6000 3000
*/
int psize[maxn];
int pstart[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,sz,st;
    vis[10001]=1;
    int cnt=0;
    while(true){
    char key;
    cin>>key;
    if(key=='p'){
    cout<<"preset"<<endl;
    cin>>n;

    for(int i=1;i<=n;i++){
        cnt++;
        cin>>st>>sz;
        vis[st]=1;
        vis[st+sz]=-1;
        overall();
        pstart[cnt]=st;
        psize[cnt]=sz;
        cout<<"process "<<cnt<<" "<<"start from "<<st<<" end at "<<st+sz-1<<endl;
    }
    }
    //overall();
    if(key=='a'){
    cout<<"add process"<<endl;
    cin>>n;
    for(int i=1;i<=n;i++){

        cin>>sz;
        int x=blankcheck(sz);
        if(x==-1)cout<<"impossible"<<endl;
        else{
            cnt++;
            vis[x]+=1;
            vis[x+sz]+=-1;
            overall();
            pstart[cnt]=x;
            psize[cnt]=sz;
            cout<<"process "<<cnt<<" "<<"start from "<<x<<" end at "<<x+sz-1<<endl;
        }
    }
    }
    if(key=='r'){
    cout<<"remove process"<<endl;
    cin>>n;
    for(int i=1;i<=n;i++){
        int p;
        cin>>p;
        if(p>cnt)cout<<"bound exceed"<<endl;
        else{
            vis[pstart[p]]=0;
            vis[pstart[p]+psize[p]]=0;
            overall();
            cout<<"process "<<p<<" released"<<endl;
        }
    }
    }
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储器的分配回收算法实现操作系统中非常重要的一部分,以下是常见的分配回收算法实现: 1. 首次适应算法(First Fit):该算法从内存区域的起始位置开始搜索,找到第一个能够满足分配要求的内存块。时间复杂度为O(n),效率较低,但是实现简单。 2. 循环首次适应算法(Next Fit):该算法从上一次分配结束的位置开始搜索,找到第一个能够满足分配要求的内存块。该算法相比于首次适应算法,能够减少搜索的范围,但是仍然存在效率低下的问题。 3. 最佳适应算法(Best Fit):该算法从所有可用的内存块中,选择最小的那个能够满足分配要求的内存块。该算法可以充分利用内存资源,但是由于需要搜索所有可用内存块,时间复杂度较高。 4. 最差适应算法(Worst Fit):该算法从所有可用的内存块中,选择最大的那个能够满足分配要求的内存块。该算法可以减少内存碎片的数量,但是由于需要搜索所有可用内存块,时间复杂度较高。 5. 快速适应算法(Quick Fit):该算法将内存分为若干个大小相同的块,每个块中保存相应大小的空闲块链表。当需要分配内存时,就从相应的链表中取出一块,满足分配需求。该算法可以减少内存碎片的数量,且搜索时间较短,但是实现较为复杂。 6. 分区式存储管理:该算法将内存分成若干个大小相等的分区,每个分区只能被一个进程占用。当需要分配内存时,就从空闲分区中选择一个能够满足分配要求的分区,将其分配给进程。当进程结束时,将其占用的分区释放,变成空闲分区。该算法可以避免内存碎片的产生,但是分区大小固定,可能会造成浪费。 以上是常见的存储器的分配回收算法实现,不同的算法适用于不同的场景,需要根据实际情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值