接下来的最短剩余时间如何解决这个问题?“最短作业优先”的抢占式版本。
我了解选择完成前剩余时间最少的过程来执行。但是,如果到达的新进程的突发时间与当前正在执行的进程的剩余完成时间完全相同,会发生什么情况?
如果一个新进程到达,其突发时间与当前执行的进程相同(如本例所示),那么当前执行的过程是否继续?
我的理解正确吗?提前谢谢你。
在CPU上运行的进程被一个新进程抢占,如果后者的执行时间比当前进程小。我们可以使用以下python函数实现抢占最短剩余时间下一次调度算法,并模拟进程在CPU上的执行:
import pandas as pd
def SRTN(df): # df is the data frame with arrival / burst time of processes
queue = []
cpu, cur_pdf = None, None
alloc, dalloc = {}, {}
time = 0
while True: # simulate the CPU scheduling algorithm
# check if all processes finished execution
if df['RemainingTime'].max() == 0:
break
# get current process assigned to cpu, if any
if cpu:
cur_pdf = df[df.Process == cpu]
# check if a process arrived at this time instance and put it into wait queue
pdf = df[df.ArrivalTime == time]
if len(pdf) > 0:
for p in pdf['Process'].values:
queue.append(p)
if len(queue) > 0:
pdf = df[df['Process'].isin(queue)]
# find the process with shortest remaining time
if len(pdf) > 0:
pdf = pdf[pdf['RemainingTime']==pdf['RemainingTime'].min()]
# allocate a process to CPU, pre-empt the running one if required
if (cpu is None) or (len(pdf) > 0 and pdf['RemainingTime'].values[0] < cur_pdf['RemainingTime'].values[0]):
if cpu:
# prempt the current process
dalloc[cpu] = dalloc.get(cpu, []) + [time]
queue.append(cpu)
print('Process {} deallocated from CPU at time {}'.format(cpu, time))
cur_pdf = pdf
cpu = cur_pdf['Process'].values[0]
queue.remove(cpu)
print('Process {} allocated to CPU at time {}'.format(cpu, time))
alloc[cpu] = alloc.get(cpu, []) + [time]
df.loc[df['Process']==cpu,'RemainingTime'] -= 1
time += 1 # increment timer
# deallocate process
if df[df['Process']==cpu]['RemainingTime'].values[0] == 0:
print('Process {} deallocated from CPU at time {}'.format(cpu, time))
dalloc[cpu] = dalloc.get(cpu, []) + [time]
cpu = cur_pdf = None
return alloc, dalloc
现在,对以下数据运行SRTN(过程到达/突发时间):
df = pd.DataFrame({'Process':['A','B','C','D'], 'BurstTime':[3,5,3,2], 'ArrivalTime':[0,2,5,6]})
df.sort_values('ArrivalTime', inplace=True)
df['RemainingTime'] = df.BurstTime
df
alloc, dalloc = SRTN(df)
# Process A allocated to CPU at time 0
# Process A deallocated from CPU at time 3
# Process B allocated to CPU at time 3
# Process B deallocated from CPU at time 8
# Process D allocated to CPU at time 8
# Process D deallocated from CPU at time 10
# Process C allocated to CPU at time 10
# Process C deallocated from CPU at time 13
# alloc
# {'A': [0], 'B': [3], 'D': [8], 'C': [10]}
# dalloc
# {'A': [3], 'B': [8], 'D': [10], 'C': [13]}
以下动画显示了如何使用上述实现获得抢占式SRTN调度算法的甘特图:
让我们考虑以下3个进程到达的输入表,并在数据帧上运行SRTN以获得相应的甘特图:
alloc, dalloc, events = SRTN(df)
# Process A allocated to CPU at time 0
# Process A deallocated from CPU at time 1
# Process B allocated to CPU at time 1
# Process B deallocated from CPU at time 5
# Process A allocated to CPU at time 5
# Process A deallocated from CPU at time 11
# Process C allocated to CPU at time 11
# Process C deallocated from CPU at time 19
与上表相对应的甘特图如以下动画所示,使用上述算法获得:
引用维基百科的最短剩余时间:
在这种调度算法中,选择完成前剩余时间最少的进程来执行。由于根据定义,当前正在执行的进程是剩余时间最短的进程,并且由于该时间只会随着执行的进行而减少,因此进程将一直运行,直到它们完成或者添加了需要更少时间的新进程。
最短的剩余时间是有利的,因为短过程处理得非常快。该系统还需要很少的开销,因为它只在进程完成或添加新进程时做出决定,而添加新进程后,算法只需要将当前正在执行的进程与新进程进行比较,而忽略当前正在等待执行的所有其他进程。//强调我的。
如果到达的新进程的突发时间与当前正在执行的进程的剩余完成时间完全相同,则 CPU 将继续执行当前进程。做出此决定是因为进程上下文切换较重,因此在剩余突发时间相等的情况下,当前正在执行的进程将继续执行,直到完成,或者一个新的短进程到达。
是的,你的甘特图画得很正确。
但是,也请阅读维基百科上的限制//:
与最短作业下一个调度一样,最短剩余时间调度很少在专用环境之外使用,因为它需要准确估计每个进程的运行时。
如果它们是具有以下数据的两个过程,甘特图应该如何?(SRTF 调度) 进程到达突发 P1 0 17 P2 1 16 那么,进程P1会先完成,然后P2会开始执行……还是P1必须等待16毫秒?
亲爱的AnyLogic社区, 我是AnyLogic的新手,希望你们能帮助我! 我有一个简单的流程模型,由多个源、队列、抢占、延迟、释放和接收器(流程模型)组成。我建模的系统是一个服务器容量问题。我有不同的服务时间和有限的服务器容量的代理,我感兴趣的KPI是在资源池耗尽时没有得到适当服务的客户的数量。目前,我允许客户在使用所有资源时在队列块超时,但这并不能准确地表示系统在实际生活中的表现。 在现实中
我正在尝试在 java 中模拟 CPU 调度算法并使用多线程。我已经成功地实施了FCFS(先到先得)和SJF(最短的工作优先)。但问题是当我开始想到SRTF(最短剩余时间优先)时,它是SJF的一种先发制人的形式。我正在使用以下模型: CPU的线程,它有一个变量,它每保持滴答声(一个简单的时钟增量)。我有一个标志,用于在开始执行之前检查CPU是否可用。 长期调度程序(LTS)的线程,它将进程从进程列
该算法是SJF调度的抢先版本。 在SRTF中,过程的执行可以在一段时间后停止。 在每个进程到来时,短期调度程序在可用进程列表和正在运行的进程中以最少的剩余突发时间安排进程。 一旦所有进程都在就绪队列中可用,就不会执行抢占,并且该算法将作为SJF调度工作。 当进程从执行中被移除并且下一个进程被调度时,进程的上下文被保存在进程控制块中。 该PCB在下一次执行该过程时被访问。 示例 在这个例子中,有五个
我使用最短剩余时间优先算法(SRTF)来计算流程的平均等待时间和周转时间。 我想以如下所示的表格格式打印结果。 这里AT=到达时间,TT=周转时间,WT=等待时间。但是由于过程3和4的完成时间不可能,出现了一些错误。这是我的代码: 我犯了什么错误?请纠正我。
引用脚本的内容: name "最大剩余空间" OutFile "maxfreespace.exe" !include LogicLib.nsh !include "FileFunc.nsh" !insertmacro GetDrives !insertmacro DriveSpace Section "" SectionEnd Var myno1 ;Var myno2 Var Dri