山东大学操作系统实验报告3进程调度算法实验

合集下载

操作系统实验报告进程调度

操作系统实验报告进程调度

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。

二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。

常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。

1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。

2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。

3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。

4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。

5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。

当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。

三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。

(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。

(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。

(4)将实验过程和结果进行记录整理,撰写实验报告。

3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。

《操作系统》上机实验报告—进程调度

《操作系统》上机实验报告—进程调度

《操作系统》上机实验报告实验算法主体内容及#include<stdio.h>#include<dos.h>#include<stdlib.h>#include<conio.h>#include<iostream.h>#define P_NUM 5 // 共有5 个进程#define P_TIME 50 //作为优先数计算时所用的值enum state{ready,execute,block, finish};//进程的状态,使用枚举struct pcb{char name[4]; // 进程名称int priority; //进程优先级int cputime; //已经占有cpu运行的时间int needtime; //还需要运行的时间int count; //在时间片轮转法中使用的int round; //在时间片轮转法中使用的state process; //进程的状态pcb *next; //指向下一个进程的pcb};pcb *get_process() //通过输入各进程的值来建立pcb队列,并返回其首元素的指针{pcb *q;pcb *t;pcb *p;int i=0;coutvv"请输入进程名与时间"<<endl;while(i<P_NUM){q=(struct pcb *)malloc(sizeof(pcb));cin>>q->name; cin>>q->needtime; q->cputime=O;q->priority=P_TIME-q->needtime;q->round=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 display(pcb *p) //显示本轮运行后的进程各状态情况{coutvv" 进程各状态情况"vvendl;coutvv"名称"vv" "vv"进入时间"vv" "vv"还需时间"vv" "vv"优先级"vv" "vv"状态"vvendl;while(p){coutvvp->name;coutvv" ";coutvvp->cputime;coutvv" ";coutvvp->needtime;coutvv" ";cout<vp_>priority;coutvv"";switch(p->process) //对枚举类型的输出方法{case ready:cout< <"就绪"<<endl;break;case execute:cout< <"执行"<<endl;break;case block:cout<<"阻塞"<<endl;break;case finish:cout<<"完成"<<endl;break;} p=p->next;}}int process_finish(pcb *q) //判断所有的进程是否运行结束{ -int b=1;while(q&&b){b=b&&q->needtime==O; q=q_>next;} return b;}void cpuexe(pcb *q) //优先级调度算法的一次执行{pcb *t;t=q;int i=0;while(q){if (q->process!=finish){q_>process=ready;if(q->needtime==0) q->process=finish;} if(i<q->priority) if(q->process!=finish){ t=q;i=q->priority;} q=q->next;}t->needtime-=1;t_>priority_=3; if(t->needtime==0)t->process=finish; t->cputime+=1;}void priority_cal() //优先级调度算法{pcb *p;P=get_process();〃取得进程队列int cpu=0;while(!process_finish(p)) //若进程并未全部结束,则还需要执行{cpu++;coutvv"运行次数:"vvcpuwendl; cpuexe(p);//一次cpu的执行display(p);//显示本次执行结果}}pcb * get_process_round()Jpcb *q;pcb *t;pcb *p;int i=0;coutvv"请输入进程名与时间"《endl;while (i<P_NUM){q=(struct pcb *)malloc(sizeof(pcb));cin>>q->name;cin>>q->needtime; q->cputime=O;q->round=0;q->count=0;q_>process=ready; q->next=NULL; if(i==0){p=q;t=q;}else{} i++; } return p;} t->next=q; t=q;void cpu_round(pcb *q){-q->count++;q->cputime+=2;q->needtime-=2;if(q->needtime<0)q->needtime=0;q->round++;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){} return t; t=head;while (t->next!=k && t->process==finish) {t=t->next;}void set_state(pcb *p){-while(p){if (p->needtime==O){p->process=finish;}if (p->process==execute){p_>process=ready;} p=p_>next;}}void display_round(pcb *p){ -cout«" 进程各状态情况"vvendl;coutvv"名称"vv" "vv"进入时间"vv" "vv"还需时间"vv" "vv"时间片"vv"" vv"次数"vv""vv"状态"vvendl;while(p){coutvvp->name;coutvv" ";coutvvp->cputime;coutvv" ";coutvvp->needtime;coutvv" ";coutvvp->round;coutvv"";coutvvp->count;coutvv"";switch(p->process){case ready:coutv v"就绪"vvendl;break;case execute:coutvv'执行"vvendl;break;case finish:coutvv"完成"vvendl;break;}p=p->next;}}void round_cal(){pcb *p;pcb *r;p=get_process();int cpu=0;r=p;while(!process_finish(p)){cpu+=2;cpu_round(r);r=get_next(r,p);coutvv"运行次数"vvcpuvvendl;display_round(p);set_state(p);} }-void display_menu(){ -coutvv"进程调度算法操作:"vvendl;coutvv"1 优先数"vvendl;coutvv"2 时间片轮转"vvendl;coutvv"3 退出"vvendl;}void main(){display_menu();int k;printf("请选择:");scanf("%d",&k);switch(k){case 1:priority_cal();break;case 2:round_cal();break;case 3:break;}} ----------------------------------------------------------------------------------------------------------测试数据:¥间出择1A.时退选r 5642 3込簷运行结果:1优先数S却曰石石<奪--a S 亠 亡疋出尢尤扫 亡、 ^a ^T B a 抄各时 各时 进还进还称进入时|可0 3 0I! IS 运行次数 “称进入时间II态成養成成忧完就完完完&0 94 2R p f c 32 3 4 3 % 扰冋运行次数心 泊称进入吋冋R5 R 5 C4 卜2佳行次数陰态成成成成成状§_f c s ^H Z B6 4 28尸尤32 3 4结果截图与分析2、时间片轮转10 0名称进入时问64 42 运行次数t k 称进入吋间A称进入时间竇鶴躺翻聶s _^->4p 者者者奁廿者_J-^□者者HiH8 数 謝还轎時 0 00 0 0次数0 口2 1 21 2 3 3216 6 42 2 1 20 Q 0D F次数3 E34 4 1 1 e s 02 0 0态成成态成衣成成些兀执完lla兀。

进程调度算法实验报告

进程调度算法实验报告

计算机操作系统实验报告实验二进程调度算法一、实验名称:进程调度算法二、实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。

三、问题分析与设计:1.先来先服务调度算法先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

FCFS算法比较有利于长作业(进程),2.短作业(进程)优先调度算法短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。

它们可以分别用于作业调度和进程调度。

短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。

而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。

SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。

该算法对长作业不利,完全未考虑作业的紧迫程度。

3.时间片轮转算法在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。

换言之,系统能在给定的时间内响应所有用户的请求。

进程的调度实验报告(3篇)

进程的调度实验报告(3篇)

第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。

二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。

2. 实现三种调度算法:FCFS、RR和DP。

3. 创建一个进程队列,用于存储所有进程。

4. 实现调度函数,根据所选算法选择下一个执行的进程。

5. 模拟进程执行过程,打印进程执行状态和就绪队列。

四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。

进程调度算法 实验报告

进程调度算法 实验报告

进程调度算法实验报告
《进程调度算法实验报告》
一、实验目的
本实验旨在通过对进程调度算法的实验研究,探究不同调度算法对系统性能的影响,进一步加深对操作系统进程调度的理解。

二、实验内容
本次实验选择了三种常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)和轮转调度(RR),并通过模拟不同进程的到达时间和执行时间,分别对这三种算法进行实验比较。

三、实验步骤
1. 设计实验用例:确定不同进程的到达时间和执行时间,以及不同调度算法的时间片大小。

2. 模拟执行:根据设计的实验用例,使用模拟工具模拟不同调度算法的执行过程,并记录每个进程的执行情况和系统的运行情况。

3. 数据分析:根据实验结果,对比不同调度算法的平均等待时间、平均周转时间等指标,分析各算法的优缺点。

四、实验结果
通过实验比较,得出以下结论:
1. 先来先服务(FCFS)算法:适用于执行时间较短的进程,但容易导致长作业等待时间过长。

2. 最短作业优先(SJF)算法:能够最大程度地减少平均等待时间和平均周转时间,但无法处理长作业优先的情况。

3. 轮转调度(RR)算法:能够保证每个进程都能及时得到执行,但可能导致部分进程的等待时间过长。

五、实验结论
根据实验结果,不同的进程调度算法适用于不同的场景。

在实际应用中,需要根据系统的实际情况和需求选择合适的调度算法,以最大程度地提高系统的性能和效率。

六、实验总结
通过本次实验,加深了对进程调度算法的理解,同时也了解了不同算法在实际应用中的优缺点。

希望通过本次实验,能够为进程调度算法的研究和应用提供一定的参考和借鉴。

进程调度算法设计实验报告

进程调度算法设计实验报告

进程调度算法的设计一、实验题目:实现先来先服务调度算法(FCFS)实现时间片轮转调度算法(RR)二、实验目的:通过对进程调度算法的设计,深入理解进程调度的原理。

进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。

三、实验原理:1.先来先服务(FCFS)调度算法每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。

该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。

将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。

它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长2.时间片轮转调度算法RR时间片轮转法主要用于进程调度。

采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。

进程调度按一定时间片(q)轮番运行各个进程.进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU 分配给就绪队列的首进程。

四、数据结构:数组五、程序代码:package sufa;import java.util.Arrays;import java.util.Scanner;public class Dispatch {public static void main(String[] args){int slice = 1; //时间片System.out.println("请输入要创建的进程数目:");Scanner reader = new Scanner(System.in);int num = reader.nextInt(); //用户要输入的进程数Process1 arr[] = new Process1[num]; //创建多个进程System.out.println("请分别输入进程的名称、到达时间以及区间时间");for(int i=0; i<arr.length; i++){arr[i] = new Process1(); //得到用户输入的各值}Arrays.sort(arr); //根据到达时间对进程数组排序int time =arr[0].arrtime; //赋值为最先到达的进程的到达时间System.out.println("-----开始进入FCFS算法-----");System.out.println(" "+"arrtime"+" "+"burstime"+" "+"overtime"+" "+"周转时间");for(int i =0; i<arr.length; i++){arr[i].overtime = arr[i].bursttime+time; //计算进程的结束时间time = time +arr[i].bursttime;arr[i].turnovertime = arr[i].overtime - arr[i].arrtime; //计算进程的周转时间System.out.println("进程"+arr[i].id+"开始运行"+"\t"+arr[i].arrtime+"\t"+arr[i].bursttime+"\t"+arr[i].overtime+"\t"+arr[i ].turnovertime);}int count = arr.length;System.out.println("-----开始进入RR算法-----");System.out.println(" "+"lasttime");while(count>0){for(int i=0; i<arr.length; i++){if(arr[i].bursttime>0){ //如果剩余区间还有时间 arr[i].bursttime=arr[i].bursttime-slice; //每循环运行一次就减去时间片,并打印下面语句System.out.println("进程"+arr[i].id+"开始运行"+"\t"+arr[i].bursttime);}if(arr[i].bursttime==0)count --; //当有某个进程的剩余时间为0的时候,count进行减1,当count减到等于0时,即每个进程都没有剩余时间了,就不再运行了}}}}class Process1 implements Comparable{int id; //进程名称int arrtime; //到达时间int bursttime; //区间时间int overtime; //结束时间double turnovertime; //周转时间public Process1(){ //读取用户输入的各个值Scanner reader = new Scanner(System.in);this.id = reader.nextInt();this.arrtime = reader.nextInt();this.bursttime = reader.nextInt();}@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubProcess1 pcb = (Process1)o;if(this.arrtime>= pcb.arrtime) //重写方法实现Comparable接口,按照到达时间的大小进行排序return 1;elsereturn -1;}}六、运行结果:七、实验心得:这次的实验实现FCFS算法和RR算法虽然用程序算法实现了模拟进程调度的整个过程,但是并未能考虑深入到操作系统的根本上用不同的队列存储不同状态下的进程来实现算法调度,但通过这次对进程调度算法设计的实现,还是对进程调度有了更深入更清楚的了解,以后的程序编写不论是实验还是项目开发,无论大小,都应该把程序的整体框架构建好,提高重用性。

进程的调度算法实验报告-计算机操作系统教程(第三版)

进程的调度算法实验报告-计算机操作系统教程(第三版)

进程的调度算法实验报告-计算机操作系统教程(第三版)进程的调度算法实验报告(完整版)⼀、实验⽬的:⽤⾼级语⾔编写和调试⼀个简单的进程调度程序。

加深了解有关进程控制块,进程队列的概念,并体会和了解优先数和时间⽚调度算法的具体实施⽅法。

⼆、实验内容:根据不同的调度算法模拟操作系统对进程的调度。

调度算法有⼆种:动态优先级法和时间⽚循环法。

1、设计进程控制块PCB表结构,分别适⽤优先数调度算法和循环时间⽚轮转算法。

2、PCB结构通常包括以下信息:进程名、进程优先数、轮转时间⽚、进程的CPU时间,进程状态等。

根据调度算法不同,PCB结构可作适当的调整。

3、建⽴进程队列。

对不同的算法编制不同的⼊链程序编制两种进程调度算法:a、优先数调度;b、循环时间轮转调度三、实验设计1.实验原理:2.算法思想:以时间⽚为计量单位A:优先数调度算法1)系统初始化时给每⼀个进程赋⼀个NEEDTIME和初始PRI。

并按优先数⼊队。

2)系统每次选定⼀个优先级最⾼的进程投⼊运⾏,进程每执⾏⼀次,优先数减2,并将它的进程占⽤的CPU时间加10,进程到完成还要的CPU时间减10。

3)每当⼀个进程运⾏⼀个时间⽚后,系统根据它的CPUTIME来判断它是否已经结束,若CPUTIME>0,那么将它重新排⼊就绪队列。

4)如果系统中尚有进程没有运⾏完毕,那么转⼊2)。

B:循环时间⽚轮转算法1)系统初始化时给每⼀个进程赋以⼀个NEEDTIME,并将所有进程按进⼊的次序排成⼀个队列。

2)取队头进程,并投⼊运⾏。

3)采⽤相对固定时间⽚(ROUND),进程每执⾏⼀次,进程占⽤的CPU时间加ROUND,进程到完成还要的CPU时间减ROUND。

并排到就绪队列的尾部。

4)如果当前进程的NEEDTIME>0,那么将它排到队尾。

5)如果尚有进程在队列中,那么转⼊2)3.编程语⾔、主要数据结构和意义使⽤VC6.0语⾔PCB结构:name 进程名pri /round 进程优先数/进程轮转时间⽚cputime 进程占⽤的CPU时间needtime 进程到完成还要的时间state 进程状态(假设状态为 Ready、Run、Finish)next 链指针void showlist(link,char*,int);//显⽰进程队列void instlist(link,link);//按优先数插⼊进程void appenlist(link,link);//按就绪先后加⼊进程link gethead(link);//取队⾸进程4.流程图(优先数算法)5. 源程序(含主要注释)#include "stdlib.h"#include "iostream.h"#include "string.h"const int MAX= 5;const int ROUND=2;const char *ITOA[10]={"0","1","2","3","4","5","6","7","8","9"}; typedef enum flag{Ready,Run,Finish}; struct pcb{public:char name[10];//进程名int pri; //进程优数int round; //进程轮转时间⽚int cputime; //进程占⽤的CPU时间int needtime; //进程到完成还要的CPU时间flag state; //进程状态struct pcb *next;//链指针};typedef struct pcb plist;{void showlist(link,char*,int);//显⽰进程队列void instlist(link,link);//按优先数插⼊进程void appenlist(link,link);//按就绪先后加⼊进程link gethead(link);//取队⾸进程int num=MAX+1;char str[10];link ptr,head1,head2;int i;int j=0;head1=new plist;head1->next=NULL;//就绪队⾸指针head2=new plist;head2->next=NULL;//完成队⾸指针while ((num>MAX)||(num<1)){// printf("请输⼊演⽰进程数\n");cout<<"请输⼊演⽰进程数:";// scanf("%d",&num);cin>>num;if (num>MAX) cout<<"输⼊的演⽰进程数太⼤!请输⼊⼩于等于5的数。

山东大学软件工程OS实验3实验报告

山东大学软件工程OS实验3实验报告

实验三进程调度算法实验姓名:班级:学号:1.1实验目的加深对进程调度概念的理解,体验进程调度机制的功能,了解 Linux 系统中进程调度策略的使用方法。

练习进程调度算法的编程和调试技术。

1.2试验环境:linux系统1.3实验步骤(1)在新建文件夹中建立以下名为 psched.c的C语言程序/** Filename : psched.c 独立实验*/#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <sched.h>#include <sys/time.h>#include <sys/resource.h>//进程处理信号SIGTSTP的方法,将优先级减1void handler1(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)-1);}//进程处理信号SIGTNT的方法,将优先级加1void handler2(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)+1);}int main(int argc, char *argv[]){int pid; //存放进程号struct sched_param p; //设置调度策略时使用的数据结构//父进程循环报告其优先数和调度策略if((pid=fork()) >0){signal(SIGTSTP,handler1);//注册处理ctrl+z的信号量signal(SIGINT,handler2);//注册处理ctrl+c的信号量setpriority(PRIO_PROCESS,pid,10);// 设置子进程优先数setpriority(PRIO_PROCESS,getpid(),10);// 设置父进程优先数sleep(1);//不断循环输出各自进程号、优先数和调度策略while(1) {printf("Parent PID = %d priority = %d policy is %d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getp id()));sleep(3);}}//子进程循环报告其优先数和调度策略else{signal(SIGTSTP,handler1);//注册处理ctrl+z的信号量signal(SIGINT,handler2);//注册处理ctrl+c的信号量//不断循环输出各自进程号、优先数和调度策略while(1){printf("Child PID = %d priority = %d policy is %d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(pid) );sleep(3);}exit( EXIT_SUCCESS);}return EXIT_SUCCESS;}(3)再建立程序的Makeflie文件:srcs = psched.cobjs = psched.oopts = -g -call: pschedpsched: $(objs)gcc $(objs) -o pschedpsched.o: $(srcs)gcc $(opts) $(srcs)clean:rm psched *.o(4)使用make命令编译连接生成可执行文件psched:$ gmakegcc -g -c psched.cg c c psched.o -o psched(5)改变到 root 用户$ su口令:123#(5)运行psched:# ./psched1.4实验体会(1)错误的尝试:由于自己对于C语言的了解不足,有思路但却无法实现代码。

操作系统进程调度实验报告

操作系统进程调度实验报告

操作系统进程调度实验报告操作系统进程调度实验报告引言:操作系统是计算机系统中的核心软件之一,负责管理计算机的硬件资源并提供用户与计算机硬件之间的接口。

进程调度作为操作系统的重要功能之一,负责决定哪个进程可以获得处理器的使用权,以及进程如何在处理器上运行。

本实验旨在通过设计和实现一个简单的进程调度算法,加深对操作系统进程调度原理的理解。

一、实验目的本实验的主要目的是通过编写代码模拟操作系统的进程调度过程,掌握进程调度算法的实现方法,深入理解不同调度算法的特点和适用场景。

二、实验环境本实验使用C语言进行编程实现,可在Linux或Windows系统下进行。

三、实验内容1. 进程调度算法的选择在本实验中,我们选择了最简单的先来先服务(FCFS)调度算法作为实现对象。

FCFS算法按照进程到达的先后顺序进行调度,即先到先服务。

这种调度算法的优点是简单易实现,但缺点是无法适应不同进程的执行时间差异,可能导致长作业效应。

2. 进程调度的数据结构在实现进程调度算法时,我们需要定义进程的数据结构。

一个进程通常包含进程ID、到达时间、执行时间等信息。

我们可以使用结构体来表示一个进程,例如:```struct Process {int pid; // 进程IDint arrival_time; // 到达时间int burst_time; // 执行时间};```3. 进程调度算法的实现在FCFS调度算法中,我们需要按照进程到达的先后顺序进行调度。

具体实现时,可以使用一个队列来保存待调度的进程,并按照到达时间的先后顺序将进程入队。

然后,按照队列中的顺序依次执行进程,直到所有进程执行完毕。

4. 实验结果分析通过实现FCFS调度算法,我们可以观察到进程调度的过程和结果。

可以通过输出每个进程的执行顺序、等待时间和周转时间等指标来分析调度算法的效果。

通过比较不同调度算法的指标,可以得出不同算法的优缺点。

四、实验步骤1. 定义进程的数据结构,包括进程ID、到达时间和执行时间等信息。

进程调度算法 实验报告

进程调度算法 实验报告

进程调度算法实验报告实验目的:本实验的主要目的是为了通过实践来理解进程调度算法,学习模拟进程调度算法的过程,增强对进程调度的理解。

实验内容:本实验分为两部分,第一部分是了解不同的进程调度算法,第二部分是使用模拟的方式来实现进程调度。

第一部分:本部分要求学生了解常用的几种进程调度算法,包括以下几种:1、先来先服务算法(FCFS)FCFS就是按照队列的先来先服务原则来选择执行的进程。

当一个进程退出CPU之后,下一个处在等待队列最前面的进程会被执行。

2、短作业优先算法(SJF)SJF是通过判断正在等待CPU的进程所需要的执行时间来进行排序,按照需要执行时间最短的进程先执行,以此提高CPU的利用率和系统的运行效率。

3、优先级调度算法优先级调度算法是指根据进程的优先级选择下一个要执行的进程。

通常情况下,每个进程都被赋予一个优先级,优先级高的进程得到CPU时间的概率也就更大。

在实现上,根据优先级来进行排序以选择下一个要执行的进程。

4、时间片轮转算法(RR)时间片轮转算法是指每个进程被分配一定时间片,一旦该时间片用完了,进程就被放弃执行,会被放到等待队列最后面,选择下一个要执行的进程。

该算法主要用于CPU分时系统中,可以在不同进程之间切换,实现多任务。

本部分要求学生使用模拟的方式来实现进程调度。

具体步骤如下:1、编写程序代码通过编写程序模拟进程调度算法,根据不同的算法来实现进程的调度。

在程序运行过程中,要能够动态展示当前进程的执行情况,包括当前进程执行的时间、当前队列中的进程等信息。

2、测试功能通过测试程序的功能来掌握进程调度算法的应用和实现过程。

要能够通过模拟的方式来测试不同算法下的CPU利用率、平均等待时间和响应时间等指标。

优化算法是指不断调整和改进算法,提高调度程序的效率和性能,进一步提高系统的可靠性和稳定性。

优化算法主要包括调整时间片大小、优化队列中进程的排序方式等措施。

实验结果:通过本次实验,我们了解了不同的进程调度算法,并掌握了通过模拟进行进程调度的方法。

操作系统实验报告-进程调度实验

操作系统实验报告-进程调度实验

进程调度实验一.实验目的及要求:进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

二 . 实验环境:操作系统:Windows XP编译环境:Visual C++ 6.0三.算法描述进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止。

四. 实验步骤:1.、进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。

对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间。

2、程序源码结构:struct pcb { /* 定义进程控制块PCB */char name[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;sort(){…} /* 建立对进程进行优先级排列函数*/ check(){…} /* 建立进程查看函数*/input(){…} /* 建立进程控制块函数*/main() /*主函数*/{...input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf("\n The execute number:%d \n",h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n resume......");ch=getchar();}printf("\n\n finished.\n");ch=getchar();}3.、实验截图:简单轮转法4、实验结果的分析及说明在操作系统中,由于进程总数多于处理机,它们必然竞争处理机。

操作系统实验进程调度

操作系统实验进程调度

实验三进程调度一. 实验目的加深理解并模拟实现进程(作业)调度算法。

1)熟悉常用的进程调度算法, 如FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识, 选择三种进程调度算法予以实现。

二. 实验属性该实验为设计性实验。

三. 实验仪器设备及器材普通PC386以上微机四. 实验要求本实验要求2学时完成。

1)本实验要求完成如下任务:2)编程实现单处理机系统中的进程调度, 要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;3)最后编写主函数对所做工作进行测试。

实验前应复习实验中所涉及的理论知识和算法, 针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。

实验后认真书写符合规范格式的实验报告(参见附录A), 并要求用正规的实验报告纸和封面装订整齐, 按时上交。

五: 实验具体设计此程序模拟了两种调度算法, FCFS和SPF, 首先FCFS就是按照进程的创建顺序依次顺序进行, 流程图为:进程顺序执行SPF:每次都进行循环, 选出在该时间刻运行时间最短的进程优先执行。

1.程序代码具体详解:2.创建一结构体作为进程控制器typedef struct PCB{int ID;char state;int arrivetime;int starttime;int finishtime;int servicetime;struct PCB *next;}pcb;定义全局变量作为计时器int time;//计时器创建进程链表:从txt文件中读取数据, 构造一条不含头结点的单链表void Create_process(){ifstream inFile;inFile.open("test.txt");inFile>>n;inFile.get();int i=0;for (;i<n;i++){p=(pcb *)malloc(sizeof(pcb));inFile>>p->ID;inFile>>p->arrivetime;inFile>>p->servicetime;p->starttime=0;p->finishtime=0;p->state='F';p->next=NULL;if(head==NULL){head=p;q=p;time=p->arrivetime;}if(p->arrivetime < time)time=p->arrivetime;q->next=p;q=p;}若执行FCFS算法, 按顺序遍历链表void fcfs1(){int i;p=head;for(i=0;i<n;i++){if(p->state=='F')q=p;run_fcfs1(q);}p=p->next;}}void run_fcfs1(pcb *p1){time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间: %d,开始运行作业%d\n",time,p1->ID);time+=p1->servicetime;p1->state='T';p1->finishtime=time;printf("ID号到达时间开始运行时间服务时间完成时间\n");printf("%d%10d%12d%12d%12d\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p 1->finishtime);}若执行SPF算法, 每次都从链表头开始遍历链表, 找出arrivetime<=time并且运行时间最短的节点, 执行该节点进程, 最后再删除该节点。

山大操作系统实验3

山大操作系统实验3

进程调度算法实验张咪软件四班一、实验要求设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策略。

进程初始调度策略均为系统默认策略和默认优先级。

当某个进程收到SIGINT信号时会自动将其优先数加1,收到SIGTSTP信号时会自动将其优先数减1。

请编程实现以上功能。

二、实验目的加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux系统中进程调度策略的使用方法。

练习进程调度算法的编程和调试技术。

三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g++。

四、实验思路建立一个父进程和一个子进程,用signal系统调用,父进程收到ctrl+c的SIGINT信号时,执行优先级加一的函数,子进程收到ctrl+z的SIGSTP信号时,执行优先级减1的函数,我认为这样能更好的加深对进程调度概念的理解。

当按下Ctrl+Z时,子进程做出响应,其优先级减1;当按下Ctrl+C时,父进程做出响应,父进程优先级加1.然后再输出各自进程号、优先数和调度策略。

通过for()语句循环,执行十次后退出进程。

五、实验过程新建一个文件夹,在该文件夹中建立以下名为psched.c的C语言程序。

编写代码,保存。

输入gcc psched.c命令, 生成默认的可执行文件a.out。

执行a.out:。

执行并调试psched程序。

六、调试及实验结果1、一开始对于父(子)进程获得ctrl+c(ctrl+z)信号后的处理只有一句signal(SIGINT,(sighandler_t)ctrlc)或signal(SIGTSTP,(sighandler_t)ctrlz),认为不用声明对于ctrl+z(ctrl+c)的反应父(子)进程就不会对SIGTSTP(SIGINT)信号做处理,然而进程执行结果一次ctrl+c后就退出了。

要想实现:父进程获得Ctrl+C信号后进程优先号加一,对Ctrl+Z信号不作处理;子进程获得Ctrl+Z信号后进程优先号减一,对Ctrl+C信号不作处理。

山东大学操作系统试验-3

山东大学操作系统试验-3

软件学院实验报告实验题目:进程调度算法实验学号:20100030xxxx日期:2012-5-2班级:五班姓名:Email:实验目的:加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程调度策略的使用方法。

练习进程调度算法的编程和调试技术。

硬件环境:IBM实验室计算机软件环境:eclipse gcc编译器Ubuntu-Linux操作系统Gnome桌面实验步骤:1.认真阅读试验指导书所给出的相关知识与示例程序,在此基础上分析独立试验要求,然后着手开始编写程序。

2.用eclipse新建一个c project。

3.新建source folder4.新建名为psched.c的C语言程序5.再建立以下名为psched.h的C语言头文件6.build项目,产生可运行的二进制文件。

7.对程序进行调试,排除bug。

8.进入终端,运行程序,结果如下图所示:源代码:#include"psched.h"int main(int argc,char*argv[]){int pid;//存放⼦进程号struct sched_param p1;//设置⼦进程调度策略时使⽤的数据结构struct sched_param p2;//设置⽗进程调度策略时使⽤的数据结构if((pid=fork())<0){perror("process not create");exit(EXIT_FAILURE);}else if(pid==0){signal(SIGTSTP,handler1);//注册⼀个处理ctrl+z的信号量,将优先级减⼀signal(SIGINT,handler3);//注册⼀个处理ctrl+c的信号量,什么也不做sleep(1);while(1){printf("Child PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}else{signal(SIGINT,handler2);//注册⼀个处理ctrl+c的信号量,将优先级加⼀signal(SIGTSTP,handler4);//注册⼀个处理ctrl+z的信号量,什么也不做sched_setscheduler(pid,SCHED_OTHER,&p1);sched_setscheduler(getpid(),SCHED_OTHER,&p2);setpriority(PRIO_PROCESS,pid,10);setpriority(PRIO_PROCESS,getpid(),10);sleep(1);while(1){printf("Parent PID=%d priority=%d policy is%d\n",getpid(),getpriority(PRIO_PROCESS,0),sched_getscheduler(getpid()));sleep(3);}}return EXIT_SUCCESS;}#include<stdio.h>#include<stdlib.h>#include<sched.h>#include<sys/time.h>#include<sys/resource.h>#include<unistd.h>#include<signal.h>//⼦进程处理信号SIGTSTP的⽅法,将优先级减⼀void handler1(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)-1); }//⽗进程处理信号SIGINT的⽅法,将优先级加⼀void handler2(){setpriority(PRIO_PROCESS,getpid(),getpriority(PRIO_PROCESS,0)+1);}void handler3(){}void handler4(){}结论分析与体会:通过编写进程调度试验,首先,我更加熟练了如何编写多进程程序,更加了解了型号量的注册和使用方法。

山东大学操作系统实验三实验报告

山东大学操作系统实验三实验报告

软件学院实验报告:3实验题目:信号量同步问题班级:2011级3班日期:2013-11-10 学号:201100300038 姓名:陶旭涛E-mail:1595242630@实验目的:1.在本次实验中,通过使用信号量,在原有的程序框架的基础上添加关键代码实现生产者/消费者同步问题。

2.深入理解Nachos的信号量的使用以及实现.3.理解生产者/消费者问题是如何用信号量实现的以及在Nachos中是如何创建线程,实现多线程。

硬件环境:Ubuntu12.04软件环境:Nachos,Mips,GDB实验步骤:1.首先初始化三个信号量,代码如下:mutex = new Semaphore("mutux",1);信号量初始化为1,才能起到加锁功能nfull = new Semaphore("full",0);nfull的大小在生产者没生产前为0 nempty = new Semaphore("empty",BUFF_SIZE);nempty的大小应该为buffer的大小2.首先考虑生产者进程,首先要查看buffer是否有空, nempty->P();if nempty>0,nempty=nempty -1,当对缓冲区操作时必须要加锁:mutex->P();加锁. 然后向ring中放入message信息,其次还要解锁mutex->V();解锁.最后通知消费者buffer有新信息, nfull->V();nfull=nfull+1;具体实现代码如下:3.考虑消费者进程,像生产者进程一样,查看buffer中是否有信息nfull->P();if nfull>0,nfull-1;取消息时也要上锁,即:mutex->P();加锁. 然后从ring buffer中取出信息;其次mutex->V();解锁;最后通知生产者bufferr有空nempty->V();nempty=nempty+1,具体代码如下:4.创建线程生成一个生产者的代码:producers[i] = new Thread(prod_names[i]);producers[i] -> Fork(Producer,i);4.创建线程生成一个消费者的代码:producers[i] = new Thread(prod_names[i]);producers[i] -> Fork(Producer,i);关键代码:voidProducer(_int which){int num;slot *message = new slot(0,0);for (num = 0; num < N_MESSG ; num++) { //这是消息创建的代码m essage->thread_id=which;message->value=num;//p,v 操作nempty->P();mutex->P();ring->Put(message);//p,v 操作mutex->V();nfull->V();}}voidConsumer(_int which){char str[MAXLEN];char fname[LINELEN];int fd;slot *message = new slot(0,0);sprintf(fname, "tmp_%d", which);// create a file. Note that this is a UNIX system call.if ( (fd = creat(fname, 0600) ) == -1){perror("creat: file create failed");Exit(1);}for (; ; ) {// p,v,操作n full->P();m utex->P();ring->Get(message);// p,v,操作mutex->V();nempty->V();// form a string to record the messagesprintf(str,"producer id --> %d; Message number --> %d;\n", message->thread_id,message->value);//把信息写入文件if ( write(fd, str, strlen(str)) == -1 ) {perror("write: write failed");Exit(1);}}}//---------------------------------------------------------------------- // ProdCons// 初始化信号量以及需要的生产者消费者线程//----------------------------------------------------------------------voidProdCons(){int i;DEBUG('t', "Entering ProdCons");// 初始化信号量,包括一个访问互斥信号量,初值为1;//一个nempty信号量,初值为缓冲区的大小//一个nfull的信号量,初值为0mutex=new Semaphore("mutex",1);nempty=new Semaphore("nempty",BUFF_SIZE);nfull=new Semaphore("nfull",0);// 新建一个缓冲区ring=new Ring(BUFF_SIZE+1);// create and fork N_PROD of producer threadsfor (i=0; i < N_PROD; i++){// this statemet is to form a string to be used as the name for// produder i.sprintf(prod_names[i], "producer_%d", i);// 创建生产者线程producers[i]=new Thread(prod_names[i]);producers[i]->Fork(Producer,i);};// create and fork N_CONS of consumer threadsfor (i=0; i < N_CONS; i++){// this statemet is to form a string to be used as the name for// consumer i.sprintf(cons_names[i], "consumer_%d", i);//创建消费者线程consumers[i]=new Thread(cons_names[i]);consumers[i]->Fork(Consumer,i);};}调试记录:在源代码中exit(0)没有大写,调试过程发现了这个问题改正,在使用Linux系统调用写入文件时,有一个头文件没有引入,因而需要修改#include <stdio.h>#include "copyright.h"#include "system.h"#include <unistd.h>#include <fcntl.h>而且对于新添加的头文件的方法其中源文件使用的一个方法是废弃的,所以改成相应的方法write(fd, str, strlen(str)),实验结果:生成两个文件分别代表两个消费者取得的产品的记录。

山东大学操作系统试验报告

山东大学操作系统试验报告

计算机科学与技术学院操作系统实验报告学院:专业:班级:姓名:学号:日期:Email:目录实验一进程控制实验 (4)1.1实验目的 (4)1.2实验题目 (4)1.3实验步骤 (4)1.4结论分析与体会 (5)1.5附录:本实验全部程序源代码及注释 (5)1.5.1Pctl.c (5)1.5.2pctl.h (9)1.5.3makefile (10)实验三进程调度算法实验 (10)3.1实验目的 (10)3.2实验题目 (11)3.3实验步骤 (11)3.4结论分析与体会 (12)3.5附录:本实验全部程序源代码及注释 (12)3.5.1Psched.c (12)3.5.2Psched.h (14)3.5.3Makefile (16)实验四进程同步实验 (16)4.1实验目的 (16)4.2实验题目 (16)4.3实验步骤 (17)4.4结论分析与体会 (24)4.5附录:本实验全部程序源代码及注释 (24)4.5.1Ipc.c (24)4.5.2Ipc.h (32)4.5.3Consumer (35)4.5.4Producer (41)4.5.5makefile (50)实验七内存页面置换算法实验 (51)7.1实验目的 (51)7.2实验题目 (51)7.3实验步骤 (52)7.4附录:本实验全部程序源代码及注释 (55)7.4.1Vmrp.h (55) (57)7.5.3makefile (73)实验八磁盘移臂调度算法实验 (74)7.2实验目的 (74)8.2实验题目 (74)8.3实验步骤 (75)8.4附录:本实验全部程序源代码及注释 (76)8.4.1Dask.h (76) (78)8.4.3Makefile (94)实验一进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

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

计算机科学与技术学院实验报告
3) 输入make命令编译连接生成可执行的
psched程序$gmake
gcc -g -c experime nt3.c
gcc psched.o -o psched
4)
执行psched程序
分析:
根据以上示例程序和独立实验程序中观察和记录的信息,说明它们反映出操作系统教材中讲解的哪些进程调度调度策略和功能?在真实的操作系统中它是怎样实现教材中讲解的进程调度效果的。

先进先出算法
算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。

最高优先权(FPF)优先调度算法
该算法总是把处理机分配给就绪队列中具有最高优先权的进程。

常用以下两种方法来确定进程的优先权:
轮转法
前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。

体会:
1. 实验中定义的函数一定要考虑好函数的参数问题,这样才不会出现一些不必要的错误;
2. 对于一些要忽略的信号要忽略掉,免得影响后面的响应过程。

相关文档
最新文档