`
yunchow
  • 浏览: 328016 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

用C模拟进程调度

阅读更多
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define randomize() srand((unsigned)time(NULL)) //定义一个宏


//PCB结构体定义部分
typedef struct PCB
{
	/** 进程标识符,取值1-5 **/
	unsigned int id;
	/** 进程优先级,随机产生,值1-5 **/
	signed int priority;
	/** 
		目前已占用的CPU时间数,
		初值为0;当该进程被调
		用执行时,每执行一个时
		间片,Used加1 
	**/
	unsigned int used;
	/** 
		进程尚需的CPU时间数,初值表示
		该进程需要运行的总时间,取值
		范围为5—10。并随机产生,每运
		行一个时间片need减1;need为0则
		进程结束。 
	**/
	unsigned int need;
	/**
		进程状态R(运行),W(就绪),F(完成);
		初始时都处于就绪状态
	**/
	unsigned char status;
	/**
		指向就绪队列中下一个进程的PCB的指针
	**/
	struct PCB *next;
};

//程序入口主函数
int main(void)
{
	struct PCB process[5];
	int i=0;
	for(i;i<5;i++)
	{
		//初始化进程ID
		process[i].id = i+1;
		//初始化进程优先级
		process[i].priority = rand()%5+1;
		//初绐化已占用时间数
		process[i].used = 0;
		//初始化还要时间数(5-10)
		process[i].need = rand()%5+6;
		//初始化进程状态(就绪)
		process[i].status = 'W';
		//初始化指向下一个PCB的指针
		process[i].next = NULL;
		printf("process[%d]: id = %d",i+1,process[i].id);
		printf("  priority = %d",process[i].priority);
		printf("  used = %d",process[i].used);
		printf("  need = %d",process[i].need);
		printf("  status = %c",process[i].status);
		printf("  next = %s",process[i].next);
		printf("\n");
	}
	randomize();
	//形成一个按进程优先级从大到小排列的队列
	int j = 0;
	int k = 1;
	for(j;j<5;j++)
	{
		struct PCB temp;
		for(k=j+1;k<5;k++)
		{
			if(process[j].priority<process[k].priority)
			{
				temp = process[j];
				process[j] = process[k];
				process[k] = temp;
			}	
		}
		
	}
	printf("排序结果为:");
	for(i=0;i<4;i++)
	{
		printf(" %d ",process[i].priority);
		process[i].next = &process[i+1];
	}
	//初始化head,tail指针
	struct PCB *head = &process[0];
	struct PCB *tail = &process[4];
	struct PCB *run = head;
	tail->next = NULL;
	printf("\n初始化head,tail指针:");
	printf("head: %d ",head->priority);
	printf("tail: %d \n",(*tail).priority);
	printf("\n--------准备完成,开始调度---------\n");
	while(head!=NULL)
	{
		if(head == NULL)
			break;
		else
			run = head;
		run->priority--;
		run->status='R';
		run->used ++ ;
		if(run->need>0)
			run ->need -- ;
		head = head->next;
		printf("当前正在执行的进程ID:%d,status:%c,priority:%d,used:%d,need:%d\n"
			,run->id,run->status,run->priority,run->used,run->need);
		printf("时间片:");
		for(i=0;i<15000;i++)
		{
			int a=50000;
			while(a--);
			
			if(i%500==0)
				printf("#");
		}
		if(run->need > 0)
		{
			printf("   进入就绪队列\n");
			if(head->next == NULL)
				head = run;
			else
			{
				run->status='W';
				struct PCB *temp = head;
				struct PCB *pre = head;
				int flag = 1;
				while(flag)
				{
					if(temp!=tail && temp->priority < run->priority)
					{
						run->next = temp;
						pre->next = run;
						flag = 0;
					}
					if(temp==tail)
					{
						run->next = NULL;
						tail->next = run;
						tail = tail->next;
						flag = 0;
					}
					else
					{
						pre = temp;
						temp = temp->next;
					}	
				}
			}						
		}
		else
			printf("   完成\n");
		printf("\n");
	}
	return 0;
}

分享到:
评论

相关推荐

    用c语言实现模拟进程调度

    用c语言实现的模拟进程调度算法,包括进程调度函数,进程阻塞函数,进程实时运行函数

    进程调度模拟(C语言实现)

    这篇博客"进程调度模拟(C语言实现)"显然提供了一个用C语言编写的模拟进程调度算法的示例。在这个项目中,我们可以期待学习到如何在程序中实现基本的进程调度策略,如先来先服务(FCFS)、短作业优先(SJF)和时间片...

    进程调度程序模拟 进程调度程序模拟 进程调度程序模拟

    实验的结果分析和源代码部分展示了如何用C语言实现这些调度算法,并通过随机数生成器模拟进程的到达时间和执行时间,这有助于理解进程调度的动态过程。 通过这样的模拟实验,学生不仅能够理解进程调度的概念,还能...

    操作系统c语言模拟进程调度实验

    C语言,运行成功,比较基础,c语言模拟设计一个有N个进程运行的进程调度程序,用最高优先数优先法:在创建进程时,给定一个进程优先数,并按一定规则减少优先数,直至所有进程运行完成(例如进程每获得一次cpu进程数...

    linux下 多线程模拟进程调度多线程模拟进程调度

    在Linux操作系统中,多线程模拟进程调度是一个深入理解操作系统内核和并发编程的重要主题。进程调度是操作系统核心的关键组成部分,负责决定哪个进程应该获得CPU的执行权,以及何时进行切换。而通过多线程模拟进程...

    模拟进程调度的c语言程序

    模拟进程调度的c语言程序 在linux下的模拟linux系统进程调度的程序。可以调试通过,以通过测试

    c#编写的操作系统作业--模拟进程调度 时间片算法

    在这个项目中,我们探讨的是如何使用C#编程语言来模拟操作系统中的进程调度,特别是时间片轮转算法。时间片轮转法是一种用于多任务环境的调度策略,旨在公平地分配CPU资源,确保每个进程都能得到一定的执行机会。 ...

    模拟进程调度程序

    为了让学生能够更深入地理解进程调度的算法、数据结构及其程序实现,本实验特别设计了模拟进程调度程序的编写任务,要求学生使用C语言完成对三种不同调度算法的模拟实现。 时间片轮转调度算法(Round Robin, RR)是...

    操作系统课程设计 用C语言实现进程调度

    在main函数中,我们首先输入进程数目,然后创建相应的进程控制块,最后使用while循环来模拟进程调度的过程。在每次循环中,我们首先检查当前进程的状态,如果是就绪状态,就将其加入就绪队列中,然后选择最高优先数...

    实验一进程及其管理进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度.pdf

    * C语言编程:使用C语言来模拟进程管理和进程调度算法。 结论 本实验通过模拟进程管理和进程调度算法,展示了操作系统中进程管理和进程调度的基本概念和技术。通过动态优先数和时间片轮转法,我们可以实现一个基本...

    基于visual C++的进程调度算法模拟(C语言)

    本项目“基于Visual C++的进程调度算法模拟”是用C语言实现的一个实践工具,它允许用户模拟不同的进程调度算法,以便理解和分析这些算法在实际操作系统中的行为。 首先,我们要理解什么是进程调度。进程是操作系统...

    使用动态优先权的进程调度算法的模拟

    在这个实验中,我们关注的是如何使用C语言模拟这个算法的过程,以及它如何影响进程的调度。 首先,我们要理解【进程控制块PCB(Process Control Block)】。PCB是操作系统内核用于存储进程状态和控制信息的数据结构...

    模拟进程优先级调度算法

    模拟进程优先级调度算法可以帮助我们更好地理解进程调度的工作原理及其对系统性能的影响。通过实际的编程模拟,我们可以观察到不同参数设置下系统的行为变化,从而优化调度策略,提高系统的整体效率。

    《操作系统》进程调度算法模拟

    实验的目的是通过模拟进程调度算法来理解进程的基本概念和进程调度过程。实验中,我们使用 C、C++、Java 语言编程实现对 5 个进程采用动态优先权调度算法进行调度的过程。 五、实验步骤 实验步骤包括: 1. 使用 C...

    进程调度和作业调度算法C语言实现

    在操作系统设计中,进程调度和作业调度是两个关键的组件,它们决定了系统资源如何被有效且公平地分配给各个程序。本项目通过C语言实现了这些调度算法,旨在帮助理解其工作原理并提供实践操作的机会。 首先,我们...

    进程调度模拟程序,C语言版

    在这个“进程调度模拟程序,C语言版”中,我们将会探讨关于进程控制块(PCB)以及进程调度的一些基本概念和实现。 **进程控制块(PCB)** PCB,全称为Process Control Block,是操作系统内核用于存储进程状态和...

    c语言模拟操作系统进程调度

    操作系统的进程调度模拟,是用c语言实现的。

    C语言编写的操作系统作业--模拟进程调度 优先级算法

    C语言编写的操作系统作业--模拟进程调度 优先级算法

    模拟的进程调度程序,采用“轮转法”调度算法

    编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。  轮转法是简单轮转法。 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU...

Global site tag (gtag.js) - Google Analytics