计算机操作系统实验之进程调度(二)优先级调度法(C语言)

实验目的

1、理解进程调度的任务、机制和方式

2、了解优先级调度算法的基本原理

实验内容与基本要求

用C,C++等语言编写程序,模拟使用静态优先级调度算法实现进程调度

优先级调度算法的基本内容

在时间片轮转调度算法中,有一个隐含的假设:系统中所有进程的紧迫性是一致的。但是在实际中并不是如此,因此实际在进程调度算法中引入“优先级”这个概念,形成了优先级调度算法。

优先级调度算法,就是把处理机分配给就绪队列中优先级最高的进程。现在的问题是:处理机正在执行目前就绪队列中优先级最高的进程B,此时又出现了另一个优先级更高的进程A,系统该如何处理?针对这个问题的不同处理方式,形成了优先级调度算法的两个类型:一种是抢占式的优先级调度算法,一种是非抢占式的优先级调度算法。

  • 抢占式优先级调度算法:在这种算法中,只要出现了一个优先级更高的进程A,就停止正在执行的进程B,让A立刻投入执行
  • 非抢占式优先级调度算法:在这种算法中,处理机已经分配给了进程B,就让B一直执行结束,或等B自动放弃处理机时,才将处理机分配给A

优先级调度算法的核心问题是:如何确定进程的优先级?

优先级根据性质的不同,也分为两种类型:静态优先级和动态优先级。

  • 静态优先级:在进程创建时就决定,并且在进程的整个运行期间保持不变
  • 动态优先级:在进程创建时先赋予一个优先级,但是其值会随着进程的推进或等待时间的增加而改变。

静态优先级容易实现,但是可能会出现优先级低的进程始终无法被调度的情况。而动态优先级根据不同的规定来计算优先级,有利于促进进程调度的公平性。

实现思路

用轮转调度法类似,进程PCB的结构和进程队列的设置方式不变,只是调度的方法有区别而已。

附:上篇轮转调度法 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

PCB的属性包括:1.进程名字2.进程优先级3.进程的状态4.时间片5.总共需要的运行时间6.cpu时间(已运行时间)7.还需要运行的时间8.计数器9.下一个要执行的进程指针。

仍然使用带头结点的单链表来存储进程队列,已完成的进程不移出队列,而是沉到队列底部。

本次实验实现的是非抢占式的静态优先级调度方式,优先级在进程创建时就决定好(可以由随机数生成,也可以让用户自己输入)。由于是非抢占式的,因此每个进程只会获得一次处理机,无论它的执行时间是多长,都要执行完后才会调度下一个进程。

至于具体怎么实现调度,有两种思路:第一种是在每次调度时去查找队列中未完成的优先级最大的进程,将它的状态变为完成。第二种是:先将队列按优先级顺序排序,然后再依次执行。本次实验采用的是第二种,因此额外写了方法,用于按优先级排序。排序的方法是:将链表从头结点处断开,依次取出首元结点后的每个结点,对链表进行按值(优先级的值)插入,优先级从大到小排列。

算法流程图

img_1

全部代码

工程图

img_5

ProcessScheduling.h
//
//  ProcessScheduling.h
//  ProcessSchedulingTest
//
//  Created by Apple on 2019/10/21.
//  Copyright © 2019 Yao YongXin. All rights reserved.
//

#ifndef ProcessScheduling_h
#define ProcessScheduling_h

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>

#define TIME_SLICE 2

//线程状态:就绪 等待 完成
enum process_type{
   
    process_type_waitting = 'W',
    process_type_ready = 'R',
    process_type_finish = 'F'
};

//进程控制块结构体
typedef struct PCB_Type{
   
    //进程的名字
    char *name;
    //进程的优先级
    int priority;
    //仍需运行时间
    int need_time;
    //进程的状态 就绪  等待
    char state;
    //时间片
    int time_slice;
    //cpu时间 ->已运行时间
    int cpu_time;
    //计数器
    int time_count;
    //总共需要的运行时间
    int total_time;

    //下一个要执行的进程
    struct PCB_Type *next;
}PCB;

//创建新的进程
void create_process(PCB *running_list,char *name,int need_time);
void create_process1(PCB *running_list,char *name,int need_time,int priority);
//展示当前就绪队列状态
void show
  • 16
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值