操作系统时间片轮转法进程CPU调度

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct{
	char name[10];
	int arrtime;
	int worktime;
}DataType;

typedef struct node{
	DataType data;
	struct node *next;
}ListNode;

typedef ListNode *LinkList;

LinkList head;
void create_insert_LinkList(int flag1)
{
	ListNode *p1, *p2, *p;
	p = (ListNode*)malloc(sizeof(ListNode));
	head = p;
	p->next = NULL;
	while (flag1 > 0)
	{
		p = (ListNode*)malloc(sizeof(ListNode));
		cout << "进程名:";
		cin >> p->data.arrtime;
		cout << "运行时间:";
		cin >> p->data.worktime;
		cout << "***********" << endl;
		p->next = NULL;
		p1 = head;
		p2 = p1->next;
		while (p2->next != NULL&&p2->data.arrtime < p1->data.arrtime)
		{
			p1 = p2;
			p2 = p2->next;
		}
		p1->next = p;
		p->next = p2;
		flag1 = flag1 - 1;
	}
}

void pcb_LinkList(int flag2)
{
	LinkList H;
	ListNode *rear, *q, *p;
	int RR, rr, time, m, n;
	p = (ListNode*)malloc(sizeof(ListNode));
	p = NULL;
	H = p;
	cout << "定义时间片大小:";
	cin >> RR;
	cout << "****************";
	rr = RR;
	H = head->next;
	head->next = head->next->next;
	rear = H;
	rear->next = NULL;
	time = H->data.arrtime;
	while (flag2 != 0)
	{
		n = 0;
		while (rr != 0)
		{
			rr = rr - 1;
			time = time + 1;
			if (head->next != NULL)
			{
				if (head->next->data.arrtime <= time)
				{
					if (H = NULL)
					{
						H = head->next;
						head->next = head->next->next;
						rear = H;
						rear->next = NULL;
					}
					else
					{
						rear->next = head->next;
						head->next = head->next->next;
						rear = rear->next;
						rear->next = NULL;
					}
				}
			}
			if (H != NULL)
			{
				H->data.worktime = H->data.worktime - 1;
				m = 1;
				n = n + 1;
				if (H->data.worktime == 0)
				{
					cout << "在第" << time - n << "s" << endl;
					cout << "进程" << H->data.name << "运行" << n << "s" << "状态:C" << "完成时间:" << time << endl;
					cout << endl;
					H = H->next;
					flag2 = flag2 - 1;
					m = 0;
					n = 0;
				}
			}
		}
		if (m == 1)
		{
			cout << "在第" << time - n << "s" << endl;
			cout << "进程" << H->data.name << "运行" << n << "s" << "状态:R" << endl;
			cout << endl;
		}
		if (H == NULL)
		{
			if (head->next != NULL)
			{
				time = head->next->data.arrtime;
			}
		}
		else
		{
			if (H->next != NULL&&m == 1 && n == RR)
			{
				q = H;
				H = H->next;
				rear->next = q;
				rear = rear->next;
				rear->next = NULL;
			}
		}
		rr = RR;
	}
}
int main()
{
	cout << "时间片轮转法模拟" << endl;
	cout << endl;
	int flag;
	cout << "输入进程数目:";
	cin >> flag;
	cout << "***************" << endl;
	create_insert_LinkList(flag);
	pcb_LinkList(flag);
	cout << "运行结束" << endl;
	return 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[提示] (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态 其中,进程名----作为进程的标识,假设五个进程进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程进程控制块首地址,最后一个进程中的指针指出第一个进程进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2)每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行,而是执行: 已运行时间-1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4)进程运行一次后,应把该进程进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块中的指针值送到前面一个进程的指针位置。 (5)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程进程名以及运行一次后进称对列的变化。 (7)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程进程名以及进程控制块的动态变化过程。
第二题[提示] (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态 其中,进程名----作为进程的标识,假设五个进程进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程进程控制块首地址,最后一个进程中的指针指出第一个进程进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2) 每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3) 处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行,而是执行: 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4) 进程运行一次后,应把该进程进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块中的指针值送到前面一个进程的指针位置。 (5) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6) 在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程进程名以及运行一次后进称对列的变化。 (7) 为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程进程名以及进程控制块的动态变化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值