操作系统原理-模拟进程调度功能——沐雨先生

该博客围绕模拟进程调度功能实验展开,介绍实验目的是掌握进程调度功能与原理,实验环境包括PC机及Windows、MS - DOS等系统。实验内容涉及设计调度功能、模拟多种算法、实现调度函数等,还给出运行示例、算法流程图等,最后说明调试问题及解决方法。

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

一、实验题目: 模拟进程调度功能

二、实验目的: 通过本实验,进一步掌握进程调度的功能和实现原理。

三、实验环境:

1、硬件:PC机及其兼容机。

2、软件:Windows OS,MS—DOS OS,Turbo C 或 C++、VC++等。

四、实验内容:

1、 设计进程调度功能,至少模拟两种以上调度算法。如:优先级调度算法、时间片调度算法等。

2、 进程调度功能作为一个函数 scheduler,加入到实验题目一中。

3、 进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度”的提示信息。

4、 若选上一个进程,以显示:进程名、状态、时间片、优先级等信息表示一个进程被执行。若运行完,应删除相应 PCB。

五、运行示例:

在这里插入图片描述

六、算法流程图:

在这里插入图片描述

七、程序清单:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<windows.h>
int count=0;//记录进程数目

typedef struct PCB{
   
	char pname[10];//进程名
	int ppri;//优先级,值越小优先级越高
	int pruntime;//运行时间
	int pstatus;//运行状态 1-就绪,2运行,3阻塞
	struct PCB *next;//指针,指向下一个PCB
}PCB;

void menu(){
   
	printf("---------OS实验一:模拟进程创建、阻塞、唤醒、终止原语---------\n");
	printf("----------------------------1.创建----------------------------\n");
	printf("----------------------------2.调度----------------------------\n");
	printf("----------------------------3.阻塞----------------------------\n");
	printf("----------------------------4.唤醒----------------------------\n");
	printf("----------------------------5.删除----------------------------\n");
	printf("----------------------------6.显示----------------------------\n");
	printf("----------------------------0.返回上一层----------------------\n");
	printf("---------------------请输入您需要的功能(0-6)------------------\n");
	printf("--------------------------------------------------------------\n");
	printf("各功能简要说明:\n");
	printf("创建:在本实验中,该功能仅实现建立 PCB,初始化 PCB,并将该 PCB放入就绪队列中。\n");
	printf("优先级调度:选择该功能选项时,系统将从就绪队列中选择优先级最高的进程,使该进程处于执行状态(将进程 PCB 的内容显示在屏幕上,显示完成后,该进程结束,即撤销该进程的 PCB)。\n");
	printf("时间片调度:每选择一次该功能,将就绪队列中所有进程的内容显示在屏幕上,并将每个执行进程的执行时间减去一个时间片,若某进程的剩余时间小于等于0,则表明该进程运行结束,撤销该进程的PCB。\n");
	printf("阻塞:在本实验中,实现的功能为,根据用户输入的进程名称查看该进程是否处在运行状态,若处在运行状态,修改该进程PCB的状态,并将该进程转入阻塞队列;若该进程处在其它状态,则给出相应的提示信息;若该进程不存在,也需要给出相应的提示信息。\n");
	printf("唤醒:功能类似阻塞功能,注意:若阻塞队列为空,则不能执行唤醒功能。\n");
	printf("终止:根据用户输入要结束的进程名称,从就绪队列、阻塞队列和正在运行的进程中找到相应的进程 PCB,并将该 PCB 从相应队列中删除。若该进程不存在,需要给出提示。\n");
	printf("显示:将就绪队列、阻塞队列中的进程列表和正在运行的进程显示出来。\n");
}


void fprior(PCB *ready,PCB *run){
       
	PCB *p,*q;
	int maxpri=INT_MAX;
	p=ready;
	while(p->next){
   //在将p置于就绪队列队尾的同时寻找优先级最高的节点,用q表示那个节点的前一个节点
		if(p->next->ppri<maxpri)
			q=p;
		p=p->next;
	}
	p->next=run->next;
	run->next=NULL;//删除run队列中的结点
    p=q->next;//p就是优先级最高节点
	q->next=p->next;//将p进程从就绪队列删除;
	run->next=p;//将p进程插入到run队列中。
}


void ftimeschedule(PCB *ready,PCB *run){
   
	PCB *p,*q;
	int time;
	int flag=1;
	p=ready;
	while(p->next)//将p置于就绪队列队尾
		p=p->next;
	p->next=run->next;
	run->next=NULL;//删除run队列中的结点
	printf("请输入时间片大小:");//输入系统设定的时间片;
    scanf("%d",&time);
	p=ready->next;
	while(p && flag){
   //就绪队列非空
		p->pstatus=1;//从就绪队列中拿下第一个结点p;将结点p的状态修改为1;
        ready->next=p->next;
		run->next=p;
		p->next=NULL;
		p->pruntime-=time;//将结点p的运行时间减去一个时间片;
        printf("进程名        剩余时间\n");
		printf("%s\t\t",p->pname);
		printf("%d\n",p->pruntime);//显示结点p的名称及剩余时间;
        if(p->pruntime>0){
   //若剩余时间>0,将结点p从run队列中拿下,修改状态后放入就绪队列的尾部
			q=ready;
			while(q->next)//将q置于就绪队列队尾
				q=q->next;
			q->next=run->next;
			run->next=NULL;
		}
		else{
   //否则 从run队列中删除该结点;
            free(p);
			run->next=NULL;
			printf("运行结束,%s进程退出内存!\n",p->pname);
		}
		printf("继续运行一个时间片?1-继续 0-退出\n");
		scanf("%d",&flag);
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨先生

如果真的帮助到你了再打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值