251 lines
8.7 KiB
Python
251 lines
8.7 KiB
Python
import re
|
||
from typing import Dict, Any, Callable
|
||
from process_management import Process, ProcessState
|
||
from resource_management import ResourceType
|
||
from memory_management import MemoryAllocationStrategy
|
||
|
||
|
||
class CommandInterpreter:
|
||
"""
|
||
解释并执行模拟操作系统的命令
|
||
"""
|
||
|
||
def __init__(self):
|
||
# 命令映射
|
||
self.commands: Dict[str, Callable] = {
|
||
'ALLOCATE': self.allocate_memory,
|
||
'REQUEST_RESOURCE': self.request_resource,
|
||
'RELEASE_RESOURCE': self.release_resource,
|
||
'CREATE_FILE': self.create_file,
|
||
'DELETE_FILE': self.delete_file,
|
||
'READ_FILE': self.read_file,
|
||
'WRITE_FILE': self.write_file,
|
||
'DISK_SEEK': self.optimize_disk_seek,
|
||
}
|
||
|
||
def execute_command(self, command: str, process: Process, os_system: Any):
|
||
"""
|
||
解析并执行给定进程的命令
|
||
|
||
:param command: 要执行的命令字符串
|
||
:param process: 执行命令的进程
|
||
:param os_system: 操作系统引用
|
||
"""
|
||
# 将命令分词
|
||
tokens = command.strip().split()
|
||
|
||
if not tokens:
|
||
return
|
||
|
||
# 提取命令和参数
|
||
cmd = tokens[0].upper()
|
||
args = tokens[1:]
|
||
|
||
# 查找并执行相应的命令
|
||
if cmd in self.commands:
|
||
try:
|
||
self.commands[cmd](process, os_system, *args)
|
||
except Exception as e:
|
||
print(f"执行命令 {cmd} 时出错: {e}")
|
||
else:
|
||
print(f"未知命令: {cmd}")
|
||
|
||
def allocate_memory(self, process: Process, os_system: Any, size: str = None, strategy: str = None):
|
||
"""
|
||
为进程分配内存
|
||
|
||
:param process: 请求内存分配的进程
|
||
:param os_system: 操作系统引用
|
||
:param size: 要分配的内存大小
|
||
:param strategy: 内存分配策略
|
||
"""
|
||
# 将大小转换为整数
|
||
try:
|
||
memory_size = int(size or 1024) # 如果未指定,默认1KB
|
||
except ValueError:
|
||
memory_size = 1024
|
||
|
||
# 确定分配策略
|
||
if strategy:
|
||
strategy = strategy.lower()
|
||
allocation_strategies = {
|
||
'first': MemoryAllocationStrategy.FIRST_FIT,
|
||
'best': MemoryAllocationStrategy.BEST_FIT,
|
||
'worst': MemoryAllocationStrategy.WORST_FIT
|
||
}
|
||
os_system.memory_manager.allocation_strategy = allocation_strategies.get(
|
||
strategy,
|
||
MemoryAllocationStrategy.FIRST_FIT
|
||
)
|
||
|
||
# 分配内存
|
||
start_address = os_system.memory_manager.allocate_memory(
|
||
process.pid,
|
||
memory_size
|
||
)
|
||
|
||
if start_address is not None:
|
||
print(f"进程 {process.pid} 分配了 {memory_size} 字节,地址为 {start_address}")
|
||
else:
|
||
print(f"进程 {process.pid} 内存分配失败")
|
||
|
||
def request_resource(self, process: Process, os_system: Any, resource_type: str):
|
||
"""
|
||
请求系统资源
|
||
|
||
:param process: 请求资源的进程
|
||
:param os_system: 操作系统引用
|
||
:param resource_type: 要请求的资源类型
|
||
"""
|
||
# 将字符串映射到ResourceType
|
||
resource_types = {
|
||
'PRINTER': ResourceType.PRINTER,
|
||
'DISK': ResourceType.DISK,
|
||
'NETWORK': ResourceType.NETWORK
|
||
}
|
||
|
||
# 验证并请求资源
|
||
try:
|
||
res_type = resource_types[resource_type.upper()]
|
||
success = os_system.resource_manager.request_resource(process.pid, res_type)
|
||
|
||
if success:
|
||
print(f"进程 {process.pid} 成功分配了 {resource_type}")
|
||
else:
|
||
print(f"进程 {process.pid} 资源 {resource_type} 分配失败")
|
||
except KeyError:
|
||
print(f"无效的资源类型: {resource_type}")
|
||
|
||
def release_resource(self, process: Process, os_system: Any, resource_type: str):
|
||
"""
|
||
释放先前分配的资源
|
||
|
||
:param process: 释放资源的进程
|
||
:param os_system: 操作系统引用
|
||
:param resource_type: 要释放的资源类型
|
||
"""
|
||
# 将字符串映射到ResourceType
|
||
resource_types = {
|
||
'PRINTER': ResourceType.PRINTER,
|
||
'DISK': ResourceType.DISK,
|
||
'NETWORK': ResourceType.NETWORK
|
||
}
|
||
|
||
try:
|
||
res_type = resource_types[resource_type.upper()]
|
||
|
||
# 查找并释放分配给该进程的此类资源
|
||
allocations = os_system.resource_manager.resource_allocations.get(process.pid, set())
|
||
resources_to_release = [
|
||
res for res in allocations
|
||
if res.type == res_type
|
||
]
|
||
|
||
for resource in resources_to_release:
|
||
os_system.resource_manager.release_resource(process.pid, resource)
|
||
print(f"进程 {process.pid} 释放了 {resource_type} 资源")
|
||
except KeyError:
|
||
print(f"无效的资源类型: {resource_type}")
|
||
|
||
def create_file(self, process: Process, os_system: Any, filename: str):
|
||
"""
|
||
在文件系统中创建文件
|
||
|
||
:param process: 创建文件的进程
|
||
:param os_system: 操作系统引用
|
||
:param filename: 要创建的文件名
|
||
"""
|
||
try:
|
||
success = os_system.file_system.create_file(filename, process.pid)
|
||
if success:
|
||
print(f"进程 {process.pid} 创建了文件: {filename}")
|
||
else:
|
||
print(f"文件 {filename} 创建失败")
|
||
except Exception as e:
|
||
print(f"创建文件 {filename} 时出错: {e}")
|
||
|
||
def delete_file(self, process: Process, os_system: Any, filename: str):
|
||
"""
|
||
从文件系统中删除文件
|
||
|
||
:param process: 删除文件的进程
|
||
:param os_system: 操作系统引用
|
||
:param filename: 要删除的文件名
|
||
"""
|
||
try:
|
||
success = os_system.file_system.delete_file(filename, process.pid)
|
||
if success:
|
||
print(f"进程 {process.pid} 删除了文件: {filename}")
|
||
else:
|
||
print(f"文件 {filename} 删除失败")
|
||
except Exception as e:
|
||
print(f"删除文件 {filename} 时出错: {e}")
|
||
|
||
def read_file(self, process: Process, os_system: Any, filename: str, offset: str = '0', size: str = None):
|
||
"""
|
||
从文件系统中读取文件
|
||
|
||
:param process: 读取文件的进程
|
||
:param os_system: 操作系统引用
|
||
:param filename: 要读取的文件名
|
||
:param offset: 文件起始字节偏移量
|
||
:param size: 要读取的字节数
|
||
"""
|
||
try:
|
||
# 将偏移量和大小转换为整数
|
||
offset_bytes = int(offset)
|
||
read_size = int(size) if size else None
|
||
|
||
content = os_system.file_system.read_file(
|
||
filename,
|
||
process.pid,
|
||
offset_bytes,
|
||
read_size
|
||
)
|
||
|
||
print(f"进程 {process.pid} 从文件 {filename} 读取: {content}")
|
||
except Exception as e:
|
||
print(f"读取文件 {filename} 时出错: {e}")
|
||
|
||
def write_file(self, process: Process, os_system: Any, filename: str, offset: str = '0', content: str = ''):
|
||
"""
|
||
向文件系统中的文件写入内容
|
||
|
||
:param process: 写入文件的进程
|
||
:param os_system: 操作系统引用
|
||
:param filename: 要写入的文件名
|
||
:param offset: 文件起始字节偏移量
|
||
:param content: 要写入的内容
|
||
"""
|
||
try:
|
||
# 将偏移量转换为整数
|
||
offset_bytes = int(offset)
|
||
|
||
success = os_system.file_system.write_file(
|
||
filename,
|
||
process.pid,
|
||
offset_bytes,
|
||
content
|
||
)
|
||
|
||
if success:
|
||
print(f"进程 {process.pid} 写入了文件 {filename}")
|
||
else:
|
||
print(f"文件 {filename} 写入失败")
|
||
except Exception as e:
|
||
print(f"写入文件 {filename} 时出错: {e}")
|
||
|
||
def optimize_disk_seek(self, process: Process, os_system: Any, *seek_params):
|
||
"""
|
||
优化磁盘寻道操作
|
||
|
||
:param process: 请求磁盘寻道优化的进程
|
||
:param os_system: 操作系统引用
|
||
:param seek_params: 磁盘寻道优化的参数
|
||
"""
|
||
try:
|
||
# 调用磁盘管理器的寻道优化方法
|
||
os_system.disk_manager.optimize_seek_operations()
|
||
print(f"进程 {process.pid} 请求了磁盘寻道优化")
|
||
except Exception as e:
|
||
print(f"磁盘寻道优化失败: {e}") |