Compare commits

...

4 Commits

Author SHA1 Message Date
GuanM
5676194e14 H题目完成 2024-11-07 18:03:57 +08:00
GuanM
f63c1d9e6f 题目G完成 2024-11-07 17:46:15 +08:00
GuanM
f95f1446bf E题目答案 2024-11-07 17:24:47 +08:00
GuanM
b6ef8f4aef 完成题目F 2024-11-07 17:15:18 +08:00
4 changed files with 176 additions and 0 deletions

53
操作系统/题目5.py Normal file
View File

@ -0,0 +1,53 @@
def 安全检查(可用, 最大需求, 分配, 进程):
n = len(进程)
工作 = 可用.copy()
完成 = [False] * n
安全序列 = []
需求 = []
for i in range(n):
需求.append([最大需求[i][j] - 分配[i][j] for j in range(3)])
while True:
找到 = False
for i in range(n):
if not 完成[i] and all(需求[i][j] <= 工作[j] for j in range(3)):
for j in range(3):
工作[j] += 分配[i][j]
完成[i] = True
安全序列.append(进程[i])
找到 = True
break
if not 找到:
break
return all(完成), 安全序列
def 主函数():
资源 = list(map(int, input().split()))
进程 = []
最大需求 = []
分配 = []
for _ in range(4):
= input().split()
进程.append([0])
最大需求.append(list(map(int, [1:4])))
分配.append(list(map(int, [4:7])))
可用 = 资源.copy()
for i in range(4):
for j in range(3):
可用[j] -= 分配[i][j]
安全状态, 序列 = 安全检查(可用, 最大需求, 分配, 进程)
if 安全状态:
print(" ".join(序列))
else:
print("false")
if __name__ == "__main__":
主函数()

45
操作系统/题目6.py Normal file
View File

@ -0,0 +1,45 @@
def 计算空闲分区数量(进程数量, 分配信息, 回收进程):
进程映射 = {}
for i in range(进程数量):
起始地址 = 分配信息[i*2]
大小 = 分配信息[i*2+1]
进程映射[f'p{i+1}'] = (起始地址, 大小)
回收列表 = 回收进程.split()
for 进程 in 回收列表:
if 进程 not in 进程映射:
return "false"
已分配区域 = []
for i in range(进程数量):
进程 = f'p{i+1}'
if 进程 not in 回收列表:
起始地址, 大小 = 进程映射[进程]
已分配区域.append((起始地址, 起始地址 + 大小))
if not 已分配区域:
return 1
已分配区域.sort()
空闲数量 = 1
if 已分配区域[0][0] > 0:
空闲数量 = 1
else:
空闲数量 = 0
for i in range(len(已分配区域)-1):
if 已分配区域[i+1][0] > 已分配区域[i][1]:
空闲数量 += 1
if 已分配区域[-1][1] < 512:
空闲数量 += 1
return 空闲数量
进程数量 = int(input())
分配信息 = list(map(int, input().split()))
回收进程 = input()
print(计算空闲分区数量(进程数量, 分配信息, 回收进程))

28
操作系统/题目7.py Normal file
View File

@ -0,0 +1,28 @@
def 计算物理地址(段表, 逻辑地址):
段号, 偏移 = 逻辑地址
if 段号 < 0 or 段号 >= len(段表):
return "interrupt"
起始地址, 段长度 = 段表[段号]
if 偏移 < 0 or 偏移 >= 段长度:
return "interrupt"
else:
return 起始地址 + 偏移
段表输入 = input().split()
逻辑地址输入 = input().split()
段表 = []
for i in range(0, len(段表输入), 2):
起始地址 = int(段表输入[i])
段长度 = int(段表输入[i + 1])
段表.append((起始地址, 段长度))
段号 = int(逻辑地址输入[0])
偏移 = int(逻辑地址输入[1])
物理地址 = 计算物理地址(段表, (段号, 偏移))
print(物理地址)

50
操作系统/题目8.py Normal file
View File

@ -0,0 +1,50 @@
def 初始化位示图():
bitmap = [0] * 64
已占用 = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
for in 已占用:
bitmap[] = 1
return bitmap
def 分配内存(bitmap, 进程大小):
进程块 = {}
for 进程ID, 大小 in enumerate(进程大小, 1):
if 大小 > 54:
continue
块列表 = []
计数 = 0
for i in range(64):
if len(块列表) == 大小:
break
if bitmap[i] == 0:
块列表.append(i)
bitmap[i] = 1
计数 += 1
if 计数 < 大小:
for in 块列表:
bitmap[] = 0
else:
进程块[进程ID] = 块列表
return 进程块
def 主函数():
进程大小 = list(map(int, input().split()))
查询进程, 查询页面 = map(int, input().split())
bitmap = 初始化位示图()
进程块 = 分配内存(bitmap, 进程大小)
if 查询进程 not in 进程块:
print("wait")
elif 查询页面 >= 进程大小[查询进程-1] or 查询页面 < 0:
print("error")
else:
print(进程块[查询进程][查询页面])
if __name__ == "__main__":
主函数()