原理:

          按照作业进入系统的先后次序来挑选作业,先进入系统的作业优先被挑选。

 

用c语言写的,采用单链表来模拟PCB,实现CPU调用进程。

 

FcFs.h:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef
struct PCB { char ID[15];//进程名字 int arrive_time; //进程到达时间 int
work_time;//进程服务时间 int start_time; //进程开始时间 int finish_time;//进程完成时间 int
turnover_time;//周转时间 double Wturnover_time;//加权周转时间 int data;//执行顺序 char
sign;//标记 N 表示已排序,不能进入。Y表示没排序,可以进入。 struct PCB *next; }PCB,*P_PCB;
//接收所有进程,形成PCB链表 int Enter(P_PCB start) { int process_sum = 0;//进程的总数
printf("请输入进程的个数:"); scanf("%d", &process_sum); start->data =
process_sum;//头指针装入了进程总数 for (int i = 0; i < process_sum; i++) { //录入第i个进程的信息
P_PCB newHead; newHead = (P_PCB)malloc(sizeof(PCB));//新的节点
printf("请输入进程%d的名字:", i+1); scanf("%s", newHead->ID); printf("请输入进程%d的到达时间;",
i+1); scanf("%d", &newHead->arrive_time); printf("请输入进程%d的服务时间;", i+1);
scanf("%d", &newHead->work_time); system("cls"); newHead->next = start->next;
start->next = newHead; } return 0; } //根据进程到达时间对除ID和arrive_time和work_time外其他值赋值
int Rank(P_PCB start) { int temp, atime, ftime; P_PCB m=
NULL,p,q;//p为了找一个sign是Y的节点把arrive_time给temp,q是和其他的arrive_time比较的跟踪节点,m是最小temp的跟踪
//对所有节点的sign赋值 p = start->next; for(int i=0;i<start->data;i++) { p->sign = 'Y';
p = p->next; } //给每一个节点赋了 data值 for (int i=0;i< start->data ;i++) {
//arrive_time找最小值 p = start->next; while (p->next != NULL) { if (p->sign ==
'Y') { temp = p->arrive_time; m = p;break; } } q = p; while ( q->next != NULL)
{ q = q->next; if (q->sign == 'Y'&& temp > q->arrive_time) { temp =
q->arrive_time; m = q; } } m->data = i + 1; m->sign = 'N';
//根据data值对start_time和finish_time和sign赋值 if (m->data == 1) { m->start_time =
m->arrive_time;//开始时间 m->finish_time = m->work_time;//结束时间 atime =
m->start_time; ftime = m->finish_time; m->turnover_time = m->finish_time -
m->arrive_time;//周转时间(完成-到达) m->Wturnover_time = (double)m->turnover_time /
m->work_time;//加权周转时间 } else { if (m->arrive_time <= ftime) { m->start_time =
ftime;//开始时间 m->finish_time = m->work_time+ m->start_time;//结束时间 atime =
m->start_time; ftime = m->finish_time; m->turnover_time = m->finish_time -
m->arrive_time;//周转时间(完成-到达) m->Wturnover_time = (double)m->turnover_time /
m->work_time;//加权周转时间 } else { m->start_time= m->arrive_time;//开始时间
m->finish_time = m->work_time+ m->start_time;//结束时间 atime = m->start_time;
ftime = m->finish_time; m->turnover_time = m->finish_time -
m->arrive_time;//周转时间(完成-到达) m->Wturnover_time = (double)m->turnover_time /
m->work_time;//加权周转时间 } } } return 0; } //输出所有进程信息 void A(P_PCB start) { P_PCB
p ; for (int i = 0; i < start->data; i++) { p = start; while (p->next!= NULL) {
p = p->next; if (p->data == i + 1) { printf("进程名字%s ,到达时间:%d ,服务时间:%d ", p->ID,
p->arrive_time, p->work_time); printf("开始时间:%d ,完成时间:%d ,周转时间:%d
,加权周转时间:%lf\n", p->start_time, p->finish_time, p->turnover_time,
p->Wturnover_time); printf("+++++++++++++++++++++++++++++++\n"); } } } }
//模拟cpu运行 void B(P_PCB start) { P_PCB q; for (int m = 0; m < start->data; m++)
{ q = start; for (int i = 0; i < start->data; i++) { q = q->next; if (q->data
== m + 1) { printf("在%d时刻:%s进程开始执行。\n", q->start_time, q->ID); for (int j =
q->start_time; j <= q->finish_time; j++) { printf("在%d时刻:%s进程正在执行。\n", j,
q->ID); } printf("在%d时刻:%s进程结束执行。\n", q->finish_time, q->ID); break; } } } }
//函数调用 int Show(P_PCB start) { int a = 0; P_PCB p = start;
printf("请录入进程的信息:\n"); Enter(start); Rank(start); while (1) {
printf("请选择你要展示的效果:\n"); printf("1.输出所有进程的信息。\n"); printf("2.模拟cpu工作状态。\n");
printf("3.退出.\n"); scanf("%d", &a); switch (a) { case 1: A(start); break; case
2: B(start); break; case 3: exit(0); break; default:break; } system("pause");
system("cls"); } return 0; }
FcFs_test.cpp:
#include"FcFs.h" int main() { P_PCB start; start =
(P_PCB)malloc(sizeof(PCB));//头结点 start->next = NULL; Show(start); return 0; }