进程调度过程的模拟——时间轮转法 c++实现

模拟若干个进程的运行过程,将其存入进程文件中。如:进程1:运行5秒后有3秒的I/O操作,之后有10秒的运行,结束。可以写成:”p1:r5,io3,r3 e;” 

编程实现调度算法函数,定义时间片大小和并发进程个数,不断从进程文件中读出进程信息,模拟进程的运行及调度过程;

#include <stdio.h>
#include <cstring>
#include<iostream>
#include<queue>
#include<iterator>
#include<vector>
using namespace std;
struct process{
    char state;  // 状态:w(就绪),r(运行),f(完成),b(阻塞)
    int name;
    int runone,runio,runtow; //
    int needTime;  // 还需运行时间
    int runTime;   // 服务时间
    int endTime;   // 结束时间
}pro[1000];
char s[1000][18];
queue <int > wait,finish;
vector <int > block;
int sum=0,silce; //时间片的长度
void prin(){
        printf("******************************************************\n");
        printf("进程相关信息如下:\n");
        printf("进程名(ID) ");
        printf("到达时间  ");
        printf("还需时间  ");
        printf("运行时间  ");
        printf("运行状态  \n");
        for(int i=0;i<sum;i++){
           printf("%3d            %3d       %3d       %3d       %c\n",pro[i].name,i,pro[i].needTime,pro[i].runTime,pro[i].state);
        }
        printf("\n");

}

void putin(){ //输入进程
    printf("请输入时间片:\n");
    scanf("%d",&silce);
    freopen("C:\\Users\\HP\\Desktop\\in.txt","r",stdin);
    char st[100];
    printf("从文件读入的信息如下:\n");
    while(scanf("%s",&st)!=EOF){
        sscanf(st,"p%d:r%d,io%d,r%de;",&pro[sum].name,&pro[sum].runone,&pro[sum].runio,&pro[sum].runtow);
        pro[sum].needTime=pro[sum].runone+pro[sum].runio+pro[sum].runtow;
        pro[sum].runTime=0;
        pro[sum].endTime=0;
        printf("%d %d %d %d\n",pro[sum].name,pro[sum].runone,pro[sum].runio,pro[sum].runtow);
        sum++;
    }
}

void rr(){
    int ostime=0,run=-1,log;
    bool ok;
    wait.push(0);
    while(!(wait.empty()&&block.empty())){
        run=wait.front();
        wait.pop();
        pro[run].state='r';
        ok=true;
        for(int i=1;i<=silce;i++){ //运行一个时间片
            ostime++;
            if(pro[run].runone>0){
                pro[run].runone--;
                pro[run].needTime--;
                pro[run].runTime++;
            }
            for(vector<int>::iterator iter=block.begin();iter!=block.end();++iter)
            {
                log=*iter;
                pro[log].runio--;
                pro[log].needTime--;
                if(pro[log].runio==0){ //io阻塞完成
                    pro[log].state='w';
                    wait.push(log);
                    block.erase(iter);
                    iter--;
                }
            }
            if(pro[run].runone==0&&pro[run].runio>0){ //进入io阻塞
                block.push_back(run);
                pro[run].state='b';
                ok=false;
                prin();
                break;
            }
            if(pro[run].runone==0&&pro[run].runio==0&&pro[run].runtow>0){
                pro[run].runtow--;
                pro[run].needTime--;
                pro[run].runTime++;
            }
            if(pro[run].runone==0&&pro[run].runio==0&&pro[run].runtow==0){ //完成
                finish.push(run);
                pro[run].state='f';
                pro[run].endTime=ostime;
                ok=false;
                prin();
                break;
            }

            prin();
            if(ostime<sum){ wait.push(ostime); pro[ostime].state='w'; }
        }
        if(ok){ wait.push(run); pro[run].state='w'; }
    }
}
int main(){

    putin();
    rr();
    //for(int i=0;i<sum;i++) cout<<s[i]<<endl;
    return 0;
}

实验一 进程调度 编写并调试一个模拟进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。以加深对进程的概念及进程调度的理解. 下面是采用动态优先数的调度程序,可作参考。  例题: 设计一个有 N个进程共行的进程调度程序。   进程调度:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算。   每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下息:进程名、优先数、到达时间、需要运行时间、已用CPU时间进程状态等等。   进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间进程输入的时间。   进程的运行时间时间片为单位进行计算。   每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。   就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。   如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。   每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。实验二 作业调度 一、实验目的:用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二、实验内容: 1.写并调试一个单道处理系统的作业等待模拟程序。 2.作业等待算:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。 3.由于在单道批处理系统,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 4.每个作业由一个作业控制块JCB表示,JCB可以包含如下息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 5.对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 三、思考:比较各种算的优缺点。 实验三 动态分区分配方式的模拟 1、实验目的:了解动态分区分配方式的数据结构和分配算,并进一步加深对动态分区存储管理方式及其实现过程的理解 2、实验内容: (1)用C语言分别实现采用首次适应算和最佳适应算的动态分区分配过程和回收过程。其,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB •作业2申请60KB •作业3申请100KB •作业2释放60KB •作业4申请200KB •作业3释放100KB •作业1释放130KB •作业5申请140KB •作业6申请60KB •作业7申请50KB •作业8申请60KB 请分别采用首次适应算和最佳适应算进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 3、思考:讨论各种分配算的特点。
好的,我可以为您提供一个简单的调度算法函数的 Python 实现,其时间片大小并发进程个数可以作为参数传入,以模拟调度过程。具体流程如下: 1. 定义进程类,包含进程 ID、需要执行的总时间、已经执行的时间和状态等属性。 ```python class Process: def __init__(self, pid, total_time): self.pid = pid self.total_time = total_time self.executed_time = 0 self.state = 'ready' ``` 2. 定义调度函数,根据时间片大小并发进程个数进行调度。首先从进程文件读取所有进程息,创建一个进程列表。然后不断循环,直到所有进程都执行完毕。在每一轮循环,先将所有状态为“running”的进程的已执行时间加上时间片大小,并检查是否已经执行完毕。如果已经执行完毕,则将其状态设置为“finished”;否则将其状态设置为“ready”。然后从所有状态为“ready”的进程选择前 N 个进程(N 为并发进程个数),将它们的状态设置为“running”。 ```python def schedule(time_slice, num_processes): # 从文件读取进程息,创建进程列表 processes = [] with open('processes.txt', 'r') as f: for line in f: pid, total_time = line.strip().split(',') processes.append(Process(pid, int(total_time))) # 循环调度进程,直到所有进程都执行完毕 while any(p.state != 'finished' for p in processes): # 执行状态为“running”的进程,并检查是否已经执行完毕 for p in processes: if p.state == 'running': p.executed_time += time_slice if p.executed_time >= p.total_time: p.state = 'finished' else: p.state = 'ready' # 从所有状态为“ready”的进程选择前 N 个进程,将它们的状态设置为“running” ready_processes = [p for p in processes if p.state == 'ready'] for p in ready_processes[:num_processes]: p.state = 'running' ``` 3. 在主程序调用调度函数,并输出每个进程的执行结果。 ```python if __name__ == '__main__': schedule(10, 2) # 时间片大小为 10,并发进程个数为 2 # 输出每个进程的执行结果 for p in processes: print(f'Process {p.pid}: executed time = {p.executed_time}, state = {p.state}') ``` 注意:以上代码仅为示例,仅考虑了最简单的情况,实际情况可能需要考虑更复杂的情况,比如进程的优先级、阻塞等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值