diff --git a/.vscode/settings.json b/.vscode/settings.json index 7a230e1..56a0c54 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ "src" ], "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "python.REPL.enableREPLSmartSend": false } \ No newline at end of file diff --git a/src/cpu.py b/src/cpu.py index 3d57789..eb6132e 100644 --- a/src/cpu.py +++ b/src/cpu.py @@ -1,13 +1,6 @@ import time class CPU: - _instance = None - - def __new__(cnt): - if not cnt._instance: - cnt._instance = super().__new__(cnt) - return cnt._instance - def setOS(self, os): self.os = os diff --git a/src/operatingSystem.py b/src/operatingSystem.py index fdcd916..53c6337 100644 --- a/src/operatingSystem.py +++ b/src/operatingSystem.py @@ -4,37 +4,47 @@ class OS: _instance = None - def __new__(cls, cpu, pAlgorithm): + def __new__(cls, pAlgorithm): if not cls._instance: cls._instance = super().__new__(cls) cls.blockedProcesses = [] cls.numberOfProcesses = 0 - cls.cpu = cpu cls.cpuScheduler = CPUScheduler(pAlgorithm) return cls._instance def createProcess(self, proc): + self.getSys().mutex.acquire() print("Process [", proc.id, "] is created.", sep='') self.cpuScheduler.putProcess(proc) + self.getSys().mutex.release() def hasProcesses(self): return self.numberOfProcesses + self.cpuScheduler.getNumberOfProcesses() > 0 def getProcess(self): + self.sys.mutex.aquire() for proceess in self.blockedProcesses: if proceess.wakeTime <= time.time(): self.blockedProcesses.remove(proceess) self.numberOfProcesses -= 1 self.cpuScheduler.putProcess(proceess) - return self.cpuScheduler.getProcess() + + proc = self.cpuScheduler.getProcess() + self.getSystem().mutex.release() + return proc def sleep(self, proc): + self.getSystem().mutex.acquire() self.blockedProcesses.append(proc) self.numberOfProcesses += 1 proc.wakeTime = time.time() + proc.sleepInterval + self.getSystem().mutex.release() def finishProcess(self, proc): print("Process [", proc.id, "] is finished.", sep='') + + def getSystem(sys): + return sys \ No newline at end of file diff --git a/src/sanbox.py b/src/sanbox.py index 5f5e2aa..9e06851 100644 --- a/src/sanbox.py +++ b/src/sanbox.py @@ -7,7 +7,7 @@ spf = ShortestProcessFirst() cpu = CPU() -os = OS(cpu, fcfs) +os = OS(fcfs) cpu.setOS(os) #process1 = Process(5, 10, 1) diff --git a/src/system.py b/src/system.py new file mode 100644 index 0000000..ade81ab --- /dev/null +++ b/src/system.py @@ -0,0 +1,35 @@ +from operatingSystem import OS +from cpu import CPU +from algorithmPlanner import * +import threading +import threading + +class System: + _instance = None + + def __new__(cnt): + if not cnt._instance: + cnt._instance = super().__new__(cnt) + return cnt._instance + + def __init__(self, n = 1): + self.mutex = threading.Lock() + self.cpu = [CPU() for _ in range(5)] + self.os = OS(FirstComeFirstServe()) + + for i in range(n): + self.cpu[i].setOS(self.os) + t = threading.Thread(target=self.cpu[i].run) + self.threads.append(t) + + def startThreads(self): + for thread in self.threads: + thread.start() + + self.joinThreads() + + def joinThreads(self): + for thread in self.threads: + thread.join() + + \ No newline at end of file