Linux环境下银行家算法,C语言实现 操作系统 银行家算法

Linux环境下银行家算法,C语言实现 操作系统 银行家算法C语言实现操作系统银行家算法/**************************************************银行家算法:主要的思想是舍大取小,先满足小的,最后才满足大的。author:lybdate:2014/10/15***************************************************/#include#include#inc…

大家好,又见面了,我是你们的朋友全栈君。

C语言实现 操作系统 银行家算法

/**************************************************

银行家算法:

主要的思想是 舍大取小,先满足小的,最后才满足大的。

author: lyb

date: 2014/10/15

***************************************************/

#include

#include

#include

#include

// 进程运行状态标志

#define TRUE 1

#define FALSE 0

#define WAIT -1

/* version 1

#define PMAX 20 // 假设最大的进程的数目

#define RMAX 20 // 假设最大的资源的分类数

int Resource[RMAX] = {0};    // 各类资源的总量

int Max[PMAX][RMAX] = {0};    // 各资源的最大需求量

int Need[PMAX][RMAX] = {0};    // 各进程需求的资源量

int Allocation[PMAX][RMAX] = {0};  // 已分配的资源量

int Available[RMAX] = {0};    // 剩余可用的资源量

*/

// version 2  采用动态分配数组,为了函数调用的方便,使用全局指针

int *Resource = NULL;     // 各类资源的总量

int *Max  = NULL;     // 各资源的最大需求量

int *Need  = NULL;     // 各进程需求的资源量

int *Allocation = NULL;     // 已分配的资源量

int *Available = NULL;     // 剩余可用的资源量

// 检测此时的系统分配状态是否安全 (核心函数)

int testStatus(const int P, const int R)

{

int finish = 0;    // 运行完成的进程数

int wait = 0;    // 等待的进程数

int minR = 0;    // 最小的资源数

int minP = 0;    // 最小需求资源的进程

int i = 0;

int j = 0;

int k = 0;

int l = 0;

int *status = (int*)malloc(P*sizeof(int));    // 进程的状态

int *Available_tmp = (int*)malloc(R*sizeof(int)); // Available_tmp 是 Available的一份拷贝

if (status != NULL && Available_tmp != NULL)

{

// 所有进程状态置零

memset(status, FALSE, P*sizeof(int));

// 这里拷贝 Available

memcpy(Available_tmp, Available, R*sizeof(int));

}

else

{

printf(“pointer NULL\n”);

return FALSE;

}

while( finish != P && wait != P)

{

// 以第一类资源为基准,选取该资源需求量最小的进程

minR = Resource[0];  // 这里选取最大值,方便后面的比较获取最小值

minP = 0;

for (i=0; i

{

if (status[i] == FALSE && Need[i*R + 0] < minR)

{

minR = Need[i*R + 0];

minP = i;

}

}

//printf(“%d\n”, minP);

// 验证挑选出来的进程能否满足

for (j=0; j

{

if (Need[minP*R + j] > Available_tmp[j])

{

break;

}

}

if (j == R)  // 能够满足

{

//printf(“P%d\t”, minP);  //打印成功分配的进程

status[minP] = TRUE;

finish++;

// 如果资源能够分配了,那么进程就能够运行结束,然后释放资源,这里需要回收资源

for (l=0; l

{

Available_tmp[l] += Allocation[minP*R + l];  // 回收

}

// 唤醒等待的所有进程

for(k=0; k

{

if (status[k] == WAIT)

{

status[k] = FALSE;

wait–;

}

}

}

else

{

// 不能满足时,该进程等待,等待数++

status[minP] = WAIT;

wait++;

}

}

free(status);

free(Available_tmp);

// 验证状态

if (finish == P)

{

return TRUE;

}

else

return FALSE;

}

// 从文件中读取数据

int readData(int *p, int *r)

{

int i = 0;

int pCount = 0;

int rCount = 0;

// 为方便操作,这里仅使用重定向处理

freopen(“in.txt”, “r”, stdin);

scanf(“%d”, p);

scanf(“%d”, r);

pCount = *p;

rCount = *r;

// 分配内存

Resource =  (int*)malloc( rCount * sizeof(int));

Max =   (int*)malloc( pCount * rCount * sizeof(int));

Need =   (int*)malloc( pCount * rCount * sizeof(int));

Allocation = (int*)malloc( pCount * rCount * sizeof(int));

Available =  (int*)malloc( rCount * sizeof(int));

if (Resource == NULL || Max == NULL || Need == NULL

|| Allocation == NULL || Available == NULL )

{

return FALSE;

}

// 各资源的总量

for (i=0; i

{

scanf(“%d”, Resource + i);

}

// 最大需求量

for (i=0; i

{

scanf(“%d”, Max+i);

}

// 已分配的资源量

for (i=0; i

{

scanf(“%d”, Allocation+i);

}

// 剩余可分配的资源量

for (i=0; i

{

scanf(“%d”, Available+i);

}

// 计算各资源的需求量

for (i=0; i

{

*(Need+i) = *(Max+i) – *(Allocation+i);

}

return 0;

}

// 某进程申请资源的请求

int request(const int PCount, const int RCount, const int pId, const int *reqSource)

{

int i=0;

int *testAllocate = (int*)malloc(PCount*RCount*sizeof(int));  // 预存储尝试的分配情况

if (testAllocate != NULL)

{

memcpy(testAllocate, Allocation, PCount*RCount*sizeof(int));

}

else

{

return FALSE;

}

// 进行资源预分配

for (i=0; i

{

if (reqSource[i] > Available[i])  // 申请的资源比剩余的资源还多!

{

return FALSE;

}

else

{

testAllocate[pId*RCount + i] += reqSource[i];

}

}

if (testStatus(PCount, RCount) == TRUE)    // 是一个安全状态

{

// 正式分配

memcpy(Allocation, testAllocate, PCount*RCount*sizeof(int));

free(testAllocate);

return TRUE;

}

else

{

free(testAllocate);

return FALSE;

}

}

// 释放所有的内存空间

int destroy()

{

if (Resource == NULL || Max == NULL || Need == NULL

|| Allocation == NULL || Available == NULL)

{

return FALSE;

}

else

{

free(Resource);

Resource = NULL;

free(Max);

Max = NULL;

free(Need);

Need = NULL;

free(Allocation);

Allocation = NULL;

free(Available);

Available = NULL;

printf(“Destroy\n”);

return TRUE;

}

}

int main()

{

int p = 0;  // 进程数

int r = 0;  // 资源分类数

int reqSource[3] = {0, 3, 4};

readData(&p, &r);

// test now status

if (testStatus(p, r) == TRUE)

{

printf(“Saft\n”);

}

else

{

printf(“nonSaft\n”);

}

// for test  reqSource[3] = {0, 3, 4};

if (request(p, r, 1, reqSource) == TRUE)

{

printf(“Allocate\n”);

}

else

{

printf(“Non-Allocate\n”);

}

// 释放所有的内存空间

destroy();

return 0;

}

/*  in.txt

5 3  // 进程数  资源种类数

17 5 20  // 各类资源总数

// 最大需求量

5 5 9

5 3 6

4 0 11

4 2 5

4 2 4

// 已分配资源数

2 1 2

4 0 2

4 0 5

2 0 4

3 1 4

// 剩余的资源数

2 3 3

*/

将C语言梳理一下,分布在以下10个章节中:

0b1331709591d260c1c78e86d0c51c18.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163232.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 浅谈偏序问题_离散偏序关系

    浅谈偏序问题_离散偏序关系浅谈偏序问题所谓偏序问题就是多约束条件的元素统计问题。看起来好像很难理解的样子?比如一维偏序,就是有一种约束条件。其实这个例子比较难举。举个排序的例子吧。现在给出有一个乱序数列,请将其按从大

    2022年8月3日
    9
  • 社区版pycharm flask封装接口[通俗易懂]

    社区版pycharm flask封装接口[通俗易懂]因为装的pycharm版本是社区版,没有单独的flask项目创建入口1、首先和创建python项目一样创建一个项目:要选择虚拟环境(一般默认即可)2、项目文件夹下安装flask:npminstallflask前端渲染后续研究,此次只封装接口3导包notes:1、调试过程中要手动打开debug模式2、cors是解决前端跨域问题impor…

    2025年7月25日
    4
  • HttpClient4.x 使用cookie保持会话

    HttpClient4.x 使用cookie保持会话HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的“执行get请求”部分)。如果需要使用HttpClient池,并且想要做到一次登录的会话供多个HttpClient连接使用,就需要自己保存会话信息。因为客户端的会话信息是保存在cookie中的(JSESSIONID),所

    2022年7月22日
    12
  • Oracle PL/SQL编程之六: 把过程与函数说透「建议收藏」

    Oracle PL/SQL编程之六: 把过程与函数说透「建议收藏」Oracle PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)本篇主要内容如下:6.1 引言6.2 创建函数6.3 存储过程6.3.1 创建过程6.3.2 调用存储过程6.3.3 AUTHID6.3.4 PRAGMA AUTONOMOUS_TRANSACTION6.3.5 开发存储过程步骤

    2022年6月17日
    23
  • CentOS7中关闭firewall,并使用iptables管理防火墙

    CentOS7中关闭firewall,并使用iptables管理防火墙

    2021年10月19日
    43
  • Vue中使用animate.css「建议收藏」

    Vue中使用animate.css「建议收藏」最近把公司官网项目依赖进行了升级,里面用到了animate.css。目前版本4.1.0。目前4.x版本相比之前3.x的breakingchange如下:Animate.cssv4broughtsomeimprovements,improvedanimations,andnewanimations,whichmakesitworthupgrading.Butitalsocomeswithabreakingchange:wehaveaddedpref

    2022年7月14日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号