先来先服务算法,短作业优先算法,最短寻道时间优先算法(SSTF),扫描算法(由外向里),扫描算法(由里向外),循环算法
时间: 2024-06-09 20:02:47 浏览: 157
先来先服务算法(First-Come, First-Served,FCFS)是一种非抢占式的调度算法,按照作业到达的先后顺序进行调度。
短作业优先算法(Shortest-Job-First,SJF)是一种非抢占式的调度算法,按照作业需要执行的时间长度来排序,先执行执行时间短的作业。
最短寻道时间优先算法(Shortest Seek Time First,SSTF)是一种磁盘调度算法,按照当前磁头位置和请求队列中下一个请求的位置来决定下一个要访问的磁道。
扫描算法(由外向里)是一种磁盘调度算法,磁头从最外侧开始移动,向内依次访问所有请求的磁道,直到访问完所有请求。
扫描算法(由里向外)是一种磁盘调度算法,磁头从最内侧开始移动,向外依次访问所有请求的磁道,直到访问完所有请求。
循环算法是一种磁盘调度算法,类似于扫描算法,但是在访问到最外侧或最内侧后会立即返回另一个方向,直到访问完所有请求。这种算法可以避免某些请求长时间等待。
相关问题
某磁盘共有200 个柱面, 从外到内依次编号为0,1,…….,199, 磁盘I/O 请求的柱面号序列如下:10, 100, 191, 31, 20, 150, 32, 磁头当前位于柱面98, 针对FCFS、SSTF、SCAN 调度算法分别计算总寻道距离。 假定SCAN 算法中磁头当前移动方向由外向内。
好的,根据您的要求,我不会透露您的任何要求,也不会重复您说的那段话。现在回答您的问题:
首先,根据题意,我们需要计算三种磁盘调度算法的总寻道距离,它们分别是:
- FCFS(先来先服务)
- SSTF(最短寻道时间优先)
- SCAN(扫描算法)
以下是三种算法的计算过程和结果:
1. FCFS
先来先服务算法,即按照磁盘 I/O 请求的先后顺序依次执行,不考虑磁头移动方向。
当前磁头位置在柱面 98,按照请求序列依次访问柱面 10、100、191、31、20、150、32,计算总寻道距离:
```
|98-10| + |100-10| + |191-100| + |31-191| + |20-31| + |150-20| + |32-150|
= 88 + 90 + 91 + 160 + 11 + 130 + 118
= 688
```
因此,FCFS 算法的总寻道距离为 688。
2. SSTF
最短寻道时间优先算法,即每次选择距离当前磁头位置最近的柱面进行访问,考虑磁头移动方向。
当前磁头位置在柱面 98,按照请求序列访问顺序为 100、91、150、20、10、31、32,计算总寻道距离:
```
|98-100| + |100-91| + |91-150| + |150-20| + |20-10| + |10-31| + |31-32|
= 2 + 9 + 59 + 130 + 10 + 21 + 1
= 232
```
因此,SSTF 算法的总寻道距离为 232。
3. SCAN
扫描算法,即先沿一个方向(由外向内或由内向外)扫描到最边缘,然后掉头沿相反方向扫描,考虑磁头移动方向。
当前磁头位置在柱面 98,按照请求序列顺序依次访问柱面 100、150、191、199、32、31、20、10,计算总寻道距离:
```
|98-100| + |100-150| + |150-191| + |191-199| + |199-32| + |32-31| + |31-20| + |20-10|
+ |10-0| + |0-199| + |199-191| + |191-150| + |150-32| + |32-20| + |20-31| + |31-98|
= 2 + 50 + 41 + 8 + 167 + 1 + 11 + 10 + 10 + 189 + 8 + 41 + 119 + 12 + 11 + 67
= 758
```
因此,SCAN 算法的总寻道距离为 758。
综上所述,FCFS 算法的总寻道距离为 688,SSTF 算法的总寻道距离为 232,SCAN 算法的总寻道距离为 758。
用磁盘调度算法编写代码要求分别FCFS、SSTF、SCAN、C-SCAN
以下是四种磁盘调度算法的代码实现:
1. FCFS(先来先服务)
```python
def fcfs(current, requests):
total_distance = 0
for request in requests:
total_distance += abs(request - current)
current = request
return total_distance
```
2. SSTF(最短寻道时间优先)
```python
def sstf(current, requests):
total_distance = 0
while requests:
shortest_distance = float('inf')
shortest_index = None
for i, request in enumerate(requests):
distance = abs(request - current)
if distance < shortest_distance:
shortest_distance = distance
shortest_index = i
request = requests.pop(shortest_index)
total_distance += shortest_distance
current = request
return total_distance
```
3. SCAN(扫描算法)
```python
def scan(current, requests, direction='right'):
total_distance = 0
if direction == 'right':
sorted_requests = sorted(requests)
else:
sorted_requests = sorted(requests, reverse=True)
index = 0
while index < len(sorted_requests) and sorted_requests[index] < current:
index += 1
while index < len(sorted_requests):
request = sorted_requests[index]
total_distance += abs(request - current)
current = request
index += 1
if direction == 'right':
total_distance += abs(current - max(requests))
current = max(requests)
else:
total_distance += abs(current - min(requests))
current = min(requests)
index -= 1
while index >= 0:
request = sorted_requests[index]
total_distance += abs(request - current)
current = request
index -= 1
return total_distance
```
4. C-SCAN(循环扫描算法)
```python
def c_scan(current, requests, direction='right'):
total_distance = 0
if direction == 'right':
sorted_requests = sorted(requests)
else:
sorted_requests = sorted(requests, reverse=True)
index = 0
while index < len(sorted_requests) and sorted_requests[index] < current:
index += 1
while index < len(sorted_requests):
request = sorted_requests[index]
total_distance += abs(request - current)
current = request
index += 1
if direction == 'right':
total_distance += abs(current - max(requests))
current = max(requests)
index = 0
else:
total_distance += abs(current - min(requests))
current = min(requests)
index = len(sorted_requests) - 1
while index >= 0:
request = sorted_requests[index]
total_distance += abs(request - current)
current = request
index -= 1
if direction == 'right':
total_distance += abs(current - min(requests))
else:
total_distance += abs(current - max(requests))
return total_distance
```
以上四种算法的实现均接收当前磁头位置和请求序列作为输入,返回总的寻道距离。其中 SCAN 和 C-SCAN 还接收运动方向参数,可以选择从内向外或从外向内扫描。
阅读全文