时间片轮转调度算法模拟
1. 实验目的
了解时间片轮转调度算法的工作原理,通过编写调度算法的程序,加深对Linux进程时间片调度的理解。
2. 实验内容
-
在Linux上编写C语言,实现从键盘输入时间片长度、任务个数、每一个任务的到达时间及服务时间;
-
构造相应的进程并按时间片轮转调度算法对所有进程进行调度,进程运行情况可以输出到终端,从而深入理解时间片轮转调度算法的原理。
2.1 程序流程图
程序中就绪队列用int型的数组表示,并用readyIndex表示下一个要插入就绪队列的位置,该数组中存放进程数组的下标,方便进程调度时进行使用。
程序中进程状态用枚举类型表示如下,其中NOT_COME表示进程还未到来,READY表示进程在就绪队列中等待,RUNNING及FINISH表示正在运行和运行结束。程序中进程块PCB结构体如下。
typedef enum PROCESS_STATE{
NOT_COME,
READY,
RUNNING,
FINISH
} PROCESS_STATE;
typedef struct{
char process_name[10];
int arrive_time;
int service_time;
int start_time;
int end_time; //已经运行的时间
int cpu_time;
PROCESS_STATE state;
} PCB;
- 程序流程图如下:
2.2 程序源码
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
typedef enum PROCESS_STATE
{
NOT_COME,
READY,
RUNNING,
FINISH
} PROCESS_STATE;
typedef struct
{
char process_name[10];
int arrive_time;
int service_time;
int start_time;
int end_time;
//已经运行的时间
int cpu_time;
PROCESS_STATE state;
} PCB;
int processs_num;
PCB *process_list;
int *ready_list;
int readyIndex = 0;
int current_time = 0;
//时间片大小
int quantum;
void SortList();
void InitList();
//判断所有进程是否运行结束
int isEnd();
//判断当前时间是否有进程到达,若有但返回index,反之返回0
int isProcessArrive();
int isProcessEnd(int index);
void MoveReadyList();
void showState();
int haveRunningProcess();
int main() {
printf("进程个数:");
scanf