操作系统 银行家算法模拟(一)
发布日期:2021-09-30 15:11:48 浏览次数:9 分类:技术文章

本文共 2129 字,大约阅读时间需要 7 分钟。

操作系统 银行家算法模拟实现

这个是我的课程设计内容,我把我写的代码贴出来作参考。我会分成几部分更新,也会写每个函数的思路。最后会放出完整代码。

这个课程设计主要就是银行家算法的实现,最核心的就是模拟分配,若程序任然安全就完成此次分配,否则就撤回分配,返回之前的安全状态。我用的是C语言实现的。

功能函数:

1 判断当前资源是否安全的功能函数

思路:

  1) 先将需要判断的进程放在一个集合ProcessSet中,也就是不需要的进程置为-1即ProcessSet[i] = OUT,再将系统可用资源数拷贝一份CurrentAvailable

  2)寻找进程中是否有符合进程需要的资源<= 系统可用资源(need[j] <= CurrentAvailable),若有将系统资源数加上该进程已分配的资源数CurrentAvailable += allocation[j],

        还要将该进程置为-1即ProcessSet[i] = OUT,若找不到执行第三步,若找到继续执行第二步。

  3)判断进程是否都执行完成,若都完成返回安全,否则返回不安全

//判断是否安全

int isSafe(int process_count,int source_count,int **allocation,int **need,int * resource)
{
    int *CurrentAvailable;
    int *ProcessSet;
    int i;
    int j;
    int k;
    int *tmp_CurrentAvailable;
    int *tmp_ProcessSet;
    CurrentAvailable = (int *)malloc(sizeof(int) * source_count);
    ProcessSet = (int *)malloc(sizeof(int) * process_count);
    tmp_CurrentAvailable = (int *)malloc(sizeof(int) * source_count);
    tmp_ProcessSet = (int *)malloc(sizeof(int) * process_count);
    for(i = 0; i < process_count; i++)//已完成进程不参与模拟分配
    {
        //判断是否完成
        if(FINISH == done(source_count,i,need))
        {
            ProcessSet[i] = OUT;  
}
else
{
            ProcessSet[i] = IN;
}
    }
    for(j = 0; j < source_count; j++)//初始化资源
    {
        CurrentAvailable[j] = resource[j];
    }
    //拷贝
    for(i = 0; i < process_count; i++)
    {
        tmp_ProcessSet[i] = ProcessSet[i];         
    }
    for(j = 0; j < source_count; j++)
    {
        tmp_CurrentAvailable[j] = CurrentAvailable[j];
    }
    while(1)
    {
        j = 0;
        while(j < process_count)
{
   if(IN == ProcessSet[j])//找是否有可分配的
   {
       for(k = 0; k < source_count; k++)//每个资源是否符合
{
   if(need[j][k] > CurrentAvailable[k])
   {
       break;
   }
}
if(k == source_count)//符合
{
           ProcessSet[j] = OUT;
   for(k = 0; k < source_count; k++)
   {
       CurrentAvailable[k] += allocation[j][k];
   }
   break;
}
   }
   j++;
}
if(process_count == j)//没找到
{
   break;
}
    }
    for(i = 0; i < process_count; i++)
    {
    if(IN == ProcessSet[i])
{
            free(CurrentAvailable);
            free(ProcessSet);
            free(tmp_CurrentAvailable);
            free(tmp_ProcessSet);
   return DANGER;
}
    }
    free(CurrentAvailable);
    free(ProcessSet);
    printf("\n");
    allocate_list(source_count,process_count,allocation,need,tmp_CurrentAvailable,tmp_ProcessSet,1);//打印所有可能的序列
    free(tmp_CurrentAvailable);
    free(tmp_ProcessSet);
    return SAFE;
}

ps: allocate_list();//打印所有可能的序列 该函数下次介绍

转载地址:https://blog.csdn.net/Insanity666/article/details/53931533 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:操作系统 银行家算法模拟(二)
下一篇:数据库部分4

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月16日 21时08分24秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

arch Linux添加源,在Arch Linux系统中使用Archlinuxcn源(清华源)的方法 2019-04-21
私人linux远程连接,Linux远程连接 - osc_5g1gl9wp的个人空间 - OSCHINA - 中文开源技术交流社区... 2019-04-21
windows文件迁移到linux,从Windows到Linux迁移之文件服务器(Samba和AD完美结合) 2019-04-21
linux下vi编辑器的命令大全,linux下VI编辑器命令大全(超级完整版) 2019-04-21
linux结构体数组的定义数组,task_struct结构体中的run_list和array域 2019-04-21
C语言极坐标转直角坐标,C语言实现直角坐标转换为极坐标的方法 2019-04-21
16F877A和24C02通信汇编语言,PIC16f877A读写24c02程序 2019-04-21
用c语言编写小于n的所有素数,关于求N以内素数的一点小问题(N小于一亿) 2019-04-21
华为100万部鸿蒙,2019年Q4发布 华为100万部鸿蒙OS手机已开测 2019-04-21
android+大富翁+局域网,【图片】大富翁6局域网(LAN)多人联机教程(求精)_大富翁吧_百度贴吧... 2019-04-21
html5 video视频资源保护,HTML5 视频播放 <video> 2019-04-21
html表头跟随滚动,JS实现table表格固定表头且表头随横向滚动而滚动_心善_前端开发者... 2019-04-21
rn webview加载本地静态html,React Native - Webview 加载本地文件 2019-04-21
dax powerbi 生成表函数_Power BI |DAX函数のCALCULATETABLE、CALENDAR函数以及相关表生成函数... 2019-04-21
编程之类的文案_如何锻炼写文案的能力? 2019-04-21
vscode 不能使用中文输入法_vscode中vim插件设置 2019-04-21
当集合a为空集时a的取值范围_1.1.2 集合间的基本关系 2019-04-21
vue 可合并表格组件_Vue实战046:详解Mixins混入使用和注意事项 2019-04-21
python包怎么做双重差分did分析_多变量相关性分析(一个因变量与多个自变量) 2019-04-21
fi sap 凭证冲销 稅_SAP中的成本要素 2019-04-21