【计算机操作系统】程序并发执行模拟

一、实验目的
1.通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.通过实验来了解进程的三种状态以及状态间的转换。

二、实验内容及要求
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程换出某个进程;杀死运行进程以及进程之间通信等功能。

三、实验条件(可含设备、材料、工具、软件等)
一台装有C语言环境的电脑

四、实验原理(可含实验思想、原理图、程序框图、代码等)
实验思想:(并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。)
1.编写程序
2.调试代码
3.键盘一共输入多少进程,以及可共享的资源时间
4.每个进程的运行时间和优先级
5.运行代码,查看结果

//主要代码:
#include <stdio.h>
#pragma hdrstop
#include <tchar.h>
#include<stdlib.h>
#include<string.h>
#define Max 100
#pragma argsused
typedef struct pcb
{
    char name[Max];  //进程名
    int priority;    //优先级
    int arrtime;     //到达时间
    int needtime;    //需要运行时间
    int usedtime;    //已用时间
    char state;      //进程状态
}PCB;
PCB pcb[Max];

int n=1;
int m=0;
int pTime;
char SelectMenu();
void Input();
void Sort();
void Print();
void Attemper();

char SelectMenu()
{
    char select;
    printf("功能菜单:");
    printf("\n    1.增加并调度进程");
    printf("\n    2.打印进程");
    printf("\n    3.退出");
    printf("\n请输入你的选择(1--3):");
	do{
        select=getchar();
    }while(select!='1'&&select!='2'&&select!='3');
    return select;
}

void main()
{
    int choice;
    n=1;
    printf("                       \n");
    printf("\t\t欢迎使用进程调度模拟\n\n");
    choice=SelectMenu();
    do{
        if(choice=='1')
        {
            printf("\n");
            printf("请设置时间片的大小:");
            scanf("%d",&pTime);
            Input();
            Print();
            Attemper();
        }
        if(choice=='2')
        {
            Print();
        }
        if(choice=='3')
        {
            return;
        }
		choice=SelectMenu();
	}while(1);
}

void Input()
{
	printf("输入要创建进程的数目:\n");
	scanf("%d",&m);
    do{
		printf("\n---请输入第%d个进程进程---\n",n);
        printf("\n进程名:");
		scanf("%s",&pcb[n].name);
        printf("进程优先级:");
        scanf("%d",&pcb[n].priority);
        printf("进程需要的时间:");
        scanf("%d",&pcb[n].needtime);
        pcb[n].arrtime=n;
        pcb[n].usedtime=0;
		pcb[n].state='W';
		n++;
    }while(n<=m);
}

void Sort()
{
    int i,j;
    PCB temp;
    for(i=0;i<n-1;i++)         //按照到达时间排序
    {
        for(j=n-2;j>=i;j--)
        {
            if(pcb[j+1].arrtime<pcb[j].arrtime)
            {
                temp=pcb[j];
                pcb[j]=pcb[j+1];
                pcb[j+1]=temp;
            }
        }
    }

    for(i=0;i<n-1;i++)      //按照优先级排序
    {
        for(j=n-2;j>=i;j--)
        {
            if(pcb[j+1].priority>pcb[j].priority)
            {
                temp=pcb[j];
                pcb[j]=pcb[j+1];
				pcb[j+1]=temp;
            }
        }
    }
    if(pcb[0].state!='F')
    {
        pcb[0].state='R';
    }
}

void Print()
{
    int i;
	Sort();
    printf("\n   进程名    优先级  到达时间  需要时间    已用时间   进程状态 \n");
    for(i=0;i<n;i++)
    {
        printf("%8s%8d %8d %10d %10d %10c\n",pcb[i].name,pcb[i].priority,pcb[i].arrtime,pcb[i].needtime,pcb[i].usedtime,pcb[i].state);
    }
}

void Attemper()
{
    do{
        if((pcb[0].needtime-pcb[0].usedtime)>pTime)   //判断进程剩余的运行时间是否大于时间片
        {
            pcb[0].usedtime+=pTime;
            pcb[0].priority--;
            pcb[0].state='W';
        }
        else                       //已完成的进程
        {
            pcb[0].usedtime=pcb[0].needtime;
            pcb[0].priority=-1;
            pcb[0].state='F';
        }
        Print();
    }while(pcb[0].state!='F');
}

运行结果:

在这里插入图片描述

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值