设计一个按优先数调度算法实现处理器调度的程序。
(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:
队首标志
K2
K1 P1 K2 P2 K3 P3 K4 P4 K5 P5
0 K4 K5 K3 K1
2 3 1 2 4
1 5 3 4 2
R R R R R
PCB1 PCB2 PCB3 PCB4 PCB5
(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行: 优先数-1 要求运行时间-1
来模拟进程的一次运行。 提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。 (5) 进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。 (6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。 (8) 为五个进程任意确定一组“优先数”和“要求运行时间”,
下面是一个简单的按优先数调度算法的实现程序,使用Python语言编写。程序中定义了进程控制块(PCB)类,并实现了调度算法的逻辑。
class PCB:
def __init__(self, name, run_time, priority):
self.name = name # 进程名
self.run_time = run_time # 要求运行时间
self.priority = priority # 优先数
self.state = 'R' # 状态,初始为就绪
self.next = None # 指针,指向下一个进程
def insert_process(head, new_process):
"""按优先数从大到小插入进程"""
if head is None or new_process.priority > head.priority:
new_process.next = head
return new_process
else:
current = head
while current.next is not None and current.next.priority >= new_process.priority:
current = current.next
new_process.next = current.next
current.next = new_process
return head
def print_queue(head):
"""打印进程队列"""
current = head
while current is not None:
print(f"进程名: {current.name}, 优先数: {current.priority}, 要求运行时间: {current.run_time}, 状态: {current.state}")
current = current.next
print()
def scheduler(head):
"""调度程序"""
while head is not None:
# 选择队首进程
current = head
print(f"被选中进程: {current.name}")
# 模拟运行一次
current.priority -= 1
current.run_time -= 1
# 检查进程状态
if current.run_time == 0:
current.state = 'E' # 结束状态
print(f"进程 {current.name} 运行结束,状态变为 'E'")
head = current.next # 从队列中移除
else:
# 重新插入进程
head = current.next # 先移除当前进程
current.next = None # 清空指针
head = insert_process(head, current) # 重新插入
print("当前进程队列:")
print_queue(head)
# 初始化进程
processes = [
PCB("P1", 5, 3),
PCB("P2", 3, 4),
PCB("P3", 2, 2),
PCB("P4", 1, 5),
PCB("P5", 4, 1)
]
# 按优先数从大到小构建队列
head = None
for process in processes:
head = insert_process(head, process)
# 打印初始队列
print("初始进程队列:")
print_queue(head)
# 开始调度
scheduler(head)
运行该程序将输出每次被选中进程的名称、当前进程队列的变化,以及进程状态的更新。