博客
关于我
操作系统 进程调度实验报告
阅读量: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事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>
    Mysql Can't connect to MySQL server
    查看>>
    mysql case when 乱码_Mysql CASE WHEN 用法
    查看>>
    Multicast1
    查看>>