【操作系统】实验四 进程调度

实验名称: 实验四 进程调度

实验目的:  

1. 加深理解有关进程控制块、进程队列的概念

2. 体会和了解优先级和时间片轮转调度算法的具体实施办法

实验内容:

1. 设计进程控制块 PCB 表结构(与实验一的结构相同),分别适用于优先级调度算法和循环轮转调度算法,建立进程就绪队列。实现优先数调度循环轮转调度两种调度算法

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



typedef struct node

{

    char name[20];

    int prio;

    int round;

    int cputime;

    int needtime;

    char state;

    int count;

    struct node *next;

} PCB;



PCB *ready = NULL, *run = NULL, *finish = NULL;

int num;



void GetFirst();

void Output(char algorithm_type, int current_time);

void InsertPrio(PCB *in);

void InsertTime(PCB *in);

void InsertFinish(PCB *in);

void PrioCreate();

void TimeCreate();

void Priority();

void RoundRun();

int main(void)

{

    char chose;

    printf("请输入要创建的进程数目:\n");

    scanf("%d", &num);

    getchar();

    printf("输入进程的调度方法:(P/R)\n");

    scanf("%c", &chose);

    switch (chose)

    {

    case 'P':

    case 'p':

        PrioCreate();

        Priority();

        break;

    case 'R':

    case 'r':

        TimeCreate();

        RoundRun();

        break;

    default:

        break;

    }

    Output(chose, -1);

    return 0;

}



void GetFirst()

{

    run = ready;



    if (ready != NULL)

    {

        run->state = 'R';

        ready = ready->next;

        run->next = NULL;

    }

}



void Output(char algorithm_type, int current_time)

{

    PCB *p;

    printf("CPUTIME:%d\n", current_time); // 修改这里,加上 + 1

    if (algorithm_type == 'P' || algorithm_type == 'p')

    {

        printf("NAME\tCPUTIME\tNEEDTIME\tPRIORITY\tSTATE\tCOUNT\n");

        p = ready;

        while (p != NULL)

        {

            printf("%s\t%d\t%d\t%d\t\t%c\t\t%d\n", p->name, p->cputime, p->needtime, p->prio, p->state, p->count);

            p = p->next;

        }

    }

    else if (algorithm_type == 'R' || algorithm_type == 'r')

    {

        printf("NAME\tCPUTIME\tNEEDTIME\tCOUNT\tSTATE\n");

        p = run;

        while (p != NULL)

        {

            printf("%s\t%d\t%d\t%d\t\t%c\t\t%d\n", p->name, p->cputime, p->needtime, p->count, p->state, p->count);

            p = p->next;

        }

    }

    p = finish;

    while (p != NULL)

    {

        printf("%s\t%d\t%d\t%d\t\t%c\t\t%d\n", p->name, p->cputime, p->needtime, p->prio, p->state, p->count);

        p = p->next;

    }

}



void InsertPrio(PCB *in)

{

    PCB *fst, *nxt;

    fst = nxt = ready;



    if (ready == NULL)

    {

        in->next = ready;

        ready = in;

    }

    else

    {

        if (in->prio > fst->prio)

        {

            in->next = ready;

            ready = in;

        }

        else

        {

            while (fst->next != NULL)

            {

                nxt = fst;

                fst = fst->next;

            }



            if (fst->next == NULL)

            {

                in->next = fst->next;

                fst->next = in;

            }

            else

            {

                nxt = in;

                in->next = fst;

            }

        }

    }

}



void InsertTime(PCB *in)

{

    PCB *fst;

    fst = ready;



    if (ready == NULL)

    {

        in->next = ready;

        ready = in;

    }

    else

    {

        while (fst->next != NULL)

        {

            fst = fst->next;

        }

        in->next = fst->next;

        fst->next = in;

    }

}



void InsertFinish(PCB *in)

{

    PCB *fst;

    fst = finish;



    if (finish == NULL)

    {

        in->next = finish;

        finish = in;

    }

    else

    {

        while (fst->next != NULL)

        {

            fst = fst->next;

        }

        in->next = fst->next;

        fst->next = in;

    }

}



void PrioCreate()

{

    PCB *tmp;

    int i;



    printf("输入进程名字和进程所需时间:\n");

    for (i = 0; i < num; i++)

    {

        if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)

        {

            perror("malloc");

            exit(1);

        }

        scanf("%s", tmp->name);

        getchar();

        scanf("%d", &(tmp->needtime));

        tmp->cputime = 0;

        tmp->state = 'W';

        tmp->prio = 50 - tmp->needtime;

        tmp->round = 0;

        tmp->count = 0;

        InsertPrio(tmp);

    }

}



void TimeCreate()

{

    PCB *tmp;

    int i;



    printf("输入进程名字和进程时间片所需时间:\n");

    for (i = 0; i < num; i++)

    {

        if ((tmp = (PCB *)malloc(sizeof(PCB))) == NULL)

        {

            perror("malloc");

            exit(1);

        }

        scanf("%s", tmp->name);

        getchar();

        scanf("%d", &(tmp->needtime));

        tmp->cputime = 0;

        tmp->state = 'W';

        tmp->prio = 0;

        tmp->round = 2;

        tmp->count = 0;

        InsertTime(tmp);

    }

}



void Priority()

{

    int flag = 1;

    int current_time = 0;



    GetFirst();

    while (run != NULL)

    {

        current_time++;

        Output('P', current_time);

        while (flag)

        {

            run->prio -= 3;

            run->cputime++;

            run->needtime--;

            if (run->needtime == 0)

            {

                run->state = 'F';

                run->count++;

                InsertFinish(run);

                flag = 0;

            }

            else

            {

                run->state = 'W';

                run->count++;

                InsertTime(run);

                flag = 0;

            }

        }

        flag = 1;

        GetFirst();

    }

}



void RoundRun()

{

    int flag = 1;

    int current_time = 0;



    GetFirst();

    while (run != NULL)

    {

        current_time++;

        Output('R', current_time);

        flag = 1;

        while (flag)

        {

            run->count++;

            run->cputime++;

            run->needtime--;

            if (run->needtime == 0)

            {

                run->state = 'F';

                InsertFinish(run);

                flag = 0;

            }

            else if (run->count == run->round)

            {

                run->state = 'W';

                run->count = 0;

                InsertTime(run);

                flag = 0;

            }

        }



        GetFirst();

    }

}

算法设计与实现(附流程图和源代码):

调试过程及实验结果(附截图): 

思考题:

如果设计一个基于优先级的时间片轮转调度算法,请给出你的设计思想和方案。进程ID;

设计基于优先级的时间片轮转调度算法思路:

在基于优先级的时间片轮转调度算法中,每个进程拥有一个优先级,进程按照优先级的高低进行调度。当处于运行状态的进程的时间片用完时,系统将根据优先级选择下一个进程执行。这种算法结合了优先级和时间片轮转两种调度策略,确保高优先级的进程能够更快地得到执行,同时也防止了低优先级的进程永远无法执行的情况。

基本设计思路:

  1. 优先级赋值: 每个进程创建时,根据其属性和历史行为确定一个优先级。这个优先级可以包括进程的重要性、紧急程度、资源需求等因素,以确保系统能够更好地满足业务需求。
  2. 时间片轮转: 每个进程被分配一个时间片,当时间片用完时,系统将根据进程的优先级选择下一个进程执行。如果就绪队列中有高优先级的进程,它将被选择执行;否则,根据时间片轮转策略选择下一个进程。
  3. 动态调整优先级: 系统可以根据进程的行为动态调整其优先级。例如,等待时间较长的进程可以提高其优先级,以避免饥饿现象。
  4. 就绪队列管理: 就绪队列按照优先级进行排序,确保高优先级的进程在队列头部,方便系统快速选择下一个执行的进程。
  5. 合理设置时间片: 时间片的大小需要根据系统的特点和需求进行合理设置。过大的时间片可能导致低优先级进程得不到及时执行,而过小的时间片可能导致上下文切换频繁。

实验小结:

  1. 优势和局限性: 基于优先级的时间片轮转调度算法能够更好地满足不同进程的优先级需求,提高系统的响应速度。然而,需要注意的是,如果高优先级的进程数量过多,低优先级的进程可能会受到影响,产生饥饿现象。
  2. 系统性能: 该调度算法需要合理权衡进程的优先级和时间片大小,以确保系统整体性能的优化。在实际应用中,需要根据具体的场景和要求进行调整和优化。
  3. 动态调整: 动态调整优先级是提高系统灵活性的关键。通过监控进程的行为,系统可以实时调整进程的优先级,以适应不断变化的工作负载。
  4. 综合考虑: 在设计调度算法时,需要综合考虑系统的特点、任务的性质以及用户需求,以找到最适合的调度策略。不同场景可能需要不同的优先级调度算法来实现最佳性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/254882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【倒立摆】仿真、起摆

建模 在此示例中&#xff0c;我们将考虑带有推车的倒立摆系统的二维版本&#xff0c;其中摆锤位于 被限制在垂直平面内移动&#xff0c;如下图所示。对于该系统&#xff0c;控制输入是水平移动小车的力 F F F&#xff0c;输出是摆的角位置KaTeX parse error: Undefined contro…

计算机网络:数据链路层(广域网、PPP协议、HDLC协议)

今天又学会了一个知识&#xff0c;加油&#xff01; 目录 一、广域网 二、PPP协议 1、PPP协议应满足的要求 2、PPP协议无需满足的要求 3、PPP协议的三个组成部分 4、PPP协议的状态图 5、PPP协议的帧格式 三、HDLC协议 1、HDLC的站&#xff08;主站、从站、复合站&…

使用Kaptcha实现的验证码功能

目录 一.需求 二.验证码功能实现步骤 验证码 引入kaptcha依赖 完成application.yml配置文件 浏览器显示验证码 前端页面 登录页面 验证成功页面 后端 此验证码功能是以SpringBoot框架下基于kaptcha插件来实现的。 一.需求 1.页面生成验证码 2.输入验证码&#xff…

关于react native项目中使用react-native-wechat-lib@3.0.4

关于react native项目中使用react-native-wechat-lib3.0.4 插件官网安装依赖包&#xff08;Android和iOS下载插件完成后记得更新依赖&#xff0c;&#xff09;Android中配置1.在项目文件夹下面创建文件夹wxapi&#xff08;如上图&#xff09;2.在文件MainApplication.java中如下…

使用数组模拟栈的相关操作【栈1.1】

public class ArrayStackDemo {public static void main(String[] args) {ArrayStack arrayStack new ArrayStack(4);Scanner sc new Scanner(System.in);boolean loop true;char key ;while (loop) {System.out.println("栈操作菜单项");System.out.println(&q…

教育机构小程序管理系统的全方位优化

随着互联网的快速发展&#xff0c;线上教育也日益受到人们的关注和欢迎。为了满足广大学生和家长的需求&#xff0c;教育机构纷纷开发出自己的小程序管理系统。本文将详细介绍如何使用乔拓云平台&#xff0c;一键开发出自己的教育机构小程序管理系统。 1.进入乔拓云后台 首先&…

【SpringBoot】参数校验及异常处理

实现注册功能时经常遇到参数校验的问题。 参数校验 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数前添加注解&#xff0c;并指定校验规…

60V恒流IC SL8443B内置功率MOS 兼容PWM 降压LED恒流驱动芯片

以下是根据您的要求&#xff0c;按照知识经验类文章的特征所写的一篇关于“60V恒流IC 内置5V功率MOS 兼容PWM 降压LED恒流驱动芯片 SL8443B”的文章&#xff1a; 一、概述 SL8443B是一款60V恒流IC&#xff0c;内置5V功率MOS&#xff0c;兼容PWM降压LED恒流驱动芯片。它广泛应用…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机的各种信息如SN/ID等等&#xff08;C&#xff09; Baumer工业相机Baumer工业相机通过SDK获取相关生产信息的技术背景通过SDK获取相机信息的代码分析获取Baumer工业相机相关信息Baumer工业相机相关参数信息获取的测试 Baumer…

neuq-acm预备队训练week 9 P8604 [蓝桥杯 2013 国 C] 危险系数

题目背景 抗日战争时期&#xff0c;冀中平原的地道战曾发挥重要作用。 题目限制 题目描述 地道的多个站点间有通道连接&#xff0c;形成了庞大的网络。但也有隐患&#xff0c;当敌人发现了某个站点后&#xff0c;其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF…

【Linux】Linux运维基础

Linux简介&#xff1a; Linux是一个开源的操作系统内核&#xff0c;最初由Linus Torvalds创建。它通常与GNU工具一起使用&#xff0c;以创建一个完整的操作系统。Linux操作系统有许多基于内核的发行版&#xff0c;如Ubuntu、CentOS、Debian等&#xff0c;每个发行版都有其独特的…

KUKA机器人Loop循环的具体使用方法示例

KUKA机器人Loop循环的具体使用方法示例 如下图所示&#xff0c;新建一个示例程序&#xff0c; 如下图所示&#xff0c;添加一些动作指令&#xff0c; 如下图所示&#xff0c;如果想要机器人在第5行和第9行之间循环执行程序&#xff0c;则可以在第5行添加指令loop&#xff0…

Vue中插槽的使用

目录 一、默认插槽 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;代码展示 &#xff08;3&#xff09;后备内容 二、具名插槽 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;代码展示 三、作用域插槽 &#xff08;1&#xff09;概念 &#xff0…

配电室综合监测系统

配电室综合监测系统是一种集成了自动化、智能化等技术手段的电力监控系统。它通过对配电室内的电力设备进行实时监控、数据分析和处理&#xff0c;能够提高电力设备的安全性和效率&#xff0c;及时发现并解决电力故障和潜在问题&#xff0c;保证电力系统的稳定运行。 该系统通常…

MS5510模数转换器可Pin to Pin兼容TLC5510

MS5510 是 8 比特&#xff0c;20MSPS 模数转换器&#xff08;ADCs&#xff09;,同时使用一个半闪速结构。可Pin to Pin兼容TLC5510。MS5510在 5V 的电源电压下工作&#xff0c;其典型功耗只有 130mW&#xff0c;包括一个内部的采样保持电路&#xff0c;具有高阻抗方式的并行输出…

2024最新FL Studio21.2MAC电脑版中文版下载安装步骤教程

FL Studio 简称FL&#xff0c;全称Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前最新版本是FL Studio21.1.1.3750版本&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破…

【sprintboot+vue3】解决前后端分离项目遇到的问题

目录 一、Access to XMLHttpRequest at http://127.0.0.1:8088/api/hello from origin http://localhost:5173 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 二、报错[vue/compiler-sfc] 一、Access to …

人工智能革命:共同探索AIGC时代的未来

一、引言 随着大数据和强大的计算能力的兴起&#xff0c;人工智能技术&#xff08;AI&#xff09;正在快速发展&#xff0c;并为各个领域带来革命性的变化。人工智能与智能计算技术&#xff08;AIGC&#xff09;的融合不仅为企业、科研机构和普通用户提供了巨大的机遇&#xff…

LT8712EXI Type-C/DP1.2 to HDMI2.0/VGA Converter

Type-C/DP1.2 to HDMI2.0/VGA Converter Type-C/DP1.2 to HDMI2.0/VGA Converter  USB Type-C 接口  符合 USB TypeC 标准 V1.0 上的 VESA DisplayPort Alt 模式  符合 USB 供电规范 R2.0&#xff0c; V1.0版本  兼容USB Type-C电缆和连接器 规格 R1.2 内置双CC控制…

Web前端-HTML(表格与表单)

文章目录 1.表格与表单1.1 概述 2.表格 table2.1 表格概述2.2. 创建表格2.3 表格属性2.4. 表头单元格标签th2.5 表格标题caption&#xff08;了解&#xff09;2.6 合并单元格(难点)2.7 总结表格 3. 表单标签(重点)3.1 概述3.2 form表单3.3 input 控件(重点)type 属性value属性值…