急!银行家算法用C语言编写.全部程序.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!银行家算法用C语言编写.全部程序.相关的知识,希望对你有一定的参考价值。
急啊.求一份用C语言编写的银行家算法.要求能够调试成功
银行家算法银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。
那么什么是安全序列呢?
安全序列:一个进程序列P1,…,Pn是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
银行家算法:
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
算法:
n:系统中进程的总数
m:资源类总数
Available: ARRAY[1..m] of integer;
Max: ARRAY[1..n,1..m] of integer;
Allocation: ARRAY[1..n,1..m] of integer;
Need: ARRAY[1..n,1..m] of integer;
Request: ARRAY[1..n,1..m] of integer;
符号说明:
Available 可用剩余资源
Max 最大需求
Allocation 已分配资源
Need 需求资源
Request 请求资源
当进程pi提出资源申请时,系统执行下列
步骤:(“=”为赋值符号,“==”为等号)
step(1)若Request<=Need, goto step(2);否则错误返回
step(2)若Request<=Available, goto step(3);否则进程等待
step(3)假设系统分配了资源,则有:
Available=Available-Request;
Allocation=Allocation+Request;
Need=Need-Request
若系统新状态是安全的,则分配完成
若系统新状态是不安全的,则恢复原状态,进程等待
为进行安全性检查,定义数据结构:
Work:ARRAY[1..m] of integer;
Finish:ARRAY[1..n] of Boolean;
安全性检查的步骤:
step (1):
Work=Available;
Finish=false;
step (2) 寻找满足条件的i:
a.Finish==false;
b.Need<=Work;
如果不存在,goto step(4)
step(3)
Work=Work+Allocation;
Finish=true;
goto step(2)
step (4) 若对所有i,Finish=true,则系统处于安全状态,否则处于不安全状态
/* 银行家算法,操作系统概念(OS concepts Six Edition)
reedit by Johnny hagen,SCAU,run at vc6.0
*/
#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"
#define alloclen sizeof(struct allocation)
#define maxlen sizeof(struct max)
#define avalen sizeof(struct available)
#define needlen sizeof(struct need)
#define finilen sizeof(struct finish)
#define pathlen sizeof(struct path)
struct allocation
int value;
struct allocation *next;
;
struct max
int value;
struct max *next;
;
struct available /*可用资源数*/
int value;
struct available *next;
;
struct need /*需求资源数*/
int value;
struct need *next;
;
struct path
int value;
struct path *next;
;
struct finish
int stat;
struct finish *next;
;
int main()
int row,colum,status=0,i,j,t,temp,processtest;
struct allocation *allochead,*alloc1,*alloc2,*alloctemp;
struct max *maxhead,*maxium1,*maxium2,*maxtemp;
struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;
struct need *needhead,*need1,*need2,*needtemp;
struct finish *finihead,*finish1,*finish2,*finishtemp;
struct path *pathhead,*path1,*path2;
printf("\n请输入系统资源的种类数:");
scanf("%d",&colum);
printf("请输入现时内存中的进程数:");
scanf("%d",&row);
printf("请输入已分配资源矩阵:\n");
for(i=0;i<row;i++)
for (j=0;j<colum;j++)
printf("请输入已分配给进程 p%d 的 %c 种系统资源:",i,'A'+j);
if(status==0)
allochead=alloc1=alloc2=(struct allocation*)malloc(alloclen);
alloc1->next=alloc2->next=NULL;
scanf("%d",&allochead->value);
status++;
else
alloc2=(struct allocation *)malloc(alloclen);
scanf("%d,%d",&alloc2->value);
if(status==1)
allochead->next=alloc2;
status++;
alloc1->next=alloc2;
alloc1=alloc2;
alloc2->next=NULL;
status=0;
printf("请输入最大需求矩阵:\n");
for(i=0;i<row;i++)
for (j=0;j<colum;j++)
printf("请输入进程 p%d 种类 %c 系统资源最大需求:",i,'A'+j);
if(status==0)
maxhead=maxium1=maxium2=(struct max*)malloc(maxlen);
maxium1->next=maxium2->next=NULL;
scanf("%d",&maxium1->value);
status++;
else
maxium2=(struct max *)malloc(maxlen);
scanf("%d,%d",&maxium2->value);
if(status==1)
maxhead->next=maxium2;
status++;
maxium1->next=maxium2;
maxium1=maxium2;
maxium2->next=NULL;
status=0;
printf("请输入现时系统剩余的资源矩阵:\n");
for (j=0;j<colum;j++)
printf("种类 %c 的系统资源剩余:",'A'+j);
if(status==0)
avahead=available1=available2=(struct available*)malloc(avalen);
workhead=work1=work2=(struct available*)malloc(avalen);
available1->next=available2->next=NULL;
work1->next=work2->next=NULL;
scanf("%d",&available1->value);
work1->value=available1->value;
status++;
else
available2=(struct available*)malloc(avalen);
work2=(struct available*)malloc(avalen);
scanf("%d,%d",&available2->value);
work2->value=available2->value;
if(status==1)
avahead->next=available2;
workhead->next=work2;
status++;
available1->next=available2;
available1=available2;
work1->next=work2;
work1=work2;
available2->next=NULL;
work2->next=NULL;
status=0;
alloctemp=allochead;
maxtemp=maxhead;
for(i=0;i<row;i++)
for (j=0;j<colum;j++)
if(status==0)
needhead=need1=need2=(struct need*)malloc(needlen);
need1->next=need2->next=NULL;
need1->value=maxtemp->value-alloctemp->value;
status++;
else
need2=(struct need *)malloc(needlen);
need2->value=(maxtemp->value)-(alloctemp->value);
if(status==1)
needhead->next=need2;
status++;
need1->next=need2;
need1=need2;
maxtemp=maxtemp->next;
alloctemp=alloctemp->next;
need2->next=NULL;
status=0;
for(i=0;i<row;i++)
if(status==0)
finihead=finish1=finish2=(struct finish*)malloc(finilen);
finish1->next=finish2->next=NULL;
finish1->stat=0;
status++;
else
finish2=(struct finish*)malloc(finilen);
finish2->stat=0;
if(status==1)
finihead->next=finish2;
status++;
finish1->next=finish2;
finish1=finish2;
finish2->next=NULL; /*Initialization compleated*/
status=0;
processtest=0;
for(temp=0;temp<row;temp++)
alloctemp=allochead;
needtemp=needhead;
finishtemp=finihead;
worktemp=workhead;
for(i=0;i<row;i++)
worktemp1=worktemp;
if(finishtemp->stat==0)
for(j=0;j<colum;j++,needtemp=needtemp->next,worktemp=worktemp->next)
if(needtemp->value<=worktemp->value)
processtest++;
if(processtest==colum)
for(j=0;j<colum;j++)
worktemp1->value+=alloctemp->value;
worktemp1=worktemp1->next;
alloctemp=alloctemp->next;
if(status==0)
pathhead=path1=path2=(struct path*)malloc(pathlen);
path1->next=path2->next=NULL;
path1->value=i;
status++;
else
path2=(struct path*)malloc(pathlen);
path2->value=i;
if(status==1)
pathhead->next=path2;
status++;
path1->next=path2;
path1=path2;
finishtemp->stat=1;
else
for(t=0;t<colum;t++)
alloctemp=alloctemp->next;
finishtemp->stat=0;
else
for(t=0;t<colum;t++)
needtemp=needtemp->next;
alloctemp=alloctemp->next;
processtest=0;
worktemp=workhead;
finishtemp=finishtemp->next;
path2->next=NULL;
finishtemp=finihead;
for(temp=0;temp<row;temp++)
if(finishtemp->stat==0)
printf("\n系统处于非安全状态!\n");
exit(0);
finishtemp=finishtemp->next;
printf("\n系统处于安全状态.\n");
printf("\n安全序列为: \n");
do
printf("p%d ",pathhead->value);
while(pathhead=pathhead->next);
printf("\n");
return 0;
参考技术A ~ 参考技术B 1 参考技术C 1L 你不复制黏贴能死吗?
易语言怎么调用c语言编译器来运行程序代码 ! 急!谢谢回答者!说详细些
如果易语言编译器容许您,那么就是可以的,例如keilc51编译器和常用调试arm裸机程序,是可以在c语言语句中加入汇编语言。
由于本人不了解易语言,无法确定其编译器是否可以编译c,但估计是不行。
那么说回来,如果这样,程序就没法写了。实际大家是怎么做的呢。通常做法是将c语言程序编译成dll文件,也就是我们所谓的库文件。然后就可以实现调用了。这种文件我们经常会在常见的程序中看到,原因就是代码保密性好,并且更新很方便,关键在于可以多种语言交互。
当然了,也可以吧所谓的易语言封装成dll,被c调用,当然如果他有这项功能的话。
如果一个c语言已经编译成可执行程序了,比如exe文件,那么易语言端应与c语言端进行进程通信,方可实现数据交互。那么进程通信就有多种方式,那么就不赘述了。
说下DLL的封装,如果是c语言我们需要加入dll.h
dll.h中放入以下语句
#ifndef _DLL_H_#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */DLLIMPORT void HelloWorld (void);
#include "func.h"
#endif /* _DLL_H_ */
程序中的,DLLIMPORT void HelloWorld (void);,#include "func.h"是例子,就是放你书写的用c写的函数声明的地方。
而在你c语言原先放主函数的那个文件中应该写入以下内容
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
switch (reason)
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
/* Returns TRUE on success, FALSE on failure */
return TRUE;
我们看见有很多case,也有很多传入参数,最初可以不用管它,也可以使用。如需详细配置,应自行梳理再做决定。
另外一点,对于高级语言和c语言清理现场的问题,也就是被调用函数结束后由被调用函数清理栈,还是由下一个被执行函数清理上一个函数的栈,这点很重要。两种不同的调用方式将导致你虽然可以调用dll,但可能数据出错。这个问题可以说在VB与C的交互上面就可以体现了。__cdecl这个就是默认c语言的栈处理方式。__stdcall是VB的处理方式,那么对于易语言,请您详细查看后再做定论。
那么具体在c语言中提现就是,我们需要在函数前面加上__stdcall以告知编译器采用此类编译方式,应用方法就如下面的声明。
#ifndef _FUNC_H_#define _FUNC_H_
#include "dll.h"
#include <winsock2.h>
#include "var.h"
DLLIMPORT __stdcall void GetProgressNumFileIDPackageID(int *PercentNum,int *FileID,int *PackageID);
DLLIMPORT __stdcall int GetInfoNum(int Mode);
DLLIMPORT __stdcall void PutInfoNum(int InfoNum,int Mode);
DLLIMPORT __stdcall void Demo0(void);
DLLIMPORT __stdcall void Demo1(void);
DLLIMPORT __stdcall void InitThreadCriticalSection(void);
DLLIMPORT __stdcall void DeleteThreadCriticalSection(void);
#endif /*_FUNC_H_*/
我听说VB和易语言有相似之处那么我给出VB调用C语言DLL时候的函数书写例子,以便您参考。
Public Class Form1Private Declare Sub NetToWork Lib "Client.dll" (ByVal IpAddr As String, ByVal Port As Integer, ByVal Mode As Integer)
Private Declare Function StrToStruct Lib "Client.dll" (ByVal Str As String, ByVal Mode As Integer) As Integer
Private Declare Function StructToStr Lib "Client.dll" (ByVal Str As String, ByVal Mode As Integer) As Integer
Private Declare Function GetInfoNum Lib "Client.dll" (ByVal Mode As Integer) As Integer
Private Declare Sub PutInfoNum Lib "Client.dll" (ByVal InfoNum As Integer, ByVal Mode As Integer)
Private Declare Sub Demo0 Lib "Client.dll" ()
Private Declare Sub Demo1 Lib "Client.dll" ()
.........
...
..
...
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click'从text搜索关键词 并读取回链表数据
Dim Str As String
If (ToolStripTextBox1.Text = "") Then
MsgBox("内容不能为空")
Else
Str = ToolStripTextBox1.Text
StrToStruct(Str, SEND_SEARCH_0200)
Dim Th0 As Threading.Thread
Th0 = New Threading.Thread(AddressOf DownFileList)
Th0.Start()
End If
End Sub
....
..
上程序但中StrToStruct(Str, SEND_SEARCH_0200)就是一个典型的VB调用DLL函数的例子。
那么如果给些相关的参考资料(C语言封装DLL以及VB调用的问题)
http://www.aidianying123.net/article/?29.html
以便您对此更加了解。
追问谢谢
追答求确认最佳答案。
参考技术A 代码不一样 不可以就好比你用水杯炒菜
不是一个系统的追问
不是 我已经用易语言把代码转换成c代码了 就是想调用编译器直接运行
以上是关于急!银行家算法用C语言编写.全部程序.的主要内容,如果未能解决你的问题,请参考以下文章