目录 一.设计目的?????????????????????????????????????????????????????????????????????2 二.设计内容?????????????????????????????????????????????????????????????????????2 三.设计准备?????????????????????????????????????????????????????????????????????2 四.设计过程?????????????????????????????????????????????????????????????????????3 五.设计结果并分析??????????????????????????????????????????????????????????12 六.系统的结构,原理框图和模块等的详细说明??????????????14 七.用户使用说明书和参考资料???????????????????????????????????????15 八.设计体会????????????????????????????????????????????????????????????????????16 一.设计目的 深入理解处理机调度算法,了解硬实时概念,掌握最早截止期优先调度算法。EDF(Earliest Deadline First)和速率单调调度算法RMS(Rate Monotonic Scheduling)的可调度条件,并能在可调度情况下给出具体调度结果。 二.设计内容 在Linux环境中采用用户级线程模拟实现EDF和RMS两种实时调度算法。给定一组实时任务,按照EDF算法和RMS算法分别判断是否可调度。在可调度的情况下,创建一组用户级线程,分别代表各个实时任务,并按算法所确定的调度次序安排各个线程运行,运行时在终端上画出其Gantt图。为避免图形绘制冲淡算法,Gantt图可用字符表示。 三.设计准备(理论、技术) 算法和RMS算法的可调度条件及调度原则。 (1)EDF为可抢占式调度算法,其调度条件为: sum(ci/ti)≤1 (2)RMS算法为不可抢先调度算法,其调度条件为: sum(ci/ti)≤n(exp(in(2)/n)-1) 2.在linux环境中创建用户级线程的函数。 (1)创建用户级线程的库函数为: Int pthread_creat(pthread_t *THREAD, Pthread_attr_t *ATTR, Void *(*START_ROUTINE) (void*), Void *ARG) pthread_creat(tid,NULL,func,arg); 其中第一个参数是pthread_t型的指针,用于保存线程id;第二个参数是pthread_attr_t的指针,用于说明要创建的线程的属性,NULL表示使用缺省参数;第三个参数指明了线程的入口,是一个只有一个(void *)参数的函数;第四个参数是传给线程入口函数的参数。 四.设计过程(设计思想、代码实现) (1)实时任务用task数据结构描述,设计四个函数: Select_proc()用于实现调度算法,被选中任务执行proc(),在没有可执行任务时执行idle(),主函数main()初始化相关数据,创建实时任务并对任务进行调度。 (2)为模拟调度算法,给每个线程设置一个等待锁,暂不执行的任务等待在相应的锁变量上。主线程按调度算法唤醒一个子线程,被选中线程执行一个时间单位,然后将控制权交给主线程判断是否需要重新调度。 (3)实验代码 #include\ #include\ #include\ #include\ #include\ #include\ typedef struct{ ask_id,& tasks[i].ci,& tasks[i].ti); tasks[i].ci_left=tasks[i].ci; tasks[i].ti_left=tasks[i].ti; tasks[i].flag=2; tasks[i].arg=i; tasks[i].call_num=1; sum=sum+(float)tasks[i].ci / (float)tasks[i].ti; while((c=getchar())!='\\n'&&c!=EOF); h, NULL, (void*)proc, &tasks[i].arg); for(i=0;i
题目二:处理机调度—实时调度算法EDF和



