操作系统实验二(进程调度之先来先服务)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验⼆(进程调度之先来先服务)
⼀. 实验⽬的
理解进程运⾏的并发性
理解进程各种状态及其之间的转换
理解进程管理中PCB的结构
掌握FCFS进程调度算法
⼆. 实验内容
要求
根据相关数据结构和算法流程,按FCFS⾮抢占式调度算法实现进程调度
原理
多道环境中进程数⼀般多于处理机数⽬,系统需按照某种算法动态地把处理机分配给就绪队列中的⼀个进程使之运⾏,
系统将所有进程按状态组织成不同队列:就绪、执⾏和阻塞。

本程序在实现时要求采⽤⾮剥夺式先来先服务进⾏调度:即按照进程进⼊就绪队列的先后次序来分配处理器,
先进⼊就绪队列的进程优先被选择,⼀旦占有处理器就⼀直运⾏下去直到结束。

实现中应分别设计三个链表队列表⽰运⾏、就绪和阻塞进程队列。

相关数据结构
进程的标识为PCB,PCB结构可⾃⾏设计也可采⽤如下结构:
typedef struct node
{
char name[10]; //进程标识符
int comet; //进程到来时间
char state; //进程状态
struct node *next;
}PCB;
算法流程
1 2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46//pri基础上:PCB的定义简单化只需要到来时间项;就绪队列按照到来时间从⼩到⼤排序;fcfs调度时采⽤⾮抢占式,即每个进程只运⾏⼀次就可运⾏完成。

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct node
{
char name[10]; //进程标识符
int comet; //进程到来时间
char state; //进程状态
struct node *next;
}PCB;
PCB *ready, *finish, * run;
void insert(PCB *p);
void firstin();
void print();
/*优先数创建初始进程PCB信息*/
void creatp()
{
char na[10];
int time;
PCB *p;
int n;
printf("请输⼊要创建的进程数");
scanf("%d",&n);
printf("输⼊进程号和到达的时间:\n");
for(int i=0;i<n;i++)
{
p=(PCB *)malloc(sizeof(PCB));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->next=NULL;
p->comet=time;
p->state='w';
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 insert(p); //将新产⽣的进程插⼊到就绪队列的合适位置 }
printf(" 优先数算法输出信息:\n");
printf("**********************************\n");
print();
if(run==NULL) firstin();
return;
}
/*进程就绪链表的插⼊算法,就绪链表按到来时间从⼩到⼤排列*/ void insert(PCB *p)
{
PCB *p1,*q;
p1=ready;
q=p1;
if(p1==NULL) //当插⼊的是第⼀个结点
{
p1=p;
ready=p1;
return;
}
else
{
while(p1!=NULL&&p1->comet<p->comet)
{
q=p1;
p1=p1->next;
}
if(q!=p1) //在链表中间或链尾插⼊结点
{
p->next=p1;
q->next=p;
}
else//在链表的表头插⼊结点
{
p->next=p1;
ready=p;
}
return;
}
}
/*将就绪队列的第⼀个进程投⼊运⾏*/
void firstin()
{
run=ready;
run->state='R';
ready=ready->next;
return;
}
/*先来先服务调度算法*/
void fcfsschedule()
{
while(run!=NULL)
{
print();
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL) firstin();
}
}
/*进程PCB的输出*/
void print1()
{
printf("进程号到达时间状态\n");
}
void print2(PCB *p)
{
printf("%5s,%5d,%5c\n",p->name,p->comet,p->state);
}
void print()
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155{
PCB *q1;
q1=(PCB *)malloc(sizeof(PCB)); print1();
if(run!=NULL) print2(run);
q1=ready;
while(q1!=NULL)
{
print2(q1);
q1=q1->next;
}
q1=finish;
while(q1!=NULL)
{
print2(q1);
q1=q1->next;
}
//getchar();
}
/*主函数*/
void main()
{
ready=(PCB *)malloc(sizeof(PCB)); run=(PCB *)malloc(sizeof(PCB)); finish=(PCB *)malloc(sizeof(PCB)); ready=NULL;
run=NULL;
finish=NULL;
creatp();
fcfsschedule();
}。

相关文档
最新文档