Моя цель - создать программу, которая имитирует нескольких пользователей, работающих в одной компьютерной системе - создание и завершение процессов (каждый процесс представлен печатной платой). Печатные платы процессов добавляются и удаляются из связанного списка, который имитирует очередь заданий.
До сих пор я сделал следующее: Компьютерная система имеет 5 пользователей. Случайно выбранный пользователь просыпается каждый (случайно выбранный) интервал 1-5 секунд - и создает процесс. То есть пользователь создает объект блока управления процессом (PCB). Созданные печатные платы добавляются в связанный список.
Но теперь я не могу удалить процесс следующим образом: Каждый раз, когда пользователь просыпается, помимо добавления нового процесса, пользователь также удаляет один случайный процесс. из очереди.
Result should be like this:
Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- System sleeps for 1-5 seconds;
Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- User deletes one randomly selected process from job queue;
- System sleeps for 1-5 seconds;
- Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- System sleeps for 1-5 seconds;
- Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- User deletes one randomly selected process from job queue;
- System sleeps for 1-5 seconds;
So far, I have done the following code, in this code only deleting the process has not been implemented.
import time
import asyncio
from datetime import datetime as dt
class User:
def __init__(self,name):
self.name = name
self.processes = []
def createPCB(self,jobqueue):
process = PCB(self.name)
self.processes.append(process)
jobqueue.addPCBToQueue(process)
def removeProc(self,jobqueue):
self.processes.pop(process)
jobqueue.popProcfromQueue(process)
def p_count(self):
return len(self.processes)
class Computer:
def __init__(self):
self.queue = []
def addPCBToQueue(self,process):
self.queue.append(process)
def removeProcFromQueue(self,process):
self.queue.pop(process)
def count(self):
return len(self.queue)
class PCB:
univ_id = 1
p_count = 0
def __init__(self,user,state="Running",fframe=-1,lframe=-1):
self.pid = PCB.univ_id
self.user = user
self.state = state
self.mem = random.randint(20972,41943)
self.fframe = fframe
self.lframe = lframe
self.time = time.ctime()
PCB.univ_id += 1
PCB.p_count += 1
class Proc:
univ_id = 1
p_count = 0
def __init__(self,user,state="Running",fframe=-1,lframe=-1):
self.pid = PCB.univ_id
self.user = user
self.state = state
self.mem = random.randint(20972,41943)
self.fframe = fframe
self.lframe = lframe
self.time = time.ctime()
PCB.univ_id += 1
PCB.p_count += 1
async def prtRep():
global jobqueue
global users
last_queue_count = 0
queue_count = 0
while jobqueue.count() < 40:
print("\n")
print("=====>",time.ctime())
print("====== Processes Queue Summary ======")
if jobqueue.count() > 0:
for user in users:
print(user.name,": ",user.p_count()," processes")
print("-------------------------------------")
print("Total number of processes currently in queue :",jobqueue.count())
print("Last created Process ID :",jobqueue.queue[-1].pid if jobqueue.count()>0 else 0)
print("Number of processes created since last report :",jobqueue.count()-last_queue_count)
print("Number of processes terminated since last report :",jobqueue.count() -queue_count)
last_queue_count = jobqueue.count()
print("-------------------------------------")
await asyncio.sleep(20)
print("\n")
print("=====>",time.ctime())
print("====== Processes Queue Summary ======")
if jobqueue.count() > 0:
for user in users:
print(user.name,": ",user.p_count()," processes")
print("-------------------------------------")
print("Total number of processes currently in queue :",jobqueue.count())
print("Last created Process ID :",jobqueue.queue[-1].pid if jobqueue.count()>0 else 0)
print("Number of processes created since last report :",jobqueue.count()-last_queue_count)
print("Number of processes terminated since last report :",jobqueue.count() -queue_count)
last_queue_count = jobqueue.count()
print("-------------------------------------")
async def printAllProcesses():
await prtRep()
global jobqueue
print("\n")
print("========================================== PROCESSES QUEUE DETAILS ===========================================")
print(time.ctime())
print("--------------------------------------------------------------------------------------------------------------")
for process in jobqueue.queue:
# print("PID:", process.pid,"\tSTATUS:", process.state,"\tUSER:", process.user, "\tMEMORY FRAMES:", process.mem, "\tFIRST FRAME:", process.fframe, "\tLAST FRAME:", process.lframe, "\tSTART TIME:", process.time)
print("PID: {:<3d} STATUS: {:<10s} USER: {:<7s} MEMORY FRAMES: {:<7d} FIRST FRAME: {:<3d} LAST FRAME: {:<3d} START TIME: {:<26s}".format(process.pid,process.state,process.user,process.mem,process.fframe,process.lframe,process.time))
print("--------------------------------------------------------------------------------------------------------------")
#async is for threading
async def main():
while PCB.p_count < 40:
r_sec = random.randint(1,5)
r_user = random.randint(0,4)
await asyncio.sleep(r_sec)
users[r_user].createPCB(jobqueue)
while PCB.p_count < 40:
r_sec = random.randint(1,5)
r_user = random.randint(0,4)
await asyncio.sleep(r_sec)
users[r_user].removeProc(jobqueue)
#list,dictionary,tupple.
users = []
users.append(User("u1"))
users.append(User("u2"))
users.append(User("u3"))
users.append(User("u4"))
users.append(User("u5"))
jobqueue = Computer()
loop = asyncio.get_event_loop()
task1 = loop.create_task(main())
task2 = loop.create_task(printAllProcesses())
try:
print("\nUsers starting to create processes.. updates every 20 seconds")
loop.run_until_complete(asyncio.gather(task1,task2))
except:
pass```