1、实验二 处理机调度 实时调度算法 EDF和 RMS 实验目的 实验内容 实验准备 实验设计 参考代码 实验结果 思考题实验目的 深入理解处理机调度算法,了解硬实时概念,掌握周期性实时任务调度算法EDF(Earliest Deadline First)和 RMS(Rate Monotonic Scheduling)的可调度条件,并能在可调度情况下给出具体调度结果。实验内容 在 Linux环境中采用用户级线程模拟实现EDF和 RMS两种实时调度算法。给定一组实时任务,按照 EDF算法和 RMS算法分别判断是否可调度,在可调度的情况下,创建一组用户级线程,分别代表各个实时任务,并按算法确定的调度次序
2、安排各个线程运行,运行时在终端上画出其 Gantt图。为避免图形绘制冲淡算法, Gantt图可用字符表示。 实验准备 EDF算法和 RMS算法的可调度条件及调度原则。 在 Linux环境中创建用户级线程的函数。EDF算法和 RMS算法的可调度条件及调度原则 EDF为可抢先式调度算法,其调度条件为 sum(Ci/Ti)1; RMS算法为不可抢先调度算法,其调度条件为sum(Ci/Ti)n(exp(ln(2)/n)-1)。在 Linux环境中创建用户级线程的函数 创建用户级线程的库函数为: int pthread_create (pthread_t *THREAD, pthread_attr_t
3、* ATTR, void * (*START_ROUTINE) (void *), void * ARG) pthread_create(tid,NULL,func,arg); 其中第一个参数是 pthread_t型的指针,用于保存线程 id;第二个参数是 pthread_attr_t的指针,用于说明要创建的线程的属性, NULL表示使用缺省属性;第三个参数指明了线程的入口,是一个只有一个 (void *)参数的函数;第四个参数是传给线程入口函数的参数。 实验设计 实时任务用 task数据结构描述,设计四个函数:select_proc()用于实现调度算法,被选中任务执行 proc(),在没有可
4、执行任务时执行 idle(),主函数 mian()初始化相关数据,创建实时任务并对任务进行调度。 为模拟调度算法,给每个线程设置一个等待锁,暂不运行的任务等待在相应的锁变量上。主线程按调度算法唤醒一个子线程,被选中线程执行一个时间单位,然后将控制权交给主线程判断是否需要重新调度。 参考代码#include “math.h“#include “sched.h“#include “pthread.h“#include “stdlib.h“#include “semaphore.h“ typedef struct /实时任务描述char task_id;int call_num; /任务发生次数in
5、t ci; / Ciint ti; /Ti int ci_left;int ti_left; int flag; /任务是否活跃, 0否, 2是int arg; /参数pthread_t th; /任务对应线程task;void proc(int* args);void* idle();int select_proc();int task_num = 0;int idle_num = 0;int alg; /所选算法, 1 for EDF, 2 for RMSint curr_proc=-1;int demo_time = 100; /演示时间task* tasks;pthread_mutex
6、_t proc_wait100;pthread_mutex_t main_wait, idle_wait;float sum=0;pthread_t idle_proc;int main(int argc,char* argv) pthread_mutex_init(pthread_mutex_lock( /下次执行 lock等待pthread_mutex_init(pthread_mutex_lock( /下次执行 lock等待printf(“Please input number of real time tasks:n“);scanf(“%d“,tasks = (task*)malloc(task_num*sizeof(task);int i;for(i=0;itask_num;i+)pthread_mutex_init(pthread_mutex_lock(for(i=0;itask_num;i+)