操作系统原理:运用FCFS法模拟处理机调度实验

算法:FCFS 先来先服务法

FCFS原理:

在这里插入图片描述

C++代码:

#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;

/*定义进程控制块*/
typedef struct pcb
{
	char name;                    //进程名
	struct pcb *next;             //链接指针
	int arrivetime;               //到达时间
	int runtime;                  //估计运行时间
	char state;					  //进程状态(就绪R和完成C)
	int rank;                     //估计运行时间长短排序  
}PCB;

/*进程创建函数*/
void initPCB(PCB *P) {
	cout << "\nPlease input current PCB's name:";
	cin >> P->name;
	cout << "\nPlease input this PCB's arrivetime:";
	cin >> P->arrivetime;
	cout << "\nPlease input this PCB's runtime:";
	cin >> P->runtime;
	P->state = 'R';  
}

/*进程运行函数*/
void runPCB(PCB *P, int& time) {
	int tTime;                         //定义每个进程的周转时间

	while (time<P->arrivetime) {
		time++;
	}
	tTime = time - P->arrivetime;
	cout << "Time slice is " << time << ",Process " << P->name << " start," << endl;
	while (P->runtime > 0) {
		P->runtime--;
		time++;
	}	
	cout << "Time slice is " << time << ",Process " << P->name << " end." << endl;
	cout << "Process " << P->name << "'s turnaround time is " << tTime << endl;
	cout << "The remaining processes in the ready queue :" ;
	P->state = 'C';                    //程序置为完成态
	//输出等待队列里面剩余进程的进程名。
	while (P->next != NULL) {
		cout << P->next->name << "  ";
		P = P->next;
	}
	cout << endl;
	cout << endl;
}

///*进程打印函数*/
//void printPCB(PCB *P) {
//	cout << P->name << "周转时间为:" << endl;
//}

int Time = 0;
int time = 0;
int main() {
	PCB *head;                          //队首指针
	int process_num = 0, i, j;
	PCB P[5];
	PCB *PCB_line[5];
	for (i = 0; i < 5; i++)
	{
		PCB_line[i] = &P[i];
	}	
	cout << "开始进程创建~" << endl;
	for (; process_num < 5; process_num++) {
		cout << "创建第" << process_num + 1 << "个程序!" << endl;
		initPCB(PCB_line[process_num]);
		cout << "创建成功!" << endl;
	}
	cout << "所有进程创建结束!" << endl;
	cout << "当进程到达处理机时:" << endl;
	//用插入法创建队列,将它们按到达时间(arrivetime)从小到大排列
	PCB *temp;
	//用3个for循环将创建的5个进程按照到达时间(arrivetime)从小到大进行排序
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4 - i; j++) {
			/*if (PCB_line[j]->runtime > max->runtime) {
				max = PCB_line[j];
			}*/
			if (PCB_line[j]->arrivetime > PCB_line[j + 1]->arrivetime)eEWWW
			{
				temp = PCB_line[j];
				PCB_line[j] = PCB_line[j + 1];             //交换指针排序
				PCB_line[j + 1] = temp;
			}
		}
	}
	head = PCB_line[0];
	for (i = 0; i < 5-1; i++) { 
		PCB_line[i]->next = PCB_line[i + 1];             //将所有链表链接在一起
	} 
	PCB_line[4]->next= NULL;

//进程运行
	process_num = 0;
	while (process_num < 5) {
		process_num++;
		cout << "第" << process_num << "个程序进入处理机。" << endl;
		time++;
		runPCB(PCB_line[process_num-1],time);
	}
	getchar();
	getchar();
	return 0;
} 

实验结果:

实验数据


进程名进程达到时间进程运行时间
A511
B411
C311
D211
E111

实验结果

程序输入运行结果

记2019年双十一,为什么我的女朋友还没来呢!(┬_┬)
不管了~
Happy solo 耶!

如果这篇文章对你有所帮助~
欢迎关注我的公众号夏虫不可语冰也
这里有更多你需要的信息哦~
夏虫不可语冰也

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3.4 独立实验 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 设有两个并发执行的父子进程,不断循环输出各自号、优先数和调度策略。 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 进程初始调度策略均为系统默认和优先级。当 父进程收到 进程收到 由键盘 由键盘 Ctrl+CCtrl+C Ctrl+C 发 出的 SIGINT SIGINTSIGINTSIGINTSIGINT信号时会自动将其优先数加 信号时会自动将其优先数加 信号时会自动将其优先数加 信号时会自动将其优先数加 信号时会自动将其优先数加 信号时会自动将其优先数加 信号时会自动将其优先数加 1,子进程 子进程 收到 由键盘 由键盘 Ctrl+ZCtrl+Z Ctrl+Z发出的 SIG SIGTSTP STP信号时会自动将其优先数减 信号时会自动将其优先数减 信号时会自动将其优先数减 信号时会自动将其优先数减 信号时会自动将其优先数减 信号时会自动将其优先数减 信号时会自动将其优先数减 1。 请编程实现以上功能。 请编程实现以上功能。 请编程实现以上功能。 请编程实现以上功能。 请编程实现以上功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值