操作系统处理机调度实验报告

2019-04-02 14:35

操作系统 实验报告

学 号 专 业 姓 名 班 级 时 间 2011年12月16日 网络工程 5班

实验题目: 处理机调度 实验目的: (1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。 (2)了解Linux中进程(线程)的调度机制。 (3)学习使用Linux中进程(线程)调度算法,掌握相应的与调度有关的函数。 实验内容与步骤: 程序说明: 1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS:first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。 2)轮转法就是按一定时间片(记为q)轮番运行各个进程。如果q是一个定值,则轮转法是一种对各进程机会均等的调度方法。 3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。 具体步骤: 分析问题,提出解决问题的算法 编制程序 程序调试 记录实验结果,以及思考是否能够改善算法 程序及运行结果: #include #include #define P_NUM 5 #define P_TIME 50 enum state{ ready, execute, block, finish }; struct pcbb{ char name[4]; int priority; //数越大优先级越高 int cputime; //已占用CPU的时间 int needtime; //执行时间 int count; enum state process; struct pcbb *next; }; typedef struct pcbb pcb; void display_menu(){ printf(\ printf(\ printf(\ printf(\} pcb* get_process(){ pcb *q; pcb *p; //头指针 pcb *t; //尾指针 int i = 0; printf(\ while (i < P_NUM){ q=(pcb *)malloc(sizeof(pcb)); scanf(\ scanf(\ q->cputime = 0; q->priority = P_TIME - q->needtime; q->process = ready; q->next = NULL; if(i==0){ p = q; t = q; } else{ t->next = q; t = q; } i++; } return p; } void free_process(pcb *p){ pcb *q; while(p!= NULL){ q = p; p = p->next; free(q); } } void display(pcb *p){ printf(\priority state\\n\ while(p){ printf(\ printf(\ \ printf(\ printf(\ \ printf(\ printf(\ \ printf(\ printf(\ \ switch(p->process){ case ready:printf(\ case execute:printf(\ case block:printf(\ case finish:printf(\ } p = p->next; } } int process_finish(pcb *q){ int b1 = 1; while(b1&&q){ b1 = b1&&q->needtime==0; q = q->next; } return b1; } void cpuexe(pcb *q){ pcb *t = q; int tp = 0; while(q){ //让t指向优先级最高的进程 if (q->process!=finish){ q->process = ready; if(q->needtime==0){ q->process = finish; } } if(tppriority&&q->process!=finish){ tp = q->priority; t = q; } q = q->next; } if(t->needtime!=0){ t->priority -=3; //每执行一次优先级降低三个单位 t->needtime --; t->process = execute; t->cputime++; } } void priority_cal(){ pcb *p; p = get_process(); int cpu = 0; while(!process_finish(p)){ //就绪队列中还有进程 cpu++; printf(\ cpuexe(p); //选择优先级最高的进程执行一个时间单位 display(p); //每调度一次就显示次 sleep(2); } free_process(p); //释放所有进程 printf(\} pcb *get_process_round(){ pcb *q; pcb *p; //头指针 pcb *t; //尾指针 int i = 0; printf(\ while (icputime = 0; q->count = 0; q->process = ready; q->next = NULL; if(i==0){ p = q; t = q; } else{ t->next = q; t = q; } i++; } return p; } void cpu_round(pcb *q){ if(q->needtime==1) q->cputime++; else q->cputime +=2; q->needtime -=2; if(q->needtime<0){ q->needtime = 0; } q->count++; q->process = execute; } pcb *get_next(pcb *k,pcb *head){ pcb *t; t = k; do{ t =t->next; }while ( t && t->process == finish); if(t == NULL){ t = head; //k是刚刚被执行的节点,如果t->next=k,所明就绪队列除了k和t以外都已结束,按照时间片轮转算法,该t执行 while(t->next!=k && t->process == finish){ t = t->next; } } return t; } void set_state(pcb *p){ while(p){ if(p->needtime == 0){ p->process = finish; } if(p->process == execute){ p->process = ready; }


操作系统处理机调度实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:青年拳甲段动作名称及动作说明

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: