dc exp 7
dc exp 7
Source Code:
Chandy-Misra-Haas algorithm:
import threading
import time
import random
import pickle
import socket
class Process(threading.Thread):
def __init__(self, process_id, neighbors, resources_needed,
coordinator_address):
threading.Thread.__init__(self)
self.process_id = process_id
self.neighbors = neighbors # List of processes this process
can send probes to
self.resources_needed = resources_needed # Resource ids this
process is waiting for
self.coordinator_address = coordinator_address
self.state = 'IDLE' # States: IDLE, WAITING, PROBING
self.received_probes = set()
def run(self):
""" Start the process by requesting resources and sending
probes. """
self.request_resources()
def request_resources(self):
""" Simulate requesting resources. If resources are
unavailable, start waiting. """
print(f"Process {self.process_id} requesting resources:
{self.resources_needed}")
def send_probe_messages(self):
""" Send probe messages to the processes that the process is
waiting on. """
for neighbor in self.neighbors:
self.send_probe(neighbor)
class Server(threading.Thread):
def __init__(self, process_id, neighbors):
threading.Thread.__init__(self)
self.process_id = process_id
self.neighbors = neighbors
def run(self):
""" Start listening for probes from other processes. """
server_address = ('localhost', 10000 + self.process_id)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
while True:
message, address = sock.recvfrom(4096)
# Handle received probe message
process = processes[self.process_id]
process.receive_probe(message, address)
resources_needed = [
['A'], # Process 0 needs resource A
['B'], # Process 1 needs resource B
['A'], # Process 2 needs resource A (creates a cycle)
]
if __name__ == "__main__":
processes = []
main()
Output: