用c语言实现时间片轮转调度算法
实验二带优先级的时间片轮换的进程调度算法的实现

•
struct pcb *p;
•
for (i=0;i<MAXPIOR;i++)
•
{p=array[i];
•
while (p!=NULL)
•
{printf("id:%d,state:%d,pior:%d,life:%d\n",p->ident,p->state,p->pior,p->life);
•
p=p->next;
• {int i=0,ii=0;
• for (i=0;i<7;i++)
•
if (stricmp(str,command[i])==0)
•
break;
• switch(i)
•
{case 0:printf("thank you for using the program!\n");exit(0);
•
break;
•{
•
int i=MAXPIOR-1,pior=0,t;
•
struct pcb *pp,*qq,*pr,*r;
•
do
•
{
•
while (i>=0 && array[i]==NUf (i<0)
•
{
•
printf("NO process,please create it! \n");
第1个,再降低其优先级,插入到相应的队列中。 C)ps 查看当前进程状态 D)sleep 命令将进程挂起 E)awake 命令唤醒1个被挂起的进程 F)kill 命令杀死进程 G)quit命令退出 (4)选用面向对象的编程方法。
操作系统进程调度C语言代码

操作系统进程调度C语言代码操作系统是计算机系统中的重要组成部分,用于管理和控制计算机资源的分配和使用。
在操作系统中,进程调度是指将系统资源(如 CPU、内存、磁盘、网络等)分配给运行中的进程的过程。
进程调度是操作系统实现多任务、多用户和分时系统的关键。
进程调度的算法有多种。
最常见的是时间片轮转算法、优先级调度算法、最短进程优先算法和先到先服务算法等。
下面我们将介绍一下时间片轮转算法的 C 语言代码实现。
1. 时间片轮转算法时间片轮转算法是一种基于时间片的调度算法,它给每个进程分配一个时间片,当时间片用完后,系统将进程暂停,并将 CPU 分配给下一个进程。
时间片轮转算法可以让所有进程公平地使用 CPU 时间,并且可以避免进程饥饿的情况发生。
2. C 语言代码实现在 C 语言中,可以用结构体来表示一个进程,包括进程 ID、进程状态、优先级、到达时间和需要运行的时间片等属性。
下面是一个简单的进程结构体的定义:```struct Process processes[5];在实现时间片轮转算法之前,需要先实现一个进程调度函数,它的作用是找到就绪进程中优先级最高的进程,并返回它的位置。
下面是一个简单的进程调度函数:```int find_highest_priority_process(struct Process *processes, int n) {int highest_priority = -1;int highest_priority_index = -1;for (int i = 0; i < n; i++) {if (processes[i].state != 2 && processes[i].priority >highest_priority) {highest_priority = processes[i].priority;highest_priority_index = i;}}return highest_priority_index;}```在实现时间片轮转算法之前,需要先定义一些全局变量,包括就绪队列、当前时间、时间片大小和进程数量等。
时间片轮转调度算法实验

时间片轮转调度算法实验时间片轮转调度算法是一种广泛应用于计算机操作系统中的调度算法。
本文将介绍时间片轮转调度算法的基本原理、特点以及实验过程。
一、时间片轮转调度算法的基本原理时间片轮转调度算法是一种基于时间片的调度算法,它将CPU时间分配给多个进程,每个进程都被赋予一个时间片,当时间片用完后,该进程将被挂起,CPU时间将被分配给下一个进程。
被挂起的进程将被放入一个就绪队列中,等待下一轮时间片到来。
二、时间片轮转调度算法的特点1.公平性:时间片轮转调度算法可以保证每个进程都能够得到一定的CPU时间,从而保证了公平性。
2.响应时间快:时间片轮转调度算法可以保证进程的响应时间快,因为每个进程都会被分配一定的CPU时间。
3.适用性广:时间片轮转调度算法适用于多种场景,包括多用户、多任务、实时任务等。
4.实现简单:时间片轮转调度算法的实现比较简单,可以通过一个就绪队列和一个定时器来实现。
三、时间片轮转调度算法的实验过程1.实验环境:本次实验使用了Linux操作系统,编程语言为C++。
2.实验步骤:(1)创建进程:首先需要创建多个进程,并将它们放入就绪队列中。
(2)分配时间片:为了模拟时间片轮转调度算法,需要为每个进程分配一个时间片。
(3)执行进程:按照就绪队列中的顺序,依次执行每个进程,并在执行完一个时间片后,将进程放回就绪队列中。
(4)更新进程状态:根据进程的执行情况,更新进程的状态,包括运行中、就绪、阻塞等。
(5)输出结果:最后,输出每个进程的执行结果,包括进程的状态、执行时间等。
3.实验结果:经过实验,我们发现时间片轮转调度算法可以保证每个进程都能够得到一定的CPU时间,并且响应时间较快。
同时,我们也发现时间片的大小会对进程的执行时间和响应时间产生影响。
如果时间片过小,会导致进程频繁切换,从而降低CPU的利用率;如果时间片过大,会导致进程响应时间过长,影响用户体验。
四、总结时间片轮转调度算法是一种广泛应用于计算机操作系统中的调度算法,具有公平性、响应时间快、适用性广、实现简单等特点。
时间片轮转调度算法实验

时间片轮转调度算法实验时间片轮转调度算法是一种基于时间片轮转的进程调度算法,它按照轮转的方式,将每个进程分配一个时间片,如果该进程在时间片结束前未完成其任务,则该进程将被挂起,然后下一个进程继续执行。
下面将从实验过程、结果分析和算法优缺点三个方面回答该问题。
实验过程:本次实验使用C语言编写程序,模拟了一个简单的时间片轮转调度算法。
实验环境为Windows 10操作系统,使用了Dev-C++ 5.11编译器。
实验流程如下:1.首先定义了一个进程的结构体,其中包括了进程的名称、进程需要执行的时间片以及已经执行的时间片。
2.定义一个队列来存储进程,为了方便起见,队列采用了循环存储结构。
3.在主函数中,首先输入需要执行的进程数和一个时间片长度,接着依次输入每个进程的名称和需要执行的时间。
程序会根据输入的信息初始化进程,并将进程加入队列。
4.最后,程序开始模拟调度器的调度过程。
每次从队列中取出一个进程,将其执行时间减去一个时间片。
如果执行时间为0,则代表该进程已经完成任务,将其移出队列。
如果执行时间大于0,则将该进程重新加入队列尾部,然后下一个进程开始执行。
结果分析:在进行实验的过程中,我们发现时间片轮转调度算法可以很好地实现多进程的调度。
通过不断地轮转时间片,每个进程都有机会被执行。
此外,该算法具有良好的响应时间和公平性,能够确保每个进程都能够在一定时间内执行一定的任务,从而提高了系统的利用率和效率。
算法优缺点:时间片轮转调度算法具有以下几个优点:1. 公平性:每个进程都能够在一定时间内获得相同的可执行时间。
2. 可控性:时间片长度可以根据需要自行改变。
3. 高效性:可以很好地支持多进程的调度,提高了系统的利用率和效率。
同时,该算法也存在一些缺点:1.时间片的长度可能对进程的执行效率产生影响,长度过长会导致进程轮转过于缓慢,降低了系统的响应速度,长度过短则会增加进程上下文切换的次数。
2. 由于算法本身的局限性,它可能无法解决一些与进程先后顺序等有关的问题,例如死锁或者资源争用等。
用C语言模拟Linux操作系统下处理机调度实验报告

实验二:处理机调度一、实验目的:1、了解Linux下Emacs编辑器的使用方法,掌握各种常用的键盘操作命令;2、理解并掌握处理机调度算法。
二、实验内容及要求:在采用多道系统的设计程序中,往往有若干进程同时处于就绪状态。
当就绪状态进程数大于处理机数时,就必须按照某种策略来决定哪些进程优先占用处理机。
本实验模拟在单处理机情况下处理机调度。
1、优先调度算法实现处理机的调度:设计思路:1每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识、指针(按优先数的大小把进程连成队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针为"0"、要求运行时间、优先数、状态(就绪、结束;2每次运行处理机调度程序前,为每个进程确定它的"优先数"和"要求运行时间";3把给定的进程按优先数的大小连成队列,用一单元指出队首进程;4每模拟执行一次进程,优先数减一,要求运行时间减一;5如果要求运行的时间>=0,再将它加入队列(按优先数的大小插入,重置队首标志);如果要求运行的时间=0,那么把它的状态修改为结束,且推出队列;6若就绪队列不为空,重复上述,直到所有的进程都结束;7程序有显示和打印语句,每次运行后显示变化。
2、按时间片轮转法实现处理机调度:设计思路:1每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识、指针(把进程连成循环队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址、已运行时间、状态(就绪、结束;2每次运行处理机调度程序前,为每个进程确定它的"要求运行时间";3用指针把给定的进程按顺序排成循环队列,用另一标志单元记录轮到的进程;4每模拟运行一次进程,已运行时间加一;5进程运行一次后,把该进程控制块的指针值送到标志单元,以指示下一个轮到的进程。
操作系统实验时间片轮转

学号P7******* 专业计算机科学与技术姓名陈帅实验日期2017.11.2 教师签字成绩实验报告【实验名称】轮转调度算法【实验目的】1、掌握轮转调度算法。
2、进一步认识如何实现处理器调度。
3、通过对进程调度算法的设计,深入理解进程调度的原理【实验原理】时间片轮转调度算法思想用C语言编程实现,数据结构为队列。
进程等待时间=进程开始运行时间-进程到达时间(即进程处于就绪态时间);进程周转时间=进程结束时间-进程到达时间;加权进程周转时间 = 进程周转时间/进程服务时间;系统平均周转时间=进程周转时间之和/进程数;系统平均带权周转时间=进程带权周转时间之和/进程数。
在分时系统中,最常用的是基于时间片的轮转算法调度算法。
该算法采用了非常公平的处理机分配方式,即让就绪队列上的每个进程每次运行一个时间片。
通过分配时间片的方式让进程获得处理机,若一个时间片未用完,正在运行的程序就已经完成,便将其从就绪队列删除,再调用队首进程,并分配时间片;在一个时间片未用完时,中断程序就会启动,将进程送至就绪队列的尾部。
【数据结构和符号说明】数据结构:struct PCD //定义结构体{char name;//进程名int a_time;//到达时间int s_time;//服务时间int s_time2;int f_time;//完成时间float t_time;//周转时间float wt_time;//带权周转时间int state;//当前进程的状态};符号和函数说明int Currenttime=0;//当前时间PCD s[5];//设置为5个进程queue<PCD> q;//进程队列int turnover(PCD &n)//求周转时间float wturnover(PCD &n)//求带权周转时间程序流程图:程序:#include<iostream>#include<queue>#define MAX 100using namespace std;struct PCD //定义结构体{char name;//进程名int a_time;//到达时间int s_time;//服务时间int s_time2;int f_time;//完成时间float t_time;//周转时间float wt_time;//带权周转时间int state;//当前进程的状态};int Currenttime=0;int turnover(PCD &n)//求周转时间{return n.t_time=n.f_time-n.a_time;}float wturnover(PCD &n)//求带权周转时间{return n.wt_time=n.t_time/n.s_time;}int main(){int t;queue<PCD> q;q=queue<PCD>();PCD s[5];s[0].name='A';//初始化结构体数组s[1].name='B';s[2].name='C';s[3].name='D';s[4].name='E';cout<<"请输入五个进程的到达时间:\n";for(int i=0; i<=4; i++){cout<<s[i].name<<" 到达时间:";cin>>s[i].a_time;s[i].state=i;}cout<<"请输入五个进程的服务时间:\n";for(int i=0; i<=4; i++){cout<<s[i].name<<" 服务时间:";cin>>s[i].s_time;s[i] .s_time2=s[i].s_time;}cout<<"请输入时间片的大小:\n";cin>>t;for(int i=0; i<5-1; i++) //将ABCDE的到达时间升序排列for(int j=0; j<5-1; j++)if(s[j].a_time>s[j+1].a_time)swap(s[j],s[j+1]);q.push(s[0]);//将第一个进程入队列for(int i=1; i<5; i++) //5个都入队列{while(s[i].a_time>Currenttime+t)//当进程到达时间大于当前时间,执行队列中的进程{if(q.empty()==true) //到当前时间Currenttime++;//队列中无进程if(q.empty()!=true) //队列前面有进程 {if(q.front().s_time-t<=0){Currenttime=Currenttime+q.front().s_time;for(int j=0; j<5; j++)if(s[j].state==q.front().state)s[j].f_time= Currenttime;q.pop(); //队列中删除}else{Currenttime=Currenttime+t;q.front().s_time-=t;q.push(q.front());//队头放入队尾q.pop();}}}q.push(s[i]);if(q.front().s_time<=t) //如果有进程提前结束{Currenttime=Currenttime+q.front().s_time;//结束进程 for(int j=0; j<5; j++)if(s[j].state==q.front().state) //设置进程的序号,如果在队列中与进程控制块中匹配s[j].f_time= Currenttime; //终止时间 q.pop();}else{Currenttime=Currenttime+t; //继续执行q.front().s_time-=t;q.push(q.front()); //入队后队头放入队尾q.pop();}}while(q.empty()!=true) //所有进程全部入队 {if(q.front().s_time<=t){Currenttime=Currenttime+q.front().s_time;for(int i=0; i<5; i++)if(s[i].state==q.front().state) //去进程控制块中寻找,改变结束时间s[i].f_time= Currenttime;q.pop();}else{Currenttime=Currenttime+t;q.front().s_time-=t;q.push(q.front());q.pop();}}cout<<" "<<"到达时间 "<<"服务时间 "<<"完成时间 "<<"周转时间 "<<"带权周转时间"<<endl;for(int i=0; i<=4; i++){cout<<s[i].name<<" "<<s[i].a_time<<""<<s[i].s_time2<<" "<<s[i].f_time<<""<<turnover(s[i])<<" ";cout<<wturnover(s[i])<<endl<<endl;//cout是从后往前计算的 }double sum = 0;for(int i = 0; i<5; i++){sum+=s[i].wt_time;}cout<<"此算法平均带权周转时间为"<<sum/5<<endl;return 0;}截图及其说明:在先前定义的5个进程,取名A B C D E输入时间片大小,当时间片为1时,输出如下结果,程序正确输入时间片大小,当时间片为1时,输出如下结果,程序正确。
时间片轮转调度算法实验报告

时间片轮转调度算法实验报告一、引言时间片轮转调度算法是一种常见的操作系统调度算法,它的主要思想是将CPU时间分成若干个时间片,每个进程在一个时间片内执行一定的时间,然后切换到下一个进程执行。
本实验通过使用C语言模拟实现时间片轮转调度算法,并对其进行评估和比较,以便更好地理解该调度算法的性能和特点。
二、实验目的1.理解时间片轮转调度算法的原理和实现方式;2.实现一个简单的时间片轮转调度算法模拟程序;3.比较时间片长度对调度算法性能的影响;4.分析时间片轮转调度算法的优缺点。
三、实验过程1.设计数据结构和算法在开始实验之前,我们首先需要设计数据结构和算法。
在本实验中,我们使用一个队列来表示就绪队列,并使用一个指针来标记当前执行的进程。
2.实现时间片轮转调度算法模拟程序根据设计的数据结构和算法,我们使用C语言编写了一个简单的时间片轮转调度算法模拟程序。
程序首先会要求用户输入进程数量和每个进程的执行时间,然后根据输入的信息,使用时间片轮转调度算法对进程进行调度并统计各个进程的等待时间和周转时间。
3.进行实验和分析我们进行了多组实验,通过改变时间片的长度,观察时间片轮转调度算法的性能。
并对实验结果进行统计和分析,比较不同时间片长度下的平均等待时间和平均周转时间。
四、实验结果和分析在本节,我们将介绍实验的结果和分析。
1.实验结果我们使用不同时间片长度进行了多组实验,得到了如下的结果:时间片长度,平均等待时间,平均周转时间------------,-------------,-------------1,5,152,3,134,2,128,1,112.结果分析通过对实验结果的分析,我们可以得出以下结论:-随着时间片长度的增加,进程的平均等待时间和平均周转时间都呈现下降的趋势。
这是因为时间片越长,每个进程执行的时间就越长,进程切换的次数就越少,从而提高了系统的效率。
-当时间片长度较小时,进程的平均等待时间和平均周转时间较长。
OS实验一

否
进程时间 片数为0? 是 撤消该进程
撤消该进程
否
进程队列空?
是
否 结束 是 进程队列空?
2、时间片轮转算法说明 (1)PCB的结构(如下图所示):轮转法中,设PCB的结构如 右图所示,其中各数据项的含义如下: Id:进程标识符号,取值1—5。 Span:在某一轮中,分配给此进程的时间片数,取值1—3。 Used:现运行进程在本轮执行过程已用的时间片数。 Need:进程尚需的CPU时间数,初值表示该进程需要运行的 总时间,取值范围5—10。并随机产生,每运行一个时间片 need减1;need为0则进程结束。 Status:进程状态R(运行),W(就绪),F(完成);初始时 所有进程处于就绪状态。 Next:指向就绪队列中下一个进程的PCB的指针。
OS实验一
进程调度
1、实验目的:本次实验要求用C语言编写一个进程调度 模拟程序,使用优先级或时间片轮转法实现进程调 度。目的是理解进程调度算法及其应用。 2、实验环境:Turbo C 2.0/3.0或VC++6.0 3、实验学时: 4学时,必做实验。 4、实验内容 1)设计有5个进程并发执行的模拟调度程序,每 个程序由一个PCB表示。 2)模拟调度程序可任选两种调度算法之一实现。 3)程序执行中应能在屏幕上显示出各进程的状态 变化,以便于观察调度的整个过程。
RUN
1
HEAD
Tail
3
5
… …
2
0 …
…
RUN ----当前运行进程指针; HEAD──就绪进程队列的PCB链链首指针; TAIL──就绪进程队列的PCB链链尾指针;
… R
W
W
W
输入调度算法Alg
pritity
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用c语言实现时间片轮转调度算法
时间片轮转调度算法是一种常见的进程调度算法,其主要思想是将所有就绪进程按顺序排列,每个进程分配一个时间片,当时间片用尽后,进程被送到队列的末尾,然后下一个进程被执行。
本文将介绍如何使用C语言实现时间片轮转调度算法。
首先,我们需要定义进程控制块(PCB),包括进程的ID、状态、优先级和时间片等信息。
可以使用结构体来表示PCB,代码如下:
```
typedef struct PCB {
int pid; // 进程ID
int status; // 进程状态(就绪、运行、等待、结束) int priority; // 进程优先级
int time_slice; // 时间片
} PCB;
```
接下来,我们需要创建一个就绪队列和一个等待队列来存储所有进程。
可以使用链表来实现队列,代码如下:
```
typedef struct Node {
PCB *pcb; // PCB指针
struct Node *next; // 指向下一个节点的指针
} Node;
// 就绪队列
Node *ready_queue = NULL;
// 等待队列
Node *wait_queue = NULL;
```
然后,我们需要编写一个函数来创建进程并添加到就绪队列中。
该函数接受进程的ID、优先级和时间片作为参数,并返回一个指向新进程PCB的指针。
代码如下:
```
PCB *create_process(int pid, int priority, int time_slice) {
PCB *pcb = (PCB*)malloc(sizeof(PCB));
pcb->pid = pid;
pcb->status = 0; // 就绪状态
pcb->priority = priority;
pcb->time_slice = time_slice;
// 将新进程添加到就绪队列末尾
Node *p = (Node*)malloc(sizeof(Node));
p->pcb = pcb;
p->next = NULL;
if (ready_queue == NULL) {
ready_queue = p;
} else {
Node *q = ready_queue;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
return pcb;
}
```
接下来,我们需要编写一个函数来模拟时间片轮转调度算法。
该函数接受一个整数参数,表示每次时间片的长度。
代码如下:
```
void time_slice_scheduler(int time_slice_length) {
// 如果就绪队列为空,则返回
if (ready_queue == NULL) {
return;
}
// 取出就绪队列中的第一个进程并运行
PCB *running_process = ready_queue->pcb;
running_process->status = 1; // 运行状态
printf('process %d is running
', running_process->pid);
// 模拟运行过程,减少时间片
running_process->time_slice -= time_slice_length; // 如果进程运行结束,则将其从就绪队列中移除
if (running_process->time_slice <= 0) {
running_process->status = 3; // 结束状态
printf('process %d is finished
', running_process->pid);
Node *p = ready_queue;
ready_queue = ready_queue->next;
free(p->pcb);
free(p);
return;
}
// 如果进程未运行结束,则将其放回就绪队列末尾
running_process->status = 0; // 就绪状态
printf('process %d is waiting
', running_process->pid);
Node *p = (Node*)malloc(sizeof(Node));
p->pcb = running_process;
p->next = NULL;
if (ready_queue == NULL) {
ready_queue = p;
} else {
Node *q = ready_queue;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
```
在主函数中,我们可以调用create_process函数创建进程,并调用time_slice_scheduler函数模拟进程调度。