www.pudn.com > 模拟银行家算法.zip > Project1.cpp


#pragma hdrstop 
#include  
#include          // C++ standard I/O 
#include           // C++ file I/O 
#include              // C++ string functions 
 
#include "Banker.h"           // defines the banker 
 
//--------------------------------------------------------------------------- 
USEUNIT("Banker.cpp"); 
//--------------------------------------------------------------------------- 
ofstream ofsLog1; 
ofstream ofsLog2; 
 
void tryRequest(Banker *pBanker, int iPID, int iF, int iP, int iM) 
{ 
   cout << "PID " << iPID << " requests ("; 
   cout << iF << ", " << iP << ", " << iM << ") "; 
 
   // Try to request memory; see if the Banker can be spoofed 
   // into allowing an unsafe system condition 
 
   try 
   { 
      pBanker->request(iPID, iF, iP, iM); 
      cout << "...made it." << endl; 
   } 
   catch(BankerUnsafePidException) 
   { 
     cout << "...UNSAFE:  Invalid PID." << endl; 
   } 
   catch(BankerUnsafeContractException) 
   { 
     cout << "...UNSAFE:  Violates PID contract." << endl; 
   } 
   catch(BankerUnsafeTotalException) 
   { 
     cout << "...UNSAFE:  Exceeds total system resources." << endl; 
   } 
   catch(BankerUnsafeCommittedException) 
   { 
     cout << "...UNSAFE:  Resources would be overcommitted." << endl; 
   } 
} 
 
void tryMemoryTest(Banker *pBanker, bool bHello, bool bLimits, bool bRequest) 
{ 
  static int i=0; 
 
   cout << "BEGIN MEMORY TEST " << i << endl; 
   cout << "pBanker points to " << pBanker << endl; 
   if(bHello==true) 
   { 
     cout << "calling helloWorld()" << endl; 
     pBanker->helloWorld(); 
     cout << "helloWorld() succeeded." << endl; 
   } 
   if(bLimits==true) 
   { 
     cout << "calling showLimits()" << endl; 
     pBanker->showLimits(); 
     cout << "...showLimits() succeeded." << endl; 
   } 
   if(bRequest==true) 
   { 
     cout << "calling request()" << endl; 
     pBanker->request(1, 0, 0, 0); 
     cout << "...request() succeeded." << endl; 
   } 
   cout << "...completed memory test " << i++ << endl; 
   cout << endl << endl; 
} 
 
#pragma argsused 
int main(int argc, char **argv) 
{ 
  string sLog1 = "bankerDebug1.txt"; 
  string sLog2 = "bankerDebug2.txt"; 
  ofsLog1.open(sLog1.c_str()); 
	ofsLog2.open(sLog2.c_str()); 
 
   Banker * pBanker = new Banker(10, 5, 7);      // create the banker 
 
   // assign PIDs and max resources required for each 
   pBanker->openAccount(0, 7, 5, 3); 
   pBanker->openAccount(1, 3, 2, 2); 
   pBanker->openAccount(2, 9, 0, 2); 
   pBanker->openAccount(3, 2, 2, 2); 
   pBanker->openAccount(4, 4, 3, 3); 
 
   // try series of requests as suggested by the textbook, page 222 
   tryRequest(pBanker, 0, 0, 1, 0); 
   tryRequest(pBanker, 1, 2, 0, 0); 
   tryRequest(pBanker, 2, 3, 0, 2); 
   tryRequest(pBanker, 3, 2, 1, 1); 
   tryRequest(pBanker, 4, 0, 0, 2); 
   tryRequest(pBanker, 1, 1, 0, 2); 
   tryRequest(pBanker, 4, 3, 3, 0); 
   tryRequest(pBanker, 0, 0, 2, 0); 
   cout << "...done with Silberschatz part..." << endl; 
 
   cout << endl << endl; 
   cout << "Begin trying other things." << endl; 
   tryRequest(pBanker, 1, 0, 0, 0); 
   tryRequest(pBanker, 9, 0, 0, 0); 
   tryRequest(pBanker, 1, 0, 4, 0); 
 
   cout << endl << endl << endl; 
   cout << "Begining memory tests; pBanker initially " << pBanker << endl; 
   cout << endl; 
 
   tryMemoryTest(pBanker, true, true, true);      // test 0 
 
   delete pBanker; 
   tryMemoryTest(pBanker, true, true, false);     // test 1 
 
   pBanker = (Banker *)new int[sizeof (Banker)]; 
   tryMemoryTest(pBanker, true, true, false);     // test 2 
 
   pBanker = (Banker *)2346735687; 
   tryMemoryTest(pBanker, true, false, false);    // test 3 
 
   return 0;            // success 
}