吉林大学操作系统上机(实验二:处理机调度——实时调度算法EDF和RMS)

news/2024/12/21 17:55:09/

吉林大学操作系统上机(实验三:存储管理——动态不等 长存储资源分配算法)

每做一个实验都不禁感叹奇妙非常,以下仅为学习记录,不足出错欢迎指出

实验二 处理机调度——实时调度算法EDF和RMS

实验目的

深入理解处理机调度算法,了解硬实时概念,掌握周期性实时任务调度算法EDF(Earliest Deadline First)和RMS(Rate Monotonic Scheduling)的可调度条件,并能在可调度情况下给出具体调度结果。

实验内容

在Linux环境中采用用户级线程模拟实现EDF和RMS两种实时调度算法。给定一组实时任务,按照EDF算法和RMS算法分别判断是否可调度,在可调度的情况下,创建一组用户级线程,分别代表各个实时任务,并按算法确定的调度次序安排各个线程运行,运行时在终端上画出其Gantt图。为避免图形绘制冲淡算法,Gantt图可用字符表示。

实验准备

  • EDF算法和RMS算法的可调度条件及调度原则。
  • 在Linux环境中创建用户级线程的函数。

EDF算法和RMS的可调度条件及调度原则

  • EDF(Earliest Deadline First)为可抢先式调度算法,其调度条件为sum(Ci/Ti)≤1;
    该算法是根据任务的开始截止时间来确定任务的优先级。截止时间愈早,其优先级愈高。 该算法要求在系统中保持一个实时任务就绪队列,具有最早截止时间的任务排在队列的最前面。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。最早截止时间优先算法既可用于抢占式调度,也可用于非抢占式调度方式中。

  • RMS算法为不可抢先调度算法,其调度条件为sum(Ci/Ti)≤n(exp(ln(2)/n)-1)。任务按单调速率优先级分配(RMPA)的调度算法,称为单调速率调度(RMS)。RMPA是指任务的优先级按任务周期T来分配。它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级,周期长的任务优先级低。

在Linux环境中创建用户级线程的函数

创建用户级线程的库函数为:

int pthread_create (pthread_t *THREAD,pthread_attr_t * ATTR,void * (*START_ROUTINE)(void *),void * ARG)
pthread_create(tid,NULL,func,arg)

其中:

  • 第一个参数是pthread_t型的指针,用于保存线程id;
  • 第二个参数是pthread_attr_t型的指针,用于说明要创建的线程的属性,NULL表示使用缺省属性;
  • 第三个参数void * (*START_ROUTINE)(void *)指明了线程的入口,是一个只有一个(void *)参数的函数;
  • 第四个参数 void * ARG是传给线程入口函数的参数。

实验设计

实时任务用task数据结构描述,设计四个函数:select_proc()用于实现调度算法,被选中任务执行proc(),在没有可执行任务时执行idle(),主函数mian()初始化相关数据,创建实时任务并对任务进行调度。
为模拟调度算法,给每个线程设置一个等待锁,暂不运行的任务等待在相应的锁变量上。主线程按调度算法唤醒一个子线程,被选中线程执行一个时间单位,然后将控制权交给主线程判断是否需要重新调度。

实验代码

#include "math.h"
#include "sched.h"
#include "pthread.h"
#include "stdlib.h"
#include "semaphore.h" 
#include "stdio.h"
#include <unistd.h>
typedef struct{  //实时任务描述char task_id;int call_num;  //任务发生次数int 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 RMS
int curr_proc=-1;
int demo_time = 100;  //演示时间
task* tasks;
pthread_mutex_t proc_wait[100];
pthread_mutex_t main_wait, idle_wait;
float sum=0;
pthread_t idle_proc;
int main(int argc,char** argv)
{   pthread_mutex_init(&main_wait,NULL);pthread_mutex_lock(&main_wait);  //下次执行lock等待pthread_mutex_init(&idle_wait,NULL);pthread_mutex_lock(&idle_wait);  //下次执行lock等待printf("Please input number of real time tasks:\n");scanf("%d",&task_num);tasks = (task*)malloc(task_num*sizeof(task));int i;
for(i=0;i<task_num;i++)
{pthread_mutex_init(&proc_wait[i],NULL);pthread_mutex_lock(&proc_wait[i]);}
for(i=0;i<task_num;i++)
{printf("Please input task id, followed by Ci and Ti:\n");getchar();scanf("%c,%d,%d,",&tasks[i].task_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; }printf("Please input algorithm, 1 for EDF, 2 for RMS:");getchar();scanf("%d",&alg);printf("Please input demo time:");scanf("%d",&demo_time);double r=1;  //EDF算法if(alg==2){  //RMS算法r=((double)task_num)*(exp(log(2)/(double)task_num)-1);printf("r is %lf\n",r);}if(sum>r){  //不可调度printf("(sum=%lf > r=%lf) ,not schedulable!\n",sum,r);exit(2);}pthread_create(&idle_proc,NULL,(void*)idle,NULL); //创建闲逛线程for(i=0;i<task_num;i++)  //创建实时任务线程pthread_create(&tasks[i].th,NULL,(void*)proc,&tasks[i].arg);for(i=0;i<demo_time;i++){int j; if((curr_proc=select_proc(alg))!=-1){  //按调度算法选线程pthread_mutex_unlock(&proc_wait[curr_proc]);  //唤醒pthread_mutex_lock(&main_wait);  //主线程等待}else{   //无可运行任务,选择闲逛线程pthread_mutex_unlock(&idle_wait);  pthread_mutex_lock(&main_wait);}for(j=0;j<task_num;j++){  //Ti--,为0时开始下一周期if(--tasks[j].ti_left==0){tasks[j].ti_left=tasks[j].ti;tasks[j].ci_left=tasks[j].ci;pthread_create(&tasks[j].th,NULL,(void*)proc,&tasks[j].arg);tasks[j].flag=2;}}}printf("\n");sleep(10); 
};void proc(int* args)
{while(tasks[*args].ci_left>0){pthread_mutex_lock(&proc_wait[*args]);  //等待被调度if(idle_num!=0)
{printf("idle(%d)",idle_num);
idle_num=0;}printf("%c%d",tasks[*args].task_id,tasks[*args].call_num);tasks[*args].ci_left--;  //执行一个时间单位if(tasks[*args].ci_left==0){printf("(%d)",tasks[*args].ci);tasks[*args].flag=0;tasks[*args].call_num++;}pthread_mutex_unlock(&main_wait); //唤醒主线程}
};
void* idle()
{while(1){pthread_mutex_lock(&idle_wait);  //等待被调度printf("->");  //空耗一个时间单位idle_num++;pthread_mutex_unlock(&main_wait);  //唤醒主控线程}
};
int select_proc(int alg)
{int j;int temp1,temp2;temp1=10000;temp2=-1;if((alg==2)&&(curr_proc!=-1)&&(tasks[curr_proc].flag!=0))return curr_proc; for(j=0;j<task_num;j++){if(tasks[j].flag==2){switch(alg){case 1:    //EDF算法if(temp1>tasks[j].ti_left){temp1=tasks[j].ti_left;temp2=j;}case 2:    //RMS算法if(temp1>tasks[j].ti){temp1=tasks[j].ti;temp2=j;}}}}return temp2;
}

输出:

在这里插入图片描述
输出中,上方为EDF算法,下方为RMS算法,值得注意的就是 gcc -pthread code_9.c -lm -o 09(验证的时候代码一致不给过好像就是这个-lm)参考博客:显式链接

思考题

  • 上述参考算法中,被选中任务每运行一个时间单位即将控制权交给主线程,判断是否需要切换实时任务,这可看作发生一次时钟中断。实际上时钟中断的发生频率远没有这样频繁,因而上述调度会产生较大的开销。改进上述算法,使其只在需要重新调度任务时才返回主控线程。
  • 在上述改进的基础上,对一组可调度实时事务,统计对不同调度算法的线程切换次数(不计主线程切换),并将其显示出来

我不会,挖坑挖坑,下周就要交实验报告了嗷嗷嗷嗷!


http://www.ppmy.cn/news/379607.html

相关文章

《操作系统》速成

选择填空&#xff1a; 第一章:操作系统引论 第五章:输入输出管理 会涉及到大题&#xff1a; 第二章:进程调度算法大题 Pv操作比较难可能不考★银行家算法大题必考★几种典型的进程调度算法 第三章:内存管理 页/面地址计算或者非连续分配管理方式★页面置换算法 第四章:…

计算机操作系统知识点总结(有这一篇就够了!!!)

一、操作系统概述 1.1 操作系统的定义与目标 定义&#xff1a;操作系统是控制管理计算机系统的硬软件&#xff0c;分配调度资源的系统软件。 目标&#xff1a;方便性&#xff0c;有效性&#xff08;提高系统资源的利用率、提高系统的吞吐量&#xff09;&#xff0c;可扩充性…

《王道操作系统》学习笔记总目录+思维导图

本篇文章是对《2021王道操作系统》所有知识点的笔记总结归档&#xff0c;虽说是2021年的&#xff0c;但是这些都是最核心的底层基础知识&#xff0c;过多少年都不会有很大的变化&#xff0c;核心都差不多。 我的武功秘籍&#xff1a;note.bithachi.cn&#xff0c;希望可以一起…

CAD绘制三维图形基础

绘制三维图形的基础操作包括&#xff1a; 1、打开3d绘图窗口&#xff0c;进入3d绘图界面 2、改变绘图视角 3、改变图形的展现形式 4、绘制基本的几何图形 5、掌握对齐等修改功能 6、掌握基础布尔操作 首先是切换工作空间&#xff0c;在界面的右下角有一个类似设置的按钮…

如何压缩MP4视频

标题&#xff1a;如何压缩MP4视频&#xff08;格式工厂 链接&#xff1a;https://jingyan.baidu.com/article/14bd256e68194abb6d261228.html

FFmpeg压缩MP4视频

有的视频&#xff0c;如一些视频学习教程通常画面都是不大变化的&#xff0c;和变动速度快的打斗视频所需要的帧数完全不同&#xff0c;音质也不需要很高。可以降低fps和音频码率的方法大大压缩文件大小&#xff0c;而清晰度不变&#xff01; 通常转成.mp4&#xff0c;采用H.2…

mp4压缩视频不改变画质?怎么压缩视频大小不改变清晰度?

经常有朋友问我手机录的视频太大了怎么压缩&#xff0c;我也找了很多软件&#xff0c;但是都不怎么样好用&#xff0c;小编今天给小伙伴们介绍一个简单的方法视频压缩软件&#xff0c;我在这里介绍一个简单的方法来压缩视频体积&#xff1a; 1:你设置输出格式时是不是选了格式如…

mp4压缩不改变画质怎么做?压缩视频大小的办法

mp4压缩不改变画质怎么做&#xff1f;我们在日常生活中总是会下载很多好看的视频文件。但是很多时候下载的视频文件画质过高&#xff0c;可能会导致是视频文件播放不畅。这个时候我们就需要在保证视频质量的前提下尽量压缩视频的大小。这里小编就来给大家介绍mp4压缩的简单办法…