进程状态变换模拟

该程序使用链表实现模拟多个进程的调度执行,包括执行和就绪两种状态。用户输入进程数量和执行时间,进程在freeQueue、readyQueue、runningQueue之间转换。调度采用随机方式,每次调度时间片减2,执行完的进程PCB返回freeQueue。程序运行过程中输出调度信息,展示了对C指针和链表操作的理解,强调了处理边界条件的重要性。
摘要由CSDN通过智能技术生成

问题:

编写一个程序,模拟若干进程调度执行的情况。假设进程的状态分为执行和就绪两种。每个进程以其PCB为代表即可,无需创建真正的进程。以链表的方式组织PCB,分为三个队列:
freeQueue:一个空白PCB队列
readyQueue:一个就绪队列
runningQueue:一个执行队列


程序开始运行时,用户输入进程数量n,以及每个进程需要运行的时间t0/t1/…/tn。程序从空白PCB队列中取出PCB创建进程,插入readyQueue。


进程的调度采用随机的方式,即从就绪队列中随机选择一个进程投入运行(就是将该PCB中的状态变量赋值为“运行”)。相应的修改其所在队列,并且原来处于运行态的进程需要转变为“就绪”态,插入readyQueue。


假设时间片是1,进程每次调度运行后,其还需运行的时间应该减少2,直至为0,即表示该进程执行完毕。需要回收PCB到freeQueue。


每次发生调度的时候,需要打印信息示例:
Sched: P0(Running -> Ready), P3(Ready -> Running)
Running: P3
Ready: P1->P2->P0
上述信息表示调度时P0处于运行态,选择P3运行,P0进程的PCB进入就绪队列,并且在队尾。就绪队列是按照队列节点次序输出进程名称。


思路描述:

用链表维护题目中的三个队列,按题目要求进行操作即可。

为了不在输出格式上花太多时间,我假设只输入个位数个进程。

为了加快产生随机数的速度,我用了一个数组存储了下ReadyQueue中的进程Pid,具体见代码。


关键代码解释:

见源代码吧,源代码有非常详细的注释。


程序源代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define ready 1
#define running 2
#define ts 1 /* time slice */

struct PCB {
    int pid;    /* 进程ID  */
    int pstate;  /* 进程状态 */
    char *pname; /* 映象名称 */
    int ptime;   /* 剩余运行时间 */
    struct PCB *pnext;  /* 下一个PCB */
};

int allTime = 0;//记录总共要运行的时间
int n;//进程数 
int readyQueuePid[10];//用来存ReadyQueue中Pid,加快产生随机数的速度 

struct PCB *initReadyQueue() {
	int i;
	printf("请输入进程数量:\n");
	s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值