实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR

这篇具有很好参考价值的文章主要介绍了实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验内容:
实现时间片轮转算法(模拟),要求如下:
1、用到的数据结构
/* PCB /
struct PCB
{
pid_t pid;//进程 PID
int state; //状态信息,1 表示正在运行,0 表示暂停,-1 表示结束
unsigned long runned_time;//已运行时间
unsigned long need_running_time;//剩余运行时间
};
/
PCB集合 */
struct PCB pcb[TOTAL]; //PCB 集合
2、算法思路
算法实现分主函数(main)和分派函数(Dispatch)。
(1)其中主函数(main)的核心功能为:
实现 6 个子进程的创建和子进程 PCB 的初始化。对子进程 PCB 初始化时,状态设为 0,运
行时间由随机数产生。子进程创建后,就通过信号 SIGSTOP 让它处于暂停状态,当被分派
函数(Dispatch)选中后,才能继续执行,输出子进程 x 正在执行的信息。
同时要在主程序里设置定时器,定时器的时间间隔为时间片长度,时间片到,就调用分派函
数(Dispatch)重新选派程序。
(2)分派函数的核心功能:
将正在执行的子进程暂停,状态变为 0,修改已运行时间和剩余运行时间。
如果该子进程剩余时间小于或等于 0,说明执行完毕,PCB 状态改为-1,结束该子进程。
重新选择下一个子进程,状态变为 1,输出该子进程的已运行时间和剩余运行时间,让该子
进程恢复运行。
当所有子进程都结束后,则父程序结束。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

//宏定义
#define TOTAL 6 //子进程总数
#define UNIT_TIME 200 //时间片长度(单位:毫秒)
#define UNIT_TICKS (UNIT_TIME * 1000) //计算时间片的ticks数

//进程状态
#define STATE_RUNNING 1
#define STATE_WAITING 0
#define STATE_FINISHED -1
void Dispatch(int signum);
/* PCB */
struct PCB          
{
        pid_t pid;//进程PID
        int state; //状态信息,1表示正在运行,0表示暂停,-1表示结束
        unsigned long runned_time;//已运行时间
        unsigned long need_running_time;//剩余运行时间
};

/* PCB集合 */
struct PCB pcb[TOTAL];  //PCB集合

//主函数
int main(int argc, char *argv[])
{
        //定义变量
        int i, j;

        //初始化随机数种子
        srand((unsigned int)time(NULL));

        //初始化PCB集合
        for (i = 0; i < TOTAL; i++)
        {
                pcb[i].state = STATE_WAITING;
                pcb[i].runned_time = 0;
                pcb[i].need_running_time = rand() % 1000; //随机产生运行时间
        }

        //创建子进程
        for (i = 0; i < TOTAL; i++)
        {
                if ((pcb[i].pid = fork()) == 0)
                {
                        //子进程执行代码
                        while (1)
                        {
                                //处于暂停状态,等待信号
                                kill(getpid(), SIGSTOP);

                                //子进程结束
                                if (pcb[i].need_running_time == 0)
                                {
                                        exit(0);
                                }
                                //打印子进程信息
                                printf("\n");
                                printf("子进程ID:%d\n", pcb[i].pid);
		printf("已运行时间:%ld\n", pcb[i].runned_time);
		printf("剩余运行时间:%ld\n", pcb[i].need_running_time);
		                            //模拟运行
                            usleep(UNIT_TICKS);
                            pcb[i].runned_time++;
                            pcb[i].need_running_time--;
                    }
            }
    }

    //设置定时器
    struct itimerval itv;
    itv.it_interval.tv_sec = 0;
    itv.it_interval.tv_usec = UNIT_TICKS;
    itv.it_value.tv_sec = 0;
    itv.it_value.tv_usec = UNIT_TICKS;
    setitimer(ITIMER_REAL, &itv, NULL);

    //捕捉SIGALRM信号
    signal(SIGALRM, Dispatch);

    //等待子进程结束
    for (i = 0; i < TOTAL; i++)
    {
            waitpid(pcb[i].pid, NULL, 0);
    }

    //程序结束
    printf("\n程序执行结束!\n");
    return 0;
}
//分派函数
void Dispatch(int signum)
{
//暂停正在执行的进程
int i;
for (i = 0; i < TOTAL; i++)
{
if (pcb[i].state == STATE_RUNNING)
{
kill(pcb[i].pid, SIGSTOP);
break;
}
}
    //检查所有进程是否结束
    int finished = 1;
    for (i = 0; i < TOTAL; i++)
    {
            //如果剩余运行时间小于零,则说明该进程结束
            if (pcb[i].need_running_time < 0)
            {
                    pcb[i].state = STATE_FINISHED;
            }
            else if (pcb[i].state != STATE_FINISHED)
            {
                    finished = 0;
            }
    }

    //如果所有进程都结束,则停止定时器,结束程序
    if (finished)
    {
            struct itimerval itv;
            itv.it_interval.tv_sec = 0;
            itv.it_interval.tv_usec = 0;
            itv.it_value.tv_sec = 0;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, NULL);
return;
}
    //选择下一个要执行的进程
    for (i = 0; i < TOTAL; i++)
    {
            //找到第一个状态为0的进程
            if (pcb[i].state == STATE_WAITING)
            {
                    pcb[i].state = STATE_RUNNING;
                    kill(pcb[i].pid, SIGCONT);
                    break;
            }
    }

}

上述代码的运行结果如下图:
实现6个子进程的创建和子进程 pcb 的初始化。对子进程 pcb 初始化时,状态设为,算法,linux,c语言
可见,子进程id一直为0(这里有问题,请各位读者加以改正,有改正的方法可以在评论区评论一下),并且只会创建6个子进程。
如果还有好的方法我也会再分享出来。文章来源地址https://www.toymoban.com/news/detail-762739.html

到了这里,关于实现时间片轮转算法(模拟)计算机操作系统实验5:进程调度算法模拟-RR的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统进程调度算法——先来先服务、时间片轮转、优先级调度算法

    (1)算法内容: 先来先服务调度算法是一种最简单的调度算法,可以应用于高级调度也可以运用于低级调度。高级调度时,FCFS调度算法按照作业进入后备作业队列的先后顺序选择作业进入内存,即先进入后备作业队列的作业被优先选择进入内存,然后为选中的作业创建进程

    2023年04月21日
    浏览(41)
  • 算法/后端计算机基础课程如何学?——八股文基础(数据结构、计算机网络、算法导论、操作系统)

    UCB CS61B 数据结构 Stanford CS144 计网 MIT 6.006 算法导论 6.S081 操作系统 配合国内外名校的开源课件和lab 浙大 数据结构 哈工大 计网/计组/操作系统/数据库 [b站/慕课] MIT 6.824分布式系统 6.830/6.814:数据库系统 fault tolerance/心跳/选举/日志复制都是如何实现的 ? 做完labs你就有答案啦

    2024年02月02日
    浏览(50)
  • 操作系统有关进程调度算法(含先来先服务,短作业优先,优先级调度算法和时间片轮转调度算法)

    本文采用的进程调度算法有:先来先服务,短作业优先,优先级调度算法和时间片轮转调度算法。 针对这四种算法,我采用的是建立数组结构体,如: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。采用FCFS算法,每次从

    2024年02月03日
    浏览(59)
  • 计算机操作系统-虚拟存储器的定义与实现

    目录 一、引言 二、什么是虚拟存储器 2.1 虚拟存储器的定义 2.2 虚拟存储器的作用 三、虚拟存储器的实现 3.1 虚拟地址和物理地址 3.2 页面置换算法 3.3 页面置换策略 四、虚拟存储器的优点 4.1 多道程序设计 4.2 内存利用率 4.3 程序的可移植性 五、虚拟存储器的缺点 5.1 页面置

    2024年02月04日
    浏览(47)
  • 操作系统:用C语言实现FCFS(先来先服务),SJF(短作业抢占)和RR(时间片轮转,时间片=1)

       加深对进程调度的理解,熟悉进程调度的不同算法,比较其优劣性。 假如一个系统中有5个进程,它们的到达时间内如表1所示,忽略I/O以及其他开销时间。若分别按先来先服务(FCFS)、抢占的短作业优先(SJF)、时间片轮转(RR,时间片=1)进行CPU调度,请按照上述三个

    2024年02月04日
    浏览(56)
  • 计算机基础——操作系统

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.操作系统 1.操作系统简介  2.操作系统的主要功能 (1)资源管理 (2)人机交互  (3)程序控制 (4)进程管理

    2024年01月23日
    浏览(55)
  • 计算机操作系统安全

    操作系统安全是计算机系统安全的重要组成部分,目的是保护操作系统的机密性、完整性和可用性。在当前的网络环境下,操作系统面临着许多威胁,如病毒、木马、蠕虫、黑客攻击等等。为了保护操作系统的安全,需要采取各种措施来防范这些威胁。本文将介绍一些常见的

    2024年02月02日
    浏览(46)
  • 计算机操作系统-笔记

    第一章 引论 1. 操作系统定义 操作系统是运行在内核态的软件,它执行两个基本上独立的任务。 隐藏计算机底层硬件的实现,为用户及应用程序提供一个资源集的清晰抽象。 管理计算机硬件资源。 任何操作系统的核心是它可处理的系统调用集。这些系统调用集真实地说明了

    2024年02月20日
    浏览(53)
  • 操作系统 --- 计算机系统引论

            操作系统 ( Operating System , OS )是指控制和 管理 整个计算机系统的 硬件和软件 资源,并合理地组织调度计算机的工作和资源的分配;以 提供给用户和其他软件方便的接口和环境 ;它是计算机系统中最基本的 系统软件。              ———— 王道       

    2024年02月09日
    浏览(53)
  • 《操作系统》——计算机系统概述

    前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这门课的基本知识!!! 目录 (一)

    2024年02月03日
    浏览(88)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包