处理机调度实验报告.docx
《处理机调度实验报告.docx》由会员分享,可在线阅读,更多相关《处理机调度实验报告.docx(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机与信息技术学院综合性、设计性试验报告专业:计算机科学与技术 年级/班级:08 级计科二班 20232023 学年第一学期课程名称计算机操作系统指导教师本组成员学号姓名试验地点试验时间工程名称进程治理试验类型综合性一、试验目的和要求通过使用不同的算法来实现进程调度,运用优先级调度的时间片轮转算法、先后挨次的时间片轮转调度算法和先来先效劳算法来模拟进程调度的过程,加深对进程概念和进程调度过程的理解。在 Linux 下用 C 语言编程模拟优先级和时间片轮转进程调度算法。为了清楚地观看每个进程的调度过程,程序应将每个时间片内的进程状况显示出来。二、试验仪器或设备配有 linux 操作系统的微型计
2、算机一台三、总体设计设计原理、设计方案及流程等首先,用交互式的过程来动态模拟进程的调度过程。通过输入数字来按特定的算法模拟处理机调度过程。输入 1 时,按优先级调度的时间片轮转算法模拟进程调度;输入 2 时,按先后挨次的时间片轮转调度算法模拟进程调度;输入3 时,按先来先效劳算法模拟进程调度;输入 4 时,退出程序;输入其他数字时, 会显示信息“YOU HAVE NOT CHOOSE ANY ALGORITHM!”并退出程序。其次,为进程的信息存放和进程的状态设置必要的数据构造来存放。进程的信息包括进程名、已经执行的cpu 时间、还需要的cpu 时间、进程所处的状态和在进程队列中指向此进程的下
3、一个进程的指针。这些是上述三个算法都要用到的。还有一些信息是某个算法所特有的,如优先级时间片轮转算法需要用到进程优先级,先后挨次的时间片轮转需要用到得到执行的时间片的个数有的是 2 个cpu 为一个时间片,有的是 1 个 cpu 为一个时间片,先来先效劳的算法需要用到进程到来时间。特别说明,为了便于描述进程所处的状态,将进程的状态用枚举类型来存放。最终,执行适宜的算法来实现根底调度过程。四、试验步骤包括主要步骤、代码分析等试验分 4 次完成第 1 次:完成程序的主框架设计,进展调试,验证其正确性;第 2 次:具体设计,进展调试,验证其正确性;第 3 次:进展整体调试;第 4 次:验证其设计的正
4、确性,完成试验报告。代码分析:#include #include #define P_NUM 5#define P_TIME 50 enum stateready,/ 预备好execute,/执行block,/堵塞finish/完毕;struct pcbb char name4;int cometime; /进程到来时间int priority; /数越大优先级越高int cputime; /已占用CPU的时间,也就是该处理机开头工作的时间int needtime; /执行时间int count; /得到的时间片的次数enum state process;struct pcbb *next;
5、;typedef struct pcbb pcb; void display_menuprintf(“CHOOSE THE ALGORITHM:n“);printf(“1 PRIORITYn“); printf(“2 ROUNDROBINn“);printf(“3 FIRST COME FISET SERVERn“);printf(“4 EXITn“);pcb* get_process/输入各个进程,并组合成链队列处理,返回队头指针pcb *q;int i = 0;pcb *p; /队头指针pcb *t; /队尾指针printf(“input name and timen“); while (
6、i name); scanf(“%d“,&q-needtime);q-cputime = 0; /cputime初始化为0q-priority = P_TIME - q-needtime;/所需要的时间越少优先级越高q-process = ready;/process的状态初始化为readyq-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 =
7、 p;p = p-next; free(q);void display(pcb *p)printf(“namecputimeneedtime prioritystaten“); while(p)printf(“%s“,p-name);printf(“); printf(“%d“,p-cputime); printf(“); printf(“%d“,p-needtime); printf(“);printf(“%d“,p-priority); printf(“);switch(p-process)case ready:printf(“readyn“);break;case execute:pri
8、ntf(“executen“); break; case block:printf(“blockn“); break; case finish:printf(“finishn“); break;p = p-next;int process_finish(pcb *q)/推断队列中有没有进程,没有返回1,有返回0 int b = 1;while(q)b=b&q-needtime=0; q=q-next;return b;void cpuexe(pcb *q)/cputime指已经执行的时间,needtime指还需要的时间pcb *tr = q;int tp = 0; while(q)if (q-
9、process!=finish)/时间片到,修改上次执行的进程的状态q-process = ready;if(q-needtime=0)q-process = finish;if(tppriority&q-process!=finish)/让tr指向优先级最高的未完成的进程tp = q-priority;tr = q;q = q-next;if(tr-needtime!=0)/执行tr所指向的进程tr-priority -=3;/每执行一次优先级降低三个单位tr-needtime -;/进程还需要的时间减去1tr-process = execute;/状态为执行tr-cputime+;/进程的
10、已经执行的时间加上1void priority_cal pcb *p;int cpu;p = get_process;/输入各个进程,并组合成链队列处理,返回队头指针printf(“输出各个进程的初始化信息:n“);display(p);cpu = 0;/表示当前执行的cpu时间while(!process_finish(p) /就绪队列中还有进程cpu+; printf(“cputime:%dn“,cpu);cpuexe(p); /选择优先级最高的进程执行一个时间单位display(p); /每调度一次就显示次sleep(2);free_process(p);/释放全部进程printf(“A
11、ll processes have finishedn“);pcb *get_process_round pcb *q;pcb *p; /头指针pcb *t; /尾指针int i = 0;printf(“input name and timen“); while (iname); scanf(“%d“,&q-needtime);q-cputime = 0;q-count = 0;q-process = ready; q-next = NULL; if(i=0)p = q; t = q;elset-next = q; t = q; i+;return p;void cpu_round(pcb *
12、q) if(q-needtime=1)q-cputime+;elseq-cputime +=2;q-needtime -=2; if(q-needtimeneedtime = 0;q-count+;q-process = execute;pcb *get_next(pcb *k,pcb *head) pcb *t;t = k; dot =t-next;while ( t & t-process = finish);if(t = NULL)t = head;/k是刚刚被执行的节点,假设t-next=k,所明就绪队列除了k和t以外都/已完毕,依据时间片轮转算法,该t执行while(t-next!=
13、k & t-process = finish)t = t-next;return t;void set_state(pcb *p) pcb *q;q=p; while(q)if(q-needtime = 0)q-process = finish;if(q-process = execute) q-process = ready;q = q-next;void display_round(pcb *p)/显示各个进程的信息pcb *q;q=p;printf(“namecputimeneedtime countstaten“); while(q)printf(“%s“,q-name);printf
14、(“); printf(“%d“,q-cputime); printf(“); printf(“%d“,q-needtime); printf(“);printf(“%d“,q-count);printf(“); switch(q-process)case ready:printf(“readyn“);break;case execute:printf(“executen“); break; case block:printf(“blockn“); break; case finish:printf(“finishn“); break;q = q-next;void round_calpcb
15、*p;pcb *r;int cpu;p = get_process_round;/输入各个进程,并组成链队列,返回队头指针printf(“输出各个进程的初始化信息:n“);display_round(p); cpu = 0;r=p;while(!process_finish(p) /就绪队列中还有进程if(r-needtime=1)cpu+=1;else/假设需要的时间长度大于等于2 cpu+=2; /时间片长度是2cpu_round(r);r = get_next(r,p); /获得下一个需要执行的进程printf(“cputime:%dn“,cpu);display_round(p); /
16、每调度一次就显示次set_state(p);sleep(2);free_process(p);/释放全部进程printf(“All processes have finishedn“);pcb* get_process_fcfs/输入各个进程,并组成链队列处理,返回队头指针pcb *q,*r,*f;int i = 0;pcb *p; /队头指针pcb *t; /队尾指针printf(“input name 、cometime andneedtimen“); while (i name); scanf(“%d“,&q-cometime); scanf(“%d“,&q-needtime);q-cp
17、utime = 0; /cputime初始化为0q-process = ready;/process的状态初始化为ready q-next = NULL;if(i=0) /队列中的第一个printf(“队列中的第一个n“); p = q;t = q;/队尾指针也要处理elseif (q-cometime = t-cometime)/插到队列尾t-next = q; t = q;else/从队头开头扫描if (p-cometime q-cometime)q-next=p; p=q;elser=p; f=r; while(r)if (r-cometime cometime)f=r;r=r-next
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 处理机 调度 实验 报告
限制150内