代码FCFS先来先服务和SJF短作业优先
时间: 2023-11-17 14:05:06 浏览: 23
FCFS(First-Come, First-Serve)算法是一种基本的进程调度算法,它按照进程到达的顺序为它们分配 CPU 时间片,也就是说,先到来的进程先得到服务。这种算法简单易懂,但是可能会产生长作业等待时间过长的问题。
SJF(Shortest Job First)算法是一种非抢占式的进程调度算法,它根据每个进程需要执行的时间来进行排序,优先执行需要执行时间最短的进程。这种算法可以减少平均等待时间,但是可能会导致长作业无法得到及时执行。如果采用抢占式的 SJF 算法,则可以避免这种情况。
相关问题
FCFS先来先服务和SJF短作业优先这两段代码
以下是FCFS先来先服务和SJF短作业优先的代码实现:
FCFS先来先服务:
```python
processes = []
n = int(input("输入进程数:"))
for i in range(n):
process = []
process.append(input("输入进程名:"))
process.append(int(input("输入进程到达时间:")))
process.append(int(input("输入进程执行时间:")))
processes.append(process)
processes.sort(key=lambda x: x[1]) # 按进程到达时间排序
waiting_time = 0
for i in range(n):
print("运行进程:", processes[i][0])
if waiting_time < processes[i][1]:
waiting_time = processes[i][1] # 等待进程到达
waiting_time += processes[i][2] # 运行进程
print("等待时间:", waiting_time - processes[i][1])
print("平均等待时间:", waiting_time / n)
```
SJF短作业优先:
```python
processes = []
n = int(input("输入进程数:"))
for i in range(n):
process = []
process.append(input("输入进程名:"))
process.append(int(input("输入进程到达时间:")))
process.append(int(input("输入进程执行时间:")))
processes.append(process)
processes.sort(key=lambda x: x[2]) # 按进程执行时间排序
waiting_time = 0
for i in range(n):
print("运行进程:", processes[i][0])
if waiting_time < processes[i][1]:
waiting_time = processes[i][1] # 等待进程到达
waiting_time += processes[i][2] # 运行进程
print("等待时间:", waiting_time - processes[i][1])
print("平均等待时间:", waiting_time / n)
```
这两段代码都是基于CPU调度算法的模拟,输入进程的到达时间和执行时间,并按照指定的算法进行排序,然后模拟CPU的运行过程,计算出平均等待时间。其中,FCFS先来先服务算法按进程到达时间排序,依次运行每个进程,而SJF短作业优先算法按进程执行时间排序,先运行执行时间短的进程。
先来先服务和短作业优先调度算法代码
以下是先来先服务(FCFS)和短作业优先(SJF)调度算法的代码示例:
先来先服务(FCFS)调度算法:
```python
# FCFS调度算法
def fcfs(processes):
n = len(processes)
# 按照到达时间进行升序排序
processes = sorted(processes, key=lambda x: x[0])
# 计算等待时间和周转时间
waiting_time, turnaround_time = [0] * n, [0] * n
for i in range(1, n):
waiting_time[i] = waiting_time[i - 1] + processes[i - 1][1]
for i in range(n):
turnaround_time[i] = waiting_time[i] + processes[i][1]
# 计算平均等待时间和平均周转时间
avg_waiting_time = sum(waiting_time) / n
avg_turnaround_time = sum(turnaround_time) / n
# 返回结果
return avg_waiting_time, avg_turnaround_time
```
短作业优先(SJF)调度算法:
```python
# SJF调度算法
def sjf(processes):
n = len(processes)
# 按照到达时间进行升序排序
processes = sorted(processes, key=lambda x: x[0])
# 初始化等待时间和周转时间
waiting_time, turnaround_time = [0] * n, [0] * n
# 记录已经运行的时间
run_time = 0
# 记录已经完成的进程数
completed = 0
# 循环运行进程
while completed < n:
# 找到所有已经到达的进程
arrived_processes = [process for process in processes if process[0] <= run_time and process[3] == 0]
if not arrived_processes:
# 如果当前没有进程到达,则时间加1
run_time += 1
continue
# 找到运行时间最短的进程
shortest_process = min(arrived_processes, key=lambda x: x[1])
# 更新等待时间和周转时间
index = processes.index(shortest_process)
waiting_time[index] = run_time - shortest_process[0]
turnaround_time[index] = waiting_time[index] + shortest_process[1]
# 更新已经运行的时间和完成的进程数
run_time += shortest_process[1]
completed += 1
# 标记已经完成的进程
processes[index][3] = 1
# 计算平均等待时间和平均周转时间
avg_waiting_time = sum(waiting_time) / n
avg_turnaround_time = sum(turnaround_time) / n
# 返回结果
return avg_waiting_time, avg_turnaround_time
```
以上两个算法都是使用Python语言编写的。其中,`processes`是一个列表,表示进程的信息。每个进程由四个元素组成,依次为到达时间、运行时间、优先级(如果是SJF算法,优先级为运行时间)和完成标志(0表示未完成,1表示已完成)。这两个算法的返回值都是平均等待时间和平均周转时间。