(C++)一个按时间片轮转法实现进程调度的程序

本文介绍了大二操作系统实验中使用C++实现时间片轮转算法的过程。通过定义结构体链表存储进程控制块,模拟进程的运行、状态变化和时间片的消耗,展示了如何在代码中实现这一调度策略。程序包括创建进程链表、检查和执行进程、判断所有进程是否完成等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这是我大二时的操作系统实验代码,编程语言选择的是C++,编程环境是WIN10的vs2022


一、时间片轮转算法是什么?

时间片轮转算法是进程调度算法的一种,属于操作系统的知识内容,具体内容请移步其他大神的博客。

二、使用步骤

1.题目要求

设计一个按时间片轮转法实现进程调度的程序。

  1. 假设系统有3-5个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如图1所示。

在这里插入图片描述
图中的参数意义如下:
进程名:即进程标识。
链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达的进程控制块地址。

到达时间:进程创建时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。
估计运行时间:可由设计者任意指定一个时间值。

进程状态:为简单起见,这里假定进程有两种状态:就绪态和完成态。就绪状态用“R”表示,完成状态用“C”表示。假定进程一创建就处于就绪状态,运行结束时,就被置成完成状态。

  1. 按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再 设一个当前运行的进程指针,指向当前正运行的进程。
  2. 执行进程调度时,首先选择队首的第一个进程运行。
  3. 由于本实验是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行:估计运行时间减1,输出当前运行进程的名字。用这个操作来模拟进程的一次运行。
  4. 进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0。若不为0,则等待下一轮的运行;若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
  5. 若就绪队列不空,则重复上述步骤4和5直到所有进程都运行完为止。
  6. 在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

2.代码

用结构体链表存储每个进程

struct process
{
    int PS; //进程序号
    int RunTime; //估计运行时间
    char State='R'; //运行状态
    int ArrTime;//进程的到达时间
    process* next;//进程指向的下一个进程
    process(int PS, int RunTime, int ArrTime, process* next = NULL)
    {
        this->PS = PS;
        this->RunTime = RunTime;
        this->State = 'R';
        this->ArrTime = ArrTime;
        this->next = next;
    }
};
//打印出当前各个进程的运行情况,还没写完
void PrintProcess(process* p)
{
    for (int i = 0; i < 5; i++)
    {
        cout << "进程编号" << " " << "剩余运行时间" << " " << "目前状态" << endl;
        cout << "    " << i << "      " << p->RunTime << "                " << p->State << endl;
        p = p->next;
    }
}
//遍历一遍链表,到达就执行,不到达就跳过
void CheckOnce(process* p, int &Timer)
{
    for (int i = 0; i < 5; i++)
    {
        if (p->ArrTime > Timer)
        {
            //这个程序还没到达,先跳过,直接到下一个进程,假设这个判断不消耗时间片
            p = p->next;
            continue;
        }
        
        else
        {
            if (p->RunTime == 0)
            {
                p->State = 'C';
 
            }
            else if (p->RunTime != 0)
            {
                //运行一个时间片
                p->RunTime -= 1;
                if (p->RunTime == 0)
                {
                    p->State = 'C';

                }
                cout << "Process[" << p->PS << "] is Running now." << endl;
                Timer++;

            }
        }

        p = p->next;

    }
    cout << endl;
    PrintProcess(p);//打印目前各个进程的状态
    cout << endl << endl << endl;
}
//判断所有进程是不是都执行完毕了
bool IsFinished(process* p)
{
    int count = 0;
    for (int i = 0; i < 5; i++)
    {
        if (p->RunTime != 0)
        {
            count++;
        }
        p = p->next;
    }

    if (count == 0)
    {
        return true;
    }
    return false;
}
//进行时间片轮转的函数
void RoundTime(process* p)
{
    int Timer = 0;
    while (!IsFinished(p))
    {
        CheckOnce(p, Timer);
    }
    cout << "All processes have finished !" << endl;
}

//主函数
int main()
{
    process p4 = { 4,1,9,NULL };
    process p3 = { 3,2,3,NULL };
    process p2 = { 2,4,2,NULL };
    process p1 = { 1,3,1,NULL };
    process p0 = { 0,9,0,NULL };

    p0.next = &p1;
    p1.next = &p2;
    p2.next = &p3;
    p3.next = &p4;
    p4.next = &p0;

    
    //cout << "Enter the Process Running time in order of their arrive time" << endl;
    //cin >> p0.RunTime >> p1.RunTime >> p2.RunTime >> p3.RunTime >> p4.RunTime;
    //cout << p0.next->RunTime << endl;
   // cout << p0.RunTime << endl;
    RoundTime(&p0);
    return 0;
}

在这里插入图片描述

声明:本文为原创文章,任何未经允许的抄袭、转载等将视为侵权行为!!!!将依法追究!如需联系作者,请发邮件到邮箱2749605097@qq.com.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值