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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 跨域问题Access to XMLHttpRequest‘*‘from origin ‘*‘ has been blocked by CORS..Access-Control-Allow-Origin[通俗易懂]

    跨域问题Access to XMLHttpRequest‘*‘from origin ‘*‘ has been blocked by CORS..Access-Control-Allow-Origin[通俗易懂]跨域问题解决方案:CORSAccesstoXMLHttpRequestat’*’fromorigin’*’hasbeenblockedbyCORSpolicy:Responsetopreflightrequestdoesn’tpassaccesscontrolcheck:No’Access-Control-Allow-Origin’header…

    2022年6月11日
    42
  • APP运营:盘点八款主流 APP 消息推送工具[通俗易懂]

    APP运营:盘点八款主流 APP 消息推送工具[通俗易懂]在APP日常运营中,基于营销以及推广的目的,我们需要对APP用户推送一些活动信息或重要资讯。常见的消息推送工具分为两种:1、即技术团队自行开发;2、第三方Push工具对于许多创业型公司而言,相对于自行开发,第三方消息推送工具在推送稳定性、精确覆盖性以及成本方面更具有优势,只需要下载并集成SDK就可以实现功能。本文中我们将盘点八款主流第三方APP消息推送工具,希望对大家在A…

    2022年5月8日
    204
  • iOS:分割控制器UISplitViewcontroller

    iOS:分割控制器UISplitViewcontroller

    2021年9月10日
    62
  • 全网最全python爬虫精进

    全网最全python爬虫精进4.25(第一天)**第0关认识爬虫**1、初始爬虫爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。2、明晰路径2-1、浏览器工作原理(1)解析数据:当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给我们。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成我们能看得懂的内容;(2)提取数据:我们就可以在拿到的数据中,挑选出对我们有用的数据;(3)存储数据:将挑选出来的有用数据保存在某一文件/数据库中。2-2、爬虫工作原理(1)获取数据:爬虫程序会根据

    2022年5月27日
    34
  • vs2013安装失败解决办法_cad2012安装失败解决方案

    vs2013安装失败解决办法_cad2012安装失败解决方案 在实际的vs2008安装过程中,发现安装到一定的时候出现错误,导致安装无法继续进行。经过上网查询相关解决方案,成功解决了这个问题,逐将解决过程与大家分享。    显示的错误界面如下图所示: 解决方案:     在VS2008安装光盘下找到…/WCU/WebDesignerCore/WebDesignerCore.exe并将其复制到硬盘上其他目录下(不在VS2008

    2025年9月28日
    5
  • Jmeter安装以及使用「建议收藏」

    Jmeter安装以及使用「建议收藏」JMeter是什么?JMeter是Apache开源项目的一部分。它最初是为了测试web服务器的性能而编写的,现在它已经作为一个自动化的测试工具和测试数据,以及用于web应用程序、文件服务器、web服务器甚至数据库的功能测试工具。我们将在本教程中探讨JMeter的重要特性。可以通过配置来模拟针对特定web服务器或应用程序的N个用户和线程。它为web应用程序生成一个模拟负载来度量其性能。此外,您…

    2022年5月11日
    42

发表回复

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

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