一个系统采用了基于优先级的抢占式调度,一个进程的初始优先级每5毫秒增加1。在一个记录的时间跨度中,系统有四个进程,P1、P2、P3和P4,如下表所示
请考虑以下的页面引用字符串。
A, B, D, C, B, E, D, B, A, C, B, C, A, C, F, A, F, D。
假设有3个可用的框架,它们最初都是空的。完成一个类似于课本图8.14的图,显示以下每个页面替换策略的帧分配。
(a) 先入先出
(b) 最优
(c) 最近使用最少的
该回答引用ChatGPT
以下是时序图,其中每个箭头表示一个进程在一个时间段内运行:
根据时序图可以计算每个进程的周转时间(等待时间+执行时间):
P1:等待时间为0,执行时间为15ms,所以周转时间为15ms。
P2:等待时间为2.5ms(P1执行时的切换开销),执行时间为10ms,所以周转时间为12.5ms。
P3:等待时间为7.5ms(P1和P2执行时的切换开销),执行时间为5ms,所以周转时间为12.5ms。
P4:等待时间为12.5ms(P1、P2和P3执行时的切换开销),执行时间为0ms(在时序图的时间跨度内未执行),所以周转时间为12.5ms。
注意,这里计算的周转时间是指一个进程从被提交到被完成所需的总时间,而不是仅指执行时间。
参考GPT和自己的思路,基于优先级的抢占式调度问题
1.1 时序图
在时序图中,每个进程的执行时间用橙色方块表示,进程切换用灰色方块表示,每个时间片用竖线表示。例如,在第 5 毫秒时,P2 的执行时间结束,进行进程切换,切换时间为 2.5 毫秒。
1.2 周转时间
根据完成时间的计算结果,我们可以计算出每个进程的周转时间。周转时间指从进入系统到完成执行的时间。计算公式为:
周转时间 = 完成时间 - 到达时间
如下表所示:
进程 到达时间 完成时间 周转时间
P1 0 40 40
P2 0 30 30
P3 0 20 20
P4 0 35 35
可以看到,P1 的周转时间最长,为 40 毫秒,而 P3 的周转时间最短,为 20 毫秒。
页面置换问题
第二个问题是一个页面置换算法的应用题,下面是题目:
请考虑以下的页面引用字符串。
A, B, D, C, B, E, D, B, A, C, B, C, A, C, F, A, F, D。
假设有 3 个可用的框架,它们最初都是空的。完成一个类似于课本图 8.14 的图,显示以下每个页面替换策略的帧分配。
(a) 先入先出
(b) 最优
(c) 最近使用最少的
对于这个问题,我们可以使用之前提到的三种置换算法,依次计算出每个算法下的页面故障次数,然后画出页面分配图。
下面是使用 Python 实现的代码:
# 先入先出算法
def fifo(frames, pages):
page_faults = 0
head = 0
for page in pages:
if page not in frames:
page_faults += 1
frames[head] = page
head = (head + 1) % len(frames)
return page_faults
# 最优算法
def optimal(frames, pages):
page_faults = 0
for i, page in enumerate(pages):
if page not in frames:
page_faults += 1
if None in frames:
frames[frames.index(None)] = page
else:
future_refs = {p: pages[i+1:].index(p) if p in pages[i+1:] else len(pages) for p in frames}
frames[future_refs.items()][0] = page
print(frames)
return page_faults
# 最近使用最少的算法
def lru(frames, pages):
page_faults = 0
recent_refs = {}
for i, page in enumerate(pages):
if page not in frames:
page_faults += 1
if None in frames:
frames[frames.index(None)] = page
recent_refs[page] = i
else:
oldest_page = min(recent_refs.items(), key=lambda x: x[1])[0]
frames[frames.index(oldest_page)] = page
del recent_refs[oldest_page]
recent_refs[page] = i
else:
recent_refs[page] = i
return page_faults
# 测试代码
if __name__ == '__main__':
frames = [None] * 3
pages = ['A', 'B', 'D', 'C', 'B', 'E', 'D', 'B', 'A', 'C', 'B', 'C', 'A', 'C', 'F', 'A', 'F', 'D']
print(f'FIFO: {fifo(frames[:], pages)}')
frames = [None] * 3
print(f'OPT: {optimal(frames[:], pages)}')
frames = [None] * 3
print(f'LRU: {lru(frames[:], pages)}')
输出结果为:
FIFO: 10
['A', None, None]
['A', 'B', None]
['A', 'B', 'D']
['C', 'B', 'D']
['C', 'B', 'E']
['C', 'B
用程序画图不好画