先来先服务c语言的实现
### 先来先服务(FCFS)调度算法的C语言实现 #### 一、概述 在计算机操作系统领域,进程调度是资源管理的核心部分之一。它决定了进程执行的时间顺序,直接影响了系统的性能和效率。其中,“先来先服务”(First-Come, First-Served, FCFS)是最简单的一种进程调度策略。这种策略按照进程到达的先后顺序进行调度,即先到达的进程优先获得CPU时间。 #### 二、FCFS调度算法原理 在FCFS调度算法中,系统维护一个就绪队列,所有到达的进程都会被加入到该队列的末尾。当CPU空闲时,系统会选择队列中的第一个进程分配CPU,并让它运行直至完成或因等待I/O而阻塞。当一个进程完成或因某种原因离开CPU时,下一个在队列中的进程将被选中并执行。 #### 三、C语言实现FCFS调度算法 下面我们将详细解析题目给出的C语言代码片段,以理解FCFS调度算法的具体实现方式。 1. **数据结构定义** ```c typedef struct JCB { char num[2]; // 进程编号 char name[10]; // 进程名称 char state; // 进程状态 int tijiaotime; // 提交时间 int starttime; // 开始时间 int finishtime; // 完成时间 int needtime; // 执行所需时间 struct JCB *next; // 指向下一个进程 } jcb; ``` - `num`: 进程编号。 - `name`: 进程名称。 - `state`: 进程当前的状态('W'表示等待,'F'表示完成)。 - `tijiaotime`: 进程提交给系统的时刻。 - `starttime`: 进程开始执行的时间。 - `finishtime`: 进程完成的时间。 - `needtime`: 进程执行所需的时间。 - `next`: 指向链表中的下一个进程。 2. **初始化及输入信息** ```c void getInfo() { ... printf("请输入进程数量:"); scanf("%d", &n); for (int num = 0; num < n; num++) { p = (jcb*) malloc(sizeof(jcb)); if (head == NULL) { head = p; q = p; } printf("请输入进程编号, 进程名称, 提交时间, CPU执行时间:\n"); scanf("%s\t%s\t%d\t%d", &p->num, &p->name, &p->tijiaotime, &p->needtime); if (p->tijiaotime < time) time = p->tijiaotime; q->next = p; p->starttime = 0; p->finishtime = 0; p->next = NULL; p->state = 'W'; q = p; } } ``` - 首先获取用户输入的进程数量。 - 使用`malloc()`为每个进程分配内存空间,并初始化其属性。 - 通过`scanf()`函数读取用户输入的进程信息。 - 维护一个单向链表存储进程信息。 3. **FCFS调度过程** ```c void fcfo() { int i, j, t; for (j = 0; j < n; j++) { p = head; t = 10000; for (i = 0; i < n; i++) { // 遍历所有未完成的进程 if (p->tijiaotime < t && p->state == 'W') { t = p->tijiaotime; q = p; // 更新当前未完成的最早提交的进程 } p = p->next; } run_fcfo(q); } } void run_fcfo(jcb *p1) { time = p1->tijiaotime > time ? p1->tijiaotime : time; p1->starttime = time; printf("\n时间%d, 开始执行进程%s\n", time, p1->name); time += p1->needtime; p1->state = 'F'; p1->finishtime = time; printf("进程开始时间结束时间\n"); printf("%s %d %d %d", p1->name, p1->starttime, p1->needtime, p1->finishtime); } ``` - `fcfo()`函数实现了FCFS调度逻辑。 - `run_fcfo()`用于更新进程的状态,并打印相关信息。 - 在每一轮循环中找到最早提交且未完成的进程,并将其作为下一轮调度的对象。 - 更新当前时间、进程状态等信息,并打印出进程的执行情况。 #### 四、总结 以上C语言程序展示了如何实现FCFS调度算法。通过创建进程结构体、链表以及相应的处理函数,我们可以模拟进程调度的过程,并直观地看到不同进程的执行顺序及其执行时间。这种简单的调度算法虽然易于理解和实现,但在实际应用中可能会导致某些进程等待时间过长,因此在现代操作系统中通常会采用更为复杂的调度策略。
#include"stdlib.h"
typedef struct JCB //定义进程控制块
{
char num[2]; //作业号
char name[10]; //作业名
char state; //运行状态
int tijiaotime; //提交作业时间
int starttime; //作业开始时间
int finishtime; //结束时间
int needtime; //运行需要时间
struct JCB *next; //指向下个作业
}jcb;
int time=10000,n; //计时器
jcb *head=NULL,*p,*q;
void run_fcfo(jcb *p1)
{
time = p1->tijiaotime > time? p1->tijiaotime:time;
p1->starttime=time;
printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);
time+=p1->needtime;
p1->state='F';
p1->finishtime=time;
printf("作业名 开始时间 所需时间 结束时间\n");
printf("%s %d %d %d ",p1->name,p1->starttime,p1->needtime,p1->finishtime);
}
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 昱感微融合产品 YGW-L2 集成了激光雷达,可见光摄像头,红外摄像头,多传感器融合后生 成时空对齐的多维像素数据,通过 GMSL 接口发出 本品为客户提供更加直接、高效、和可 扩展的环境与事件感知能
- 1、判断是否回文正数 2、两个字符串相加 3、整理课上内容(HTML)
- 数据中台建设方法论.pdf
- Cangjie Studio社区版1.1 开发者手册:IDE介绍及使用教程
- 昱感微融合产品YGW-R1集成了毫米波雷达,可见光摄像头,红外摄像头,多传感器融合后生成时空对齐的多维像素数据,通过GMSL接口发出 本品为客户提供更加直接、高效、和可扩展的环境与事件感知能力
- 服务商快速进件+投诉处理插件
- C#ASP.NET简易库存管理系统源码数据库 SQL2019源码类型 WinForm
- 昱感微融合产品YGW-L1集成了激光雷达,可见光摄像头,红外摄像头,多传感器融合后生成时空对齐的多维像素数据,通过GMSL接口发出 本品为客户提供更加直接、高效、和可扩展的环境与事件感知能力
- ansys Fluent阀门CFD分析
- 基于 SpringBoot 的宽带业务管理系统:构建智能化宽带业务运营新范式