Compare commits
4 Commits
c593f3b0e9
...
5676194e14
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5676194e14 | ||
![]() |
f63c1d9e6f | ||
![]() |
f95f1446bf | ||
![]() |
b6ef8f4aef |
53
操作系统/题目5.py
Normal file
53
操作系统/题目5.py
Normal 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
45
操作系统/题目6.py
Normal 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
28
操作系统/题目7.py
Normal 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
50
操作系统/题目8.py
Normal 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__":
|
||||||
|
主函数()
|
Loading…
x
Reference in New Issue
Block a user