⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.c

📁 一些操作系统课程实验的程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 10    //最大进程控制块数
#define EMPTY -1
#define TIMEPATCH 3  //定义一个时间片为3秒
enum status {READY,RUNNING,FREE}; //表示状态

struct pcb {
	char * name;
	int status;
	int timeNeed;   //表示该进程运行完毕所需时间
	int timeUsed;   //表示该进程已用的时间
	int next;
};

struct readyPcb
{
	int head;
	int tail;
};

void intialize();
int get_location();
void create_process();
void run_process();


struct pcb pcbarea[MAX];
struct readyPcb ready;
int pfree;
int run;

main()
{
	int select;
	int quit = 0;

	intialize();
	while (!quit)
	{
		puts("选择1、2、3执行操作");
		puts("1、创建进程(最多10个)");
		puts("2、开始模拟进程调度");
		puts("3、退出程序");
		scanf("%d",&select);
		switch (select) {
		case 1: 
			create_process(); 
			break;
		case 2: 
			run_process();
			break;
		case 3: 
			quit = 1;
			break;
		default:
			scanf("%d",&select);
		}
	}
}

void intialize()
{
	int i;
	for (i=0; i<MAX; i++)
	{
		pcbarea[i].name = NULL;
		pcbarea[i].status = FREE;
		pcbarea[i].timeNeed = 0;
		pcbarea[i].timeUsed = 0;
		pcbarea[i].next = (i+1) % MAX;
	}
	pfree = 0;
	run = EMPTY;
	ready.head = EMPTY;
	ready.tail = EMPTY;
}

void create_process()
{
	int i;
	if (pfree < MAX)
	{
		i = pfree;
		pfree++;
		pcbarea[i].name = (char *)malloc(10 * sizeof(char));
		puts("输入进程名:");
		scanf("%s",pcbarea[i].name);
		puts("输入进程运行所需时间:");
		scanf("%d",&pcbarea[i].timeNeed);
		//pcbarea[i].timeNeed *= 1000;
		pcbarea[i].status = READY;
		if (ready.head == EMPTY)
		{
			ready.head = i;
			ready.tail = i;
			pcbarea[ready.tail].next = ready.head;
		}
		else
		{
			pcbarea[ready.tail].next = i;
			ready.tail = i;
			pcbarea[i].next = ready.head;
		}
	}
	else
	{
		puts("无空闲控制块,创建失败");
	}
}
 
void run_process()
{
	int p,timep;
	time_t t1,t2;
	
	run = ready.head;
	if (run != EMPTY)
	{
		pcbarea[ready.head].status = RUNNING;
		time(&t1);
		ready.head = pcbarea[ready.head].next;
		if (ready.head == run)  //若ready.head == run则说明原来ready对列中就一个进程
		{
			ready.head = EMPTY;
			ready.tail = EMPTY;
		}
		else 
		{
			pcbarea[ready.tail].next = ready.head;
		}
		printf("the process on running is %s\n",pcbarea[run].name);
		if (ready.head == EMPTY)
		{
			puts("the ready process is empty");
			puts("\n-------------------------------------------------------------------------------\n");
		}
		else
		{
			p = ready.head;
			printf("the ready process :");
			do   //打印ready队列中的进程名
			{
				printf("%s-->",pcbarea[p].name);
				p = pcbarea[p].next;
			} while (p != ready.head);
			puts("\n-------------------------------------------------------------------------------\n");
		}
		while (run != EMPTY)
		{
			time(&t2);
			timep = (int)difftime(t2,t1);
			if ((pcbarea[run].timeUsed + timep) >= pcbarea[run].timeNeed)
			{
				pcbarea[run].status = FREE;
				timep = 0;
				printf("process %s completed\n",pcbarea[run].name);
				if (ready.head != EMPTY)
				{
					run = ready.head;
					pcbarea[run].status = RUNNING;
					t1 = t2;
					printf("the process on running is %s\n",pcbarea[run].name);
					ready.head = pcbarea[ready.head].next;
					if (ready.head == run) //若ready.head == run则说明原来ready对列中就一个进程
					{
						ready.head = EMPTY;
						ready.tail = EMPTY;
						puts("the ready process is empty");
						puts("\n-------------------------------------------------------------------------------\n");
						continue;
					}
					pcbarea[ready.tail].next = ready.head;
					printf("the ready process : ");
					p = ready.head;
					do   //打印ready队列中的进程名
					{
						printf("%s-->",pcbarea[p].name);
						p = pcbarea[p].next;
					} while (p != ready.head);
					puts("\n-------------------------------------------------------------------------------\n");
				}
				else {
						puts("all process comleted!");
						break;
				}
			}
			else if (timep >= TIMEPATCH)
			{
				if (ready.head == EMPTY)
				{
					t1 = t2;
					pcbarea[run].timeUsed += timep;
					timep = 0;
					continue;
				}
				pcbarea[run].status = READY;
				pcbarea[run].timeUsed += timep;
				timep = 0;
				pcbarea[ready.tail].next = run;
				ready.tail = run;
				run = ready.head;
				printf("the process on running is %s\n",pcbarea[run].name);
				ready.head = pcbarea[ready.head].next;
				pcbarea[ready.tail].next = ready.head;
				if (ready.head == run) //若ready.head == run则说明原来ready对列中就一个进程
				{
					ready.head = EMPTY;
					ready.tail = EMPTY;
					puts("the ready process is empty");
					puts("\n-------------------------------------------------------------------------------\n");
					t1 = t2;
					pcbarea[run].timeUsed += timep;
					timep = 0;
					continue;
				}
				printf("the ready process : ");
				p = ready.head;
				do   //打印ready队列中的进程名
				{
					printf("%s-->",pcbarea[p].name);
					p = pcbarea[p].next;
				} while (p != ready.head);
				puts("\n-------------------------------------------------------------------------------\n");
				t1 = t2;
			}
		}
	}
	else
	{
		puts("there is no process in ready");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -