操作系统实验:C语言实现先来先服务(FCFS)调度算法

3星 · 超过75%的资源 需积分: 21 16 下载量 87 浏览量 更新于2024-09-12 4 收藏 126KB DOC 举报
“操作系统实验——先来先服务(FCFS)算法的C语言实现” 操作系统是计算机系统的核心,负责管理和协调系统的硬件与软件资源,而进程调度是操作系统中的关键任务之一,用于决定哪个进程在何时获得CPU执行。在这个实验中,我们关注的是先来先服务(First-Come, First-Served,简称FCFS)调度算法,这是一种简单的调度策略。 **先来先服务算法**: FCFS算法按照进程到达的顺序进行调度,即最早到达的进程优先获得CPU。这种算法体现了公平性,但并不一定是最优的,因为它可能导致短进程等待时间过长,影响系统效率。FCFS算法主要用于批处理系统,因为它能保证长时间作业的公平性。 **实验内容与实现**: 1. **进程调度策略**:实验中采用FCFS算法,意味着进程会按照它们被提交到系统的时间顺序进行执行。 2. **数据结构设计**:实验使用了两个链队列,分别代表运行队列(包含当前正在或等待执行的进程)和完成队列(存储已经执行完毕的进程)。这样的设计便于模拟进程的执行状态转换。 3. **用户输入**:用户需要输入每个进程的标识符(可能是一个数字或者字符串,用于唯一标识进程)和进程执行所需的时间。这些信息将被用于创建进程控制块(Process Control Block, PCB),它包含了关于进程的所有必要信息,如进程名、到达时间、服务时间等。 4. **进程状态输出**:当每个进程结束时,系统会输出该进程的进程号、到达时间、开始执行时间、完成时间以及状态(等待或完成)。 5. **C语言实现**:给出的代码片段展示了C语言实现FCFS算法的基本框架,包括定义进程控制块结构体`Pcb`,初始化队列的函数`InitQueue`,入队操作`EnQueue`,出队操作`DeQueue`等。这些函数是实现FCFS算法的基础。 **实验代码分析**: - `Pcb`结构体包含了进程的基本信息,如进程名、到达时间、服务时间、开始时间、完成时间和状态。 - `SqQueue`结构体代表了队列,包含基地址`base`,队首指针`front`和队尾指针`rear`。 - `InitQueue`函数用于分配内存并初始化队列,`EnQueue`和`DeQueue`分别用于向队列添加和删除元素,确保队列的正确操作。 - 缺失的部分可能包括读取用户输入、根据FCFS策略调度进程、更新进程状态和输出结果等功能。 这个实验旨在帮助学生深入理解操作系统的进程管理,特别是进程调度的概念和FCFS算法的工作原理。通过实际编写和运行代码,可以更好地体会操作系统如何控制进程的执行顺序,并观察不同调度策略对系统性能的影响。
2010-06-01 上传
先来先服务算法 #include "stdio.h" #include #define max 100 #define pfree 0 /*process end*/ #define running 1 /*process running status*/ #define aready 2 /*process aready status */ #define blocking 3 /*process aready blocking status*/ typedef struct node { char name; int status; int ax,bx,cx,dx; int pc; int psw; struct node *next; /*pcb define*/ }pcb; pcb *createprocess(pcb *head) { pcb *p,*q; int a,b,c,d,m,n; char ID; q=NULL; printf("input the first seven status pcb:"); scanf("\n%c%d%d%d%d%d%d",&ID,&a,&b,&c,&d,&m,&n); while(1) { p=(pcb*)malloc(sizeof(pcb)); p->name=ID; p->ax=a; p->bx=b; p->cx=c; p->dx=d; p->pc=m; p->psw=n; p->status=aready; if(head==NULL) head=p; else q->next=p; q=p; printf("input the next seven status pcb: "); scanf("\n%c",&ID); if (ID == '*') break; scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n); } if(q!=NULL) q->next=NULL; q=head; while(q) { printf("\n process name. status.ax. bx. cx. dx. pc. psw.\n "); printf("%10c%5d%5d%5d%5d%5d%5d%5d",q->name,q->status,q->ax,q->bx,q->cx,q->dx,q->pc,q->psw); q=q->next; } return head;/*createprocess end*/ } void processfcfs(pcb *head) /*use fifo */ { pcb *p; p=head; printf("\n the process use fcfs method.\n"); printf("running the frist process:\n"); while(p!=NULL) { p->status=running; printf("\nprocess name status. ax. bx. cx. dx. pc. psw."); printf("\n%10c%5d%8d%5d%5d%5d%5d%5d",p->name,p->status,p->ax,p->bx,p->cx,p->dx,p->pc,p->psw); /*check process running status */ p->status=0; p=p->next; } printf("\n检查进程是否结束:"); p=head; while(p) { printf("\n%3c%3d",p->name,p->status); p=p->next; } printf("\ngame is over!\n"); } main() { pcb *head; head=NULL; head=createprocess(head); processfcfs(head); }