一个简单的模拟进程调度的C++程序

这是我们操作系统实验课的一个实验程序,模拟简单的若干个进程在执行态和就绪态之间的变动。

我根据实验指导书上给出的程序进行了一点修改。

#include<cstdio>
#include<cstdlib>

struct PCB
{
    char name[10];
    char state; //状态
    int super; //优先级
    int ntime; //预计运行时间
    int rtime; //实际运行时间
    PCB *link;
}*ready=NULL, *p;

void disp(PCB *pr) /*建立进程显示函数,用于显示当前进程 */
{
    printf("\n qname \t state \t super \t ntime \t rtime \n");
    printf("|%s \t ",pr->name);
    printf("|%c \t ",pr->state);
    printf("|%d \t ",pr->super);
    printf("|%d \t ",pr->ntime);
    printf("|%d \t ",pr->rtime);
    printf("\n");
}

void check() /* 建立进程查看函数 */
{
    printf("\n ******** 当前正在运行的进程是:%s",p->name); /* 显示当前运行进程 */
    disp(p);

    printf("\n ******** 当前就绪队列状态为:\n"); /* 显示就绪队列状态 */
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

void sort() /* 建立对进程进行优先级排列函数 */
{
    if(ready==NULL || (p->super)>(ready->super)) /* 优先级最大者,插入队首 */
    {
        p->link=ready;
        ready=p;
    }
    else /* 进程比较优先级,插入适当的位置中 */
    {
        PCB *first=ready, *second=first->link;
        while(second!=NULL)
        {
            if((p->super)>(second->super)) /* 若插入进程比当前进程优先数大,插入到当前进程前面 */
            {
                first->link=p;
                p->link=second;
                return;
            }

            first=first->link;
            second=second->link;
        }
        first->link=p;
    }
}

void input() /* 建立进程控制块函数 */
{
    system("cls");

    printf("\n 请输入进程数目?");
    int num; scanf("%d",&num);

    for(int i=0;i<num;i++)
    {
        printf("\n 进程号 No.%d:\n",i);
        p=(PCB *)malloc(sizeof(PCB));

        printf("\n 输入进程名:");
        scanf("%s",p->name);

        printf("\n 输入进程优先数:");
        scanf("%d",&(p->super));

        printf("\n 输入进程运行时间:");
        scanf("%d",&(p->ntime));

        printf("\n");

        p->rtime=0;
        p->state=‘w‘;
        p->link=NULL;

        sort(); /* 调用 sort 函数 */
    }

    system("cls");
    printf("\n ******** 进程创建如下:\n");
    PCB *pr=ready;
    while(pr!=NULL) disp(pr), pr=pr->link;
}

inline void destroy() /*建立进程撤消函数(进程运行结束,撤消进程) */
{
    printf("\n 进程 [%s] 已完成.\n",p->name), free(p);
}

inline void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态) */
{
    (p->rtime)++;
    if(p->rtime==p->ntime)
        destroy(); /* 调用 destroy 函数 */
    else
        --(p->super), p->state=‘w‘, sort();
}

int main() /*主函数*/
{
    input();

    int h=0;
    while(ready!=NULL)
    {
        getchar();
        printf("\n The execute number:%d \n",++h);

        p=ready;
        ready=p->link;
        p->link=NULL;
        p->state=‘r‘;

        check();
        running();

        printf("\n 按任意键继续......"), getchar();
    }

    printf("\n\n 进程已经全部完成.\n");
    getchar();

    return 0;
}

/*
3
A
3
5
B
2
3
C
1
4
*/

原文地址:https://www.cnblogs.com/dilthey/p/10804896.html

时间: 2024-07-30 13:01:34

一个简单的模拟进程调度的C++程序的相关文章

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

Spring学习(二)——使用用Gradle构建一个简单的Spring MVC Web应用程序

1.新建一个Gradle工程(Project) 在新建工程窗口的左侧中选择 [Gradle],右侧保持默认选择,点击next,模块命名为VelocityDemo. 2.在该工程下新建一个 module,在弹出的窗口的左侧中选择 [Gradle],右侧勾选[Spring MVC],如下图所示: 并勾选[Application server],下方选择框中选择Tomcat7.0,如无该选项,则选中右边的 [ New... ] -- [ Tomcat Server ], 配置 Tomcat .配置好后

一个简单的计算分数的小程序

一个简单的计算分数的小程序 代码如下: package Day05; public class ExamGradeDemo { public static void main(String[] args) { char[][] answers = { {'C','B','D','C','A','A','D','C','D','C'}, {'A','C','B','D','C','A','D','C','B','D'}, {'A','C','B','D','B','D','C','A','A','

go语言实现一个简单的登录注册web小程序

最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜: 这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装. 目录结构: index.go package controllers import ( "fmt" "github.com/astaxie/beego"

Socket 通讯,一个简单的 C/S 聊天小程序

Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单通讯,就简单的做了些测试用例,比较简单,觉得新手也可以接受. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.

ffmpeg+sdl教程----编写一个简单的播放器4(让程序更模块化)

来源:http://blog.csdn.net/mu399/article/details/5815444 音频和视频之间的同步,再那之前需要先做一些准备工作. 为了让程序更模块化,便于扩展,需要把原来main函数中的各个功能模块代码分离出来放在相应的函数中.该教程和上个教程相比代码量和难度都增加很多,比上个教程使用了更多的线程,一定要理解清楚各个函数和数据结构之间的关联以及线程之间如何协同工作. [c-sharp] view plaincopy // ffmpegExe.cpp: 主项目文件.

一个简单的人物图片相似对比程序

程序是参考了两部分的别人的代码,一个是找出照片中的人头,另一个是对两个人头照片做对比. # -*- coding: utf-8 -*- # feimengjuan # 利用python实现多种方法来实现图像识别 import cv2 import numpy as np from matplotlib import pyplot as plt, image # 最简单的以灰度直方图作为相似比较的实现 def classify_gray_hist(image1, image2, size=(256

一个简单的Windows下的socket程序

服务器端代码server.cpp: 1 #include <stdio.h> 2 #include <WinSock2.h> 3 #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll 4 5 int main() 6 { 7 //初始化DLL 8 /************************************************************************/ 9 /*调用WSASta

用Objective-C写了一个简单的批量更改文件名的程序

前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的程序. 程序员就是应该会利用程序来帮自己偷懒,因为用到的很多方法不是很熟悉,也是花了点时间去熟悉NSFileManager的一些方法,所以写下这个笔记做个笔记,省的下次又需要就忘记了方法. 我的基本需求,在啰嗦一下下哈: 一个文件目录下有上百个图片文件,文件名都带有~iPhone.写一个程序,删除所