博客
关于我
操作系统 进程调度实验报告
阅读量:616 次
发布时间:2019-03-13

本文共 3484 字,大约阅读时间需要 11 分钟。

操作系统进程调度模拟实验报告

一、实验目的

本实验旨在模拟单处理机环境下的进程调度问题,加深对操作系统核心算法的理解,特别是优先权法和轮转法。

二、实验内容与要求

1. 实验内容

  • 算法描述

    • 优先权法:动态调整进程的优先权,当当前进程用完时间片后,其优先权减少一定值。
    • 轮转法:严格按照进程到达系统的先后顺序轮转执行,每个进程执行完所需时间片后,立即回到就绪队列。
  • 简化假设

    • 进程为计算型,无I/O操作。
    • 进程状态:ready(就绪)、running(运行)、finish(完成)。
    • CPU时间以时间片为单位分配。
  • 2. 实验要求

  • 随机数的范围限制,且CPU时间片控制在1~20秒。
  • 进程数量通常设置为4~8个,避免过多影响性能。
  • 使用适当的动态数据结构,优先使用队列。
  • 独立编程,确保算法正确性。
  • 实现两种调度算法并进行对比分析。
  • 三、流程图与模块调用

    流程图展示了实验中的主要模块:

  • 初始设置:创建指定数量的进程,并随机生成其属性(如优先权重、时间片、轮转次数)。
  • 调度选择:根据用户输入选择优先权法或轮转法。
  • 执行调度算法:根据选算法执行进程调度逻辑。
  • 四、实验分析

    1. 优先权法分析

    • 核心机制:通过动态调整优先权,每次调度时优先执行优先权最高的进程。
    • 数据结构:使用队列存储进程,采用每次降序排序根据优先权选择进程。
    • 实现细节
      • 每次执行时,减少当前正在运行进程的优先权。
      • 判断进程是否完成,或是否需要继续运行。
    • 优缺点
      • 优先权动态调整,适合处理I/O密集型任务。
      • 可能引起某些进程长时间留在系统,影响其他进程的执行。

    2. 轮转法分析

    • 核心机制:严格按到系统的先后顺序轮转,每个进程在得到必要时间后立即回到队列。
    • 数据结构:使用队列存储进程,每次提前弹出并立即重新放回。
    • 实现细节
      • 每次取出一个进程,如果其时间片未用完,则逐个减少时间片并返回队列。
      • 若时间片用完,则标记为完成并永久从队列中移除。
    • 优缺点
      • 强调公平性,每个进程都有机会得到资源。
      • 可能导致长时间运行的进程占用过多CPU时间。

    五、运行情况分析

    1. 优先权法表现

    • 实验显示,优先权法能够较好地通过对优先权的动态调整,提高高优先级进程的执行效率。
    • 低优先级进程可能在空闲时被推送到队列,需定期检查并调整运行状态。
    • 当高优先级进程完成时,其优先权是否及时减少,会直接影响后续调度和进程执行效率。

    2. 轮转法表现

    • 轮转法的运行较为稳定,确保每个进程按顺序获得处理机会。
    • 长时间运行的进程可能反复出现在队列中,导致节外生枝。
    • 优化策略需要定期检查队列中的进程状态,避免无效调度。

    六、实验体会

  • 对操作系统算法的理解:通过本次实验,我深刻认识到进程调度的复杂性以及各类调度算法的特点。
  • 算法实现的挑战:在编写优先权和轮转法的调度逻辑时,需要细致处理进程状态与时间片的逻辑关系。
  • 数据结构的选型:队列作为主要数据结构,在两种调度算法中发挥了重要作用。
  • 实验中的收获:及时发现算法中的逻辑错误,并通过内存Dump和调试逐步解决,提升了面对复杂系统逻辑的心理素质。
  • 七、附 priesty 代码

    以下是基于Python实现的实验代码,用于模拟优先权法和轮转法的调度算法:

    import operatorimport randomimport queueclass PCB:    def __init__(self, id, status, weight, needTime, rotelTimes):        self.id = id        self.status = status        self.weight = weight        self.needTime = needTime        self.rotelTimes = rotelTimesdef emptyQueue(Q):    while not Q.empty():        Q.get()def priority():    global Q, arr_pcb    emptyQueue(Q)    arr_pcb.sort(key=operator.attrgetter('weight'), reverse=True)    for index, item in enumerate(arr_pcb):        if item.needTime > 0:            Q.put(item)        if index > 0:            if item.status != 'finish':                item.status = 'ready'    if not Q.empty():        node = Q.get()        node.needTime -= 1        node.weight -= 3        if node.needTime > 0:            node.status = 'running'        elif node.needTime == 0:            node.status = 'finish'def rotel():    global arr_pcb    for a, item in enumerate(arr_pcb):        if item.needTime > 0:            for b, item2 in enumerate(arr_pcb):                if a != b:                    if item2.status == 'running':                        item2.status = 'ready'            item.status = 'running'            for j in range(item.rotelTimes):                if item.needTime > 0:                    item.needTime -= 1                    if item.needTime == 0:                        item.status = 'finish'                else:                    breakN = int(input('请输入需要创建的进程数目(4-8个):'))arr_pcb = []for i in range(N):    status = random.randint(1, 10)    needTime = random.randint(1, 4)    rotelTimes = random.randint(1, 3)    arr_pcb.append(PCB(i, 'ready', status, needTime, rotelTimes))key = input('是否采用优先权?Y/N')if key == 'Y':    print('进程初始化完毕。')    for i in arr_pcb:        print(f'进程 {i.id}:{i.status},优先权重 {i.weight},需要时间片 {i.needTime}')    priority()    while not Q.empty():        priority()elif key == 'N':    print('进程初始化完毕。')    for i in arr_pcb:        print(f'进程 {i.id}:{i.status},轮转次数 {i.rotelTimes},需要时间片 {i.needTime}')    flag = 0    for item in arr_pcb:        if item.needTime > 0:            flag = 1    while flag:        rotel()

    本实验通过对两种调度算法的深入研究,不仅加深了理论理解,还通过实际编码和调试提升了实践能力,为后续操作系统学习打下了坚实基础。

    转载地址:http://rszaz.baihongyu.com/

    你可能感兴趣的文章
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>