生活随笔
收集整理的這篇文章主要介紹了
磁盘寻道算法 Python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作系統模擬之磁盤尋道算法。
文件共1份,代碼如下:
import math
import random
import copy
def alo_fcfs():print("您選擇了FCFS算法,執行結果如下:")print("當前磁道號 下一磁道號 絕對差")print('{:6d}{:10d}{:8d}'.format(start_numer
, disk_queue
[0], abs(start_numer
- disk_queue
[0])))sum_distance
= abs(start_numer
- disk_queue
[0])for i
in range(disk_queue_length
- 1):sum_distance
= sum_distance
+ abs(disk_queue
[i
] - disk_queue
[i
+ 1])print('{:6d}{:10d}{:8d}'.format(disk_queue
[i
], disk_queue
[i
+ 1], abs(disk_queue
[i
] - disk_queue
[i
+ 1])))print('{:6d} {} {}'.format(disk_queue
[i
], "None", "None"))print('尋道序列總長{:d},FCFS算法的平均尋道長度為{:.2f}'.format(sum_distance
, sum_distance
/ (disk_queue_length
+ 1)))def alo_sstf():print("您選擇了SSTF算法,執行結果如下:")print("當前磁道號 下一磁道號 絕對差")sum_distance
= 0last_number
= start_numertemp_queue
= copy
.deepcopy
(disk_queue
)while len(temp_queue
) > 0:index
= 0min_diff
= 0x3f3f3f3ffor i
in range(len(temp_queue
)):if abs(temp_queue
[i
] - last_number
) < min_diff
:index
= imin_diff
= abs(temp_queue
[i
] - last_number
)print('{:6d}{:10d}{:8d}'.format(last_number
, temp_queue
[index
], min_diff
))last_number
= temp_queue
[index
]sum_distance
= sum_distance
+ min_difftemp_queue
.pop
(index
)print('{:6d} {} {}'.format(last_number
, "None", "None"))print('尋道序列總長{:d},SSTF算法的平均尋道長度為{:.2f}'.format(sum_distance
, sum_distance
/ (disk_queue_length
+ 1)))def cal(temp_queue
, start_number
, index
, left1
, left2
, right1
, right2
, step1
, step2
):last_number
= start_number
print('{:6d}{:10d}{:8d}'.format(last_number
, temp_queue
[index
], abs(last_number
- temp_queue
[index
])))sum_distance
= abs(last_number
- temp_queue
[index
])last_number
= temp_queue
[index
]for j
in range(left1
, right1
, step1
):print('{:6d}{:10d}{:8d}'.format(last_number
, temp_queue
[j
], abs(last_number
- temp_queue
[j
])))sum_distance
= sum_distance
+ abs(last_number
- temp_queue
[j
])last_number
= temp_queue
[j
]for j
in range(left2
, right2
, step2
):print('{:6d}{:10d}{:8d}'.format(last_number
, temp_queue
[j
], abs(last_number
- temp_queue
[j
])))sum_distance
= sum_distance
+ abs(last_number
- temp_queue
[j
])last_number
= temp_queue
[j
]print('{:6d} {} {}'.format(last_number
, "None", "None"))print('尋道序列總長{:d},FCFS算法的平均尋道長度為{:.2f}'.format(sum_distance
, sum_distance
/ (disk_queue_length
+ 1)))def alo_scan():print("您選擇了SCAN算法,執行結果如下:")print("請繼續選擇當前磁頭運動方向")print("由低到高請輸入1")print("由高到低請輸入2")last_number
= start_numerdirection_choice
= int(input())temp_queue
= copy
.deepcopy
(disk_queue
)temp_queue
.sort
()print()print("當前磁道號 下一磁道號 絕對差")if direction_choice
== 1:for j
in temp_queue
:if j
> start_numer
:index
= temp_queue
.index
(j
)breakcal
(temp_queue
, start_numer
, index
, index
+ 1, index
- 1, disk_queue_length
, -1, 1, -1)elif direction_choice
== 2:for j
in range(disk_queue_length
- 1, -1, -1):if temp_queue
[j
] < start_numer
:index
= j
breakcal
(temp_queue
, start_numer
, index
, index
- 1, index
+ 1, -1, disk_queue_length
, -1, 1)def alo_cscan():print("您選擇了CSCAN算法,執行結果如下:")print("請繼續選擇當前磁頭運動方向")print("由低到高請輸入1")print("由高到低請輸入2")last_number
= start_numerdirection_choice
= int(input())temp_queue
= copy
.deepcopy
(disk_queue
)temp_queue
.sort
()print()print("當前磁道號 下一磁道號 絕對差")if direction_choice
== 1:for j
in temp_queue
:if j
> start_numer
:index
= temp_queue
.index
(j
)breakcal
(temp_queue
, start_numer
, index
, index
+ 1, 0, disk_queue_length
, index
, 1, 1)elif direction_choice
== 2:for j
in range(disk_queue_length
- 1, -1, -1):if temp_queue
[j
] < start_numer
:index
= j
breakcal
(temp_queue
, start_numer
, index
, index
- 1, disk_queue_length
- 1, -1, index
, -1, -1)if __name__
== "__main__":print("歡迎進入操作系統演示之磁盤尋道算法")print("現在開始數據初始化")print("請輸入磁盤尋道序列長度(10-20,含端點):")disk_queue_length
= int(input())if 10 <= disk_queue_length
<= 20:print("輸入成功!")else:print("您輸入的磁盤尋道序列長度超出給定范圍,請重新輸入10-20(含端點)的數字:")print("請輸入磁盤尋道序列長度(10-20,含端點):")disk_queue_length
= int(input())disk_queue
= []for k
in range(disk_queue_length
):disk_queue
.append
(random
.randint
(0, 200))start_numer
= random
.randint
(0, 200)print()print('生成的磁盤尋道序列為:{}'.format(disk_queue
))while True:print()print("請選擇要執行的磁盤尋道算法:")print("選擇FCFS請輸入1")print("選擇SSTF請輸入2")print("選擇SCAN請輸入3")print("選擇CSCAN請輸入4")menu_choice
= int(input())if menu_choice
== 1:alo_fcfs
()elif menu_choice
== 2:alo_sstf
()elif menu_choice
== 3:alo_scan
()elif menu_choice
== 4:alo_cscan
()else:print("您選擇的不在范圍內,請重新輸入")print()continueprint()print("繼續嘗試其他算法請輸入1")print("更新數據請輸入2")print("結束程序請輸入3")end_choice
= int(input())if end_choice
== 1:continueelif end_choice
== 2:print("現在開始更新數據")print("請輸入更新的磁盤尋道序列長度(10-20,含端點):")disk_queue_length
= int(input())if 10 <= disk_queue_length
<= 20:print("更新成功!")else:print("您輸入的磁盤尋道序列長度超出給定范圍,請重新輸入10-20(含端點)的數字:")print("請輸入磁盤尋道序列長度(10-20,含端點):")disk_queue_length
= int(input())disk_queue
= []for k
in range(disk_queue_length
):disk_queue
.append
(random
.randint
(0, 200))print()print('更新的磁盤尋道序列為:{}'.format(disk_queue
))start_numer
= random
.randint
(0, 200)else:print("程序退出成功!")break
總結
以上是生活随笔為你收集整理的磁盘寻道算法 Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。