操作系统动态分区管理(最先分配,最优分配,最坏分配算法)

 直接附源码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MaxSize = 1024;
void showblocklist();
typedef struct
{
    int size, toploc, botloc,id;
}process;
typedef struct
{
    int size, toploc, botloc;
    vector<process> processlist;
}block;
vector<block> blocklist;
bool cmpfirst(block a, block b)
{
    return a.toploc < b.toploc;
}
bool cmpbest(block a, block b)
{
    return a.size < b.size;
}
bool cmpworst(block a, block b)
{
    return a.size > b.size;
}
void hebing()
{
    sort(blocklist.begin(), blocklist.end(), cmpfirst);
    for (int i = 0; i < blocklist.size()-1; i++)
    {
        if (blocklist[i].botloc+1==blocklist[i+1].toploc)
        {
            blocklist[i].botloc = blocklist[i + 1].botloc;
            blocklist[i].size = blocklist[i].size + blocklist[i + 1].size;
            blocklist.erase(blocklist.begin()+i+1);
            i = 0;
        }
    }
    return;
}
void creatblock(int choice) {
    int tempsize = 0,temploc=0;
    cout << "请输入内存大小"<<endl;
    cin >> tempsize;
    cout << "请输入内存首地址" << endl;
    cin >> temploc;
    //若内存为空
    if (blocklist.empty()) {
        if(temploc+tempsize>MaxSize)
        {
            cout << "超出内存上限无法插入" << endl;
            return;
        }
        else
        {
            block tempblock;
            tempblock.size = tempsize;
            tempblock.toploc = temploc;
            tempblock.botloc = temploc + tempsize-1;
            blocklist.push_back(tempblock);
        }
        showblocklist();
        cout << "新建内存块成功" << endl;
    }
    // 若内存不为空
    else
    {
        if (temploc + tempsize > MaxSize)
        {
            cout << "超出内存上限无法插入" << endl;
            return;
        }
        for (int i = 0; i < blocklist.size(); i++)
        {
            if ((temploc >= blocklist[i].toploc && temploc <= blocklist[i].botloc) || (temploc + tempsize-1 >= blocklist[i].toploc && temploc + tempsize-1 <= blocklist[i].botloc))
            {
                cout << "该内存块已经被使用" << endl;
                return;
            }
        }
        block tempblock;
        tempblock.size = tempsize;
        tempblock.toploc = temploc;
        tempblock.botloc = temploc + tempsize-1;
        blocklist.push_back(tempblock);
        hebing();
        if (choice==1)
        {
            sort(blocklist.begin(), blocklist.end(), cmpfirst);
        }
        else if (choice==2)
        {
            sort(blocklist.begin(), blocklist.end(), cmpbest);
        }
        else if (choice==3)
        {
            sort(blocklist.begin(), blocklist.end(), cmpworst);
        }
        cout << "新建内存块成功" << endl;
        showblocklist();
    }
}

void showblocklist()
{
    if (blocklist.empty())
    {
        cout << "内存块为空" << endl;
        return;
    }
    cout << "-----------------------------" << endl;
    cout << "首地址    内存大小    尾地址" << endl;
    cout << "-----------------------------" << endl;
    for (int i = 0; i < blocklist.size(); i++)
    {
        cout<< blocklist[i].toploc<<"          "<<blocklist[i].size<<"         "<<blocklist[i].botloc << endl;
        cout << "-----------------------------" << endl;
    }
}
void showprocesslist()
{
    int flag = 0;
    cout << "-----------------------------" << endl;
    cout << "编号    首地址    大小    地址" << endl;
    cout << "-----------------------------" << endl;
    for (int i = 0; i < blocklist.size(); i++)
    {
        for (int j = 0; j < blocklist[i].processlist.size(); j++)
        {
            cout << blocklist[i].processlist[j].id<<"       "<< blocklist[i].processlist[j].toploc<<"           "<< blocklist[i].processlist[j].size <<"      "<< blocklist[i].processlist[j].botloc<< endl;
            cout << "-----------------------------"<< endl;
            flag = 1;
        }
    }
    if (flag==0)
    {
        cout << "进程为空" << endl;
        return;
    }
    return;
}
//最先分配
void firstfunc(process waitinsert)
{
    int tempsize,tempid;
    cout << "请输入进程大小" << endl;
    cin >> tempsize;
    cout << "请输入进程id" << endl;
    cin >> tempid;
    waitinsert.size = tempsize;
    waitinsert.id = tempid;
    for (int i = 0; i < blocklist.size(); i++)
    {
        if (waitinsert.size<=blocklist[i].size)
        {
            waitinsert.toploc = blocklist[i].toploc;
            waitinsert.botloc = blocklist[i].toploc + waitinsert.size-1;
            blocklist[i].toploc = blocklist[i].toploc + waitinsert.size;
            blocklist[i].size = blocklist[i].size - waitinsert.size;
            blocklist[i].processlist.push_back(waitinsert);
            cout << "插入成功" << endl;
            return;
        }
    }
    cout << "插入失败" << endl;
    return;
}
//最优分配
void bestfunc(process waitinsert)
{
    int tempsize, tempid;
    cout << "请输入进程大小" << endl;
    cin >> tempsize;
    cout << "请输入进程id" << endl;
    cin >> tempid;
    waitinsert.size = tempsize;
    waitinsert.id = tempid;
    for (int i = 0; i < blocklist.size(); i++)
    {
        if (waitinsert.size <= blocklist[i].size)
        {
            waitinsert.toploc = blocklist[i].toploc;
            waitinsert.botloc = blocklist[i].toploc + waitinsert.size-1;
            blocklist[i].toploc = blocklist[i].toploc + waitinsert.size;
            blocklist[i].size = blocklist[i].size - waitinsert.size;
            blocklist[i].processlist.push_back(waitinsert);
            sort(blocklist.begin(), blocklist.end(), cmpbest);
            cout << "插入成功" << endl;
            return;
        }
    }
    cout << "插入失败" << endl;
    return;
}
//最坏分配
void worstfunc(process waitinsert)
{
        int tempsize, tempid;
        cout << "请输入进程大小" << endl;
        cin >> tempsize;
        cout << "请输入进程id" << endl;
        cin >> tempid;
        waitinsert.size = tempsize;
        waitinsert.id = tempid;
        if (waitinsert.size <= blocklist[0].size)
        {
            waitinsert.toploc = blocklist[0].toploc;
            waitinsert.botloc = blocklist[0].toploc + waitinsert.size-1;
            blocklist[0].toploc = blocklist[0].toploc + waitinsert.size;
            blocklist[0].size = blocklist[0].size - waitinsert.size;
            blocklist[0].processlist.push_back(waitinsert);
            sort(blocklist.begin(), blocklist.end(), cmpworst);
            cout << "插入成功" << endl;
            return;
        }
    cout << "插入失败" << endl;
    return;
}

void insertprocess(int choice)
{
    process temp;
    temp.botloc = 0; temp.id = 0; temp.size = 0; temp.toploc = 0;
    if (choice==1)
    {
        sort(blocklist.begin(), blocklist.end(), cmpfirst);
        firstfunc(temp);
        showblocklist();
    }
    else if(choice==2)
    {
        sort(blocklist.begin(), blocklist.end(), cmpbest);
        bestfunc(temp);
        showblocklist();
    }
    else if (choice == 3)
    {
        sort(blocklist.begin(), blocklist.end(), cmpworst);
        worstfunc(temp);
        showblocklist();
    }
}
void deleteprocess(int choice)
{
    //为应对存在与上下两个空闲区接壤的情况
    sort(blocklist.begin(), blocklist.end(), cmpfirst);
    int tempid;
    cout << "请输入要回收的进程编号" << endl;
    cin >> tempid;
    for (int i = 0; i < blocklist.size(); i++)
    {
        for ( int j = 0; j < blocklist[i].processlist.size(); j++)
        {
            if (blocklist[i].processlist[j].id==tempid)
            {
                //与上空闲区接壤
                if(blocklist[i].processlist[j].toploc == blocklist[i].botloc+1)
                {
                    blocklist[i].botloc= blocklist[i].processlist[j].botloc;
                    blocklist[i].size = blocklist[i].size + blocklist[i].processlist[j].size;
                    blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
                    // 防止出现回收进程后两个相邻内存块能够合并的情况。
                    hebing();
                    if (choice == 1)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpfirst);
                    }
                    else if (choice == 2)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpbest);
                    }
                    else if (choice == 3)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpworst);
                    }
                    cout << "删除完成" << endl;
                    showblocklist();
                    //此处不return会导致越界问题。
                    return;
                }
                //与下空闲区接壤
                else if(blocklist[i].processlist[j].botloc == blocklist[i].toploc-1)
                {
                    blocklist[i].toploc = blocklist[i].processlist[j].toploc;
                    blocklist[i].size = blocklist[i].size + blocklist[i].processlist[j].size;
                    blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
                    hebing();
                    if (choice == 1)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpfirst);
                    }
                    else if (choice == 2)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpbest);
                    }
                    else if (choice == 3)
                    {
                        sort(blocklist.begin(), blocklist.end(), cmpworst);
                    }
                    cout << "删除完成" << endl;
                    showblocklist();
                    return;
                }
                //不与空闲区接壤
                else if(blocklist[i].processlist[j].toploc != blocklist[i].botloc + 1&& blocklist[i].processlist[j].botloc != blocklist[i].toploc - 1)
                {
                    //若当前内存块大小为0
                    if (blocklist[i].size == 0)
                    {
                        blocklist[i].toploc = blocklist[i].processlist[j].toploc;
                        blocklist[i].botloc = blocklist[i].processlist[j].botloc;
                        blocklist[i].size = blocklist[i].processlist[j].size;
                        blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
                        hebing();
                        if (choice == 1)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpfirst);
                        }
                        else if (choice == 2)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpbest);
                        }
                        else if (choice == 3)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpworst);
                        }
                        cout << "删除完成" << endl;
                        showblocklist();
                        return;
                    }
                    else
                    {
                        block tempblock;
                        tempblock.toploc = blocklist[i].processlist[j].toploc;
                        tempblock.botloc = blocklist[i].processlist[j].botloc;
                        tempblock.size = blocklist[i].processlist[j].size;
                        blocklist[i].processlist.erase(blocklist[i].processlist.begin() + j);
                        blocklist.push_back(tempblock);
                        hebing();
                        if (choice == 1)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpfirst);
                        }
                        else if (choice == 2)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpbest);
                        }
                        else if (choice == 3)
                        {
                            sort(blocklist.begin(), blocklist.end(), cmpworst);
                        }
                        cout << "删除完成" << endl;
                        showblocklist();
                        return;
                    }
                }
            }
        }
    }
}
void showcontrollist()
{
    cout << "-----------请选择操作----------" << endl;
    cout << "0.退出" << endl;
    cout << "1.添加内存" << endl;
    cout << "2.内存列表" << endl;
    cout << "3.添加进程(id不重复)"<<endl;
    cout << "4.回收进程" << endl;
    cout << "5.进程列表" << endl;
    cout << "--------------------------------" << endl;
}

int main()
{
    /*
    cout << "请选择你要采用的分配策略" << endl;
    cout << "1.最先分配策略" << endl;
    cout << "2.最优分配策略" << endl;
    cout << "3.最坏分配策略" << endl;
    cin >> funcchoice;
    */
    int funcchoice;
    showcontrollist();
    int choice;
    cout << "请输入操作" << endl;
    cin >> choice;
    while (choice!=0)
    {
        if (choice==1)
        {
            cout << "请选择分配的算法" << endl;
            cout << "1.最先分配策略" << endl;
            cout << "2.最优分配策略" << endl;
            cout << "3.最坏分配策略" << endl;
            cin >> funcchoice;
            creatblock(funcchoice);
        }
        else if (choice==2)
        {
            showblocklist();
        }
        else if( choice==3)
        {
            cout << "请选择分配的算法" << endl;
            cout << "1.最先分配策略" << endl;
            cout << "2.最优分配策略" << endl;
            cout << "3.最坏分配策略" << endl;
            cin >> funcchoice;
            insertprocess(funcchoice);
        }
        else if (choice == 4)
        {
            deleteprocess(funcchoice);
        }
        else if (choice==5)
        {
            showprocesslist();
        }
        showcontrollist();
        cout << "请输入操作" << endl;
        cin >> choice;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值