Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
95 views6 pages

Ds Assignment 3

The document describes a Java program that simulates distributed mutual exclusion across multiple nodes. Each node runs as a separate thread and uses message passing to request and grant access to a critical section. The program takes command line arguments to specify the number of nodes and runtime. It initializes data structures for message passing between nodes and starts each node as a thread. The nodes send requests, wait for replies, enter and exit the critical section, and send replies to deferred nodes in a loop.

Uploaded by

AshutoshSharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
95 views6 pages

Ds Assignment 3

The document describes a Java program that simulates distributed mutual exclusion across multiple nodes. Each node runs as a separate thread and uses message passing to request and grant access to a critical section. The program takes command line arguments to specify the number of nodes and runtime. It initializes data structures for message passing between nodes and starts each node as a thread. The nodes send requests, wait for replies, enter and exit the critical section, and send replies to deferred nodes in a loop.

Uploaded by

AshutoshSharma
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 6

Assignment-3

Ques- Simulate the Distributed Mutual Exclusion


import Utilities.*;
import Synchronization.*;
class Message
{
public int number,id;
public Message(int number, int id)
{
this.number=number;
this.id=id;
}}
class Node extends MyObject implements Runnable
{
private static final int MAIN =0, REQUESTS=1, REPLIES=2;
private int whichone=0;
private int numNodes=-1;
private int napOutsideCS=0;
private int napInsideCS=0;
private MessagePassing[] requestChannel=null;
private MessagePassing[] relyChannel=null;
private MessagePassing[] requestsToMe=null;
private MessagePassing[] repliesToMe=null;
private int number =0;
private boolean requesting = false;
private int replyCount=0;
private BinarySemaphore s=new BinarySemaphore (1) ;
private BinarySemaphore wakeUp=new BinarySemaphore (0) ;
private boolean[] deferred = null;
public Node(String name, int id, int numNodes,int napOutsideCS, int napInsideCS, MessagePassing[]
requestChannel,MessagePassing replytChannel[],MessagePassing requestsToMe,MessagePassing repliesToMe)
{
super (name + "" + id);
this.id=id;
this.numNodes=numNodes;
this.napOutsideCS=napOutsideCS;
this.napInsideCS=napInsideCS;
this.requestChannel=requestChannel;
this.relyChannel=relyChannel;
this.requestsToMe=requestsToMe;
this.repliesToMe=repliesToMe;
deferred=new boolean[numNodes];
for(int i=0;i< numNodes; i++)
deferred[i]=false;
System.out.println(getNmae() +" is alive, napOutsideCS=" + napOutsideCS + ",napInsideCS=" + napInsideCS);
new Thread(this).start();
}
public void run()
{
int meDO = whichOne++;
if(meDo==MAIN)
{
new Thread(this).start();
main();
}

else if(meDo == REQUESTS)


{
new Thread(this).start();
handleRequests();
}
else if(meDo == REPLIES)
{
handleReplies();
}}
private void chooseNumber()
{
P(s);
requesting=true;
number=highNumber +1;
V(s);
}
private void sendRequest()
{
replyCount =0;
for(int j=0; j < numNodes; j++)
if(j!=id)
send(requestChannel[j], new Message(number,id));
}
private void waitForReply()
{
P(wakeUp);
}
private void replyToDeferredNodes()
{
P(s);
requesting = false;
V(s);
for(int j =0; j< numNodes; j++)
{
if(deferred[j])
{
deferred[j]=false;
send(replyChannel[j],id);
} }}
private void outsideCS()
{
int napping;
napping=((int) random(napOutsideCS)) +1;
System.out.println("age()=" + age() + ", " + getName() + " napping outside CS for " + napping + " ms ");
nap(napping);
}
private void insideCS()
{
int napping;
napping =((int) random(napInsideCS)) +1 ;
System.out.println("age=()" + age() + ", " + getName() + " napping inside CS for " + napping + " ms");
nap(napping);
}
private void main()
{
while(true)

{
outsideCS();
System.out.println("age()=" + age() + ", node " + id + " wants to enter its critical section");
choseNumber();
sendRequest();
waitForReply();
insideCS();
System.out.println("age()=" +age() + ", node " + id + " has now left its critical section");
replyToDeferredNodes();
}
}
private void handleRequests()
{
while(true)
{
message m = (message) receive(requestsToMe);
int receivedNumber = m.number;
int receivedID = m.id;
highNumber=Math.max(highNumber, receivedNumber);
P(s);
boolean decideToDefer=requesting && (number < receivedNumber || (number == receivedNumber && id <
receivedID));
if (decideToDefer) deferred[receivedID] = true;
else send(replyChannel[receivedID],id);
V(s);}}
private void handleReplies()
{
while(true)
{
int receivedID=receiveInt(repliesToMe);
replyCount++;
if(replyCount==numNodes - 1)
V(wakeUp);
}} }
class DistributedMutualExclusion extends MyObject
{
public static void main(String[] args)
{
GetOpt go= new GetOpt(args, "Un:R:");
String usage = "Usage: -n numNodes -R runTime" + " napOutsideCS[i] napInsideCS[i] i=0,1,...";
go.optErr = true;
int ch = -1;
int numNodes =5;
int runTime = 60;
while ((ch = go.getopt()) != go.optEOF)
{
if ((char)ch == 'U')
{
System.out.println (usage); System.exit(0);
}
else if ((char) ch == 'n')
numNodes=go.processArg(go.optArgGet(), numNodes);
else if ((char) ch == 'R')
runTime = go.processArg(go.optArgGet(), runTime);
else

{
System.err.println(usage);
System.exit(1);
}}
System.out.println("DistributeMutualExclusion: numNodes=" + numNodes + ",runTime=" + runTime);
int[] napOutsideCS = new int[numNodes];
int[] napInsideCS = new int[numNodes];
int argNum = go.optIndexGet();
for(int i = 0; i < numNodes; I++)
{
napOutsideCS[i] = go.tryArg(argNum++, 8);
napInsideCS[i] = go.tryArg(argNum++, 2);
}
MessagePassing[] requestChannel =null, replyChannel = null,requestChannelS =null,requestChannelR
=null,replyChannelS = null,replyChannelR = null;
requestChannel = new MessagePassing[numNodes];
replyChannel = new MessagePassing[numNodes];
requestChannelS = new MessagePassing[numNodes];
replyChannelS = new MessagePassing[numNodes];
requestChannelR = new MessagePassing[numNodes];
replyChannelR = new MessagePassing[numNodes];
for(int i=0; i< numNodes; i++)
{
requestChannel [i] = new AsyncMessagePassing();
replyChannel [i] = new AsyncMessagePassing();
requestChannelS [i] = new AsyncMessagePassing();
replyChannelS [i] = new AsyncMessagePassing();
requestChannelR [i] = new MessagePassingReceiveonly(requestChannel [i]);
replyChannelR [i] = new MessagePassingReceiveonly(replyChannel [i]);
}
for(int i=0; i<numNodes; i++)
new Node("Node", i, numNodes,napOutsideCS[i] *1000, napInsideCS[i]
*1000,requestChannelS,replyChannelS,requestChannelR[i],replyChannelR[i] );
Systom.out.println("All Nodes created");
nap(runTime*1000);
Systom.out.println("age()=" + age() + ", time to stop the threads and exit");
System.exit(0);
}}

OUTPUT
C:\Documents and Settings\admin>javac dimu.java
C:\Documents and Settings\admin>java DistributedMutualExclusion R20

You might also like